質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

解決済

カスタム投稿タイプで pre_get_posts 時にページ情報が取得できない

yossii
yossii

総合スコア1

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

1回答

0評価

0クリップ

15閲覧

投稿2018/01/13 02:10

編集2022/01/12 10:58

もともと自作プラグインにて「固定ページ」+「カスタムフィールド」で表示前に処理を行っていました。

pre_get_postsフックで表示前に処理を実行
add_action('pre_get_posts', array($this, 'my_pre_get_posts' ));

php

public function my_pre_get_posts($query){ // 管理画面 or メインクエリーではない or 固定ページのオブジェクトが無い 場合は処理中止 if (is_admin() || ! $query->is_main_query() || empty(get_queried_object()) ) { return; } // 以後、カスタムフィールドの値で処理 }

このようなコードで問題なく処理が出来ていました。

その後「カスタム投稿タイプ」というのが使えることを知り、コードを調整しました。

自作プラグインのコンストラクタでカスタム投稿タイプを追加
register_post_type( 'custom-page', $args);

しかし、上記の get_queried_object() でオブジェクトが取得できなくなってしまいました。
そのため以後の処理コードを実行することが出来ません。


$query の中身を下記ページで比較してみました。

・固定ページ queried_object 有り
・カスタム投稿ページ queried_object 無し
・存在しないページ queried_object 無し

$queryの出力を比較してみたところ「存在しないページ」と同じようになっています。
しかし、最終的にはページはちゃんと表示されています。

実際のカスタム投稿の$query内容がこちらです。

php

WP_Query Object ( [query] => Array ( [page] => [custom-page] => parent/children [post_type] => custom-page [name] => parent/children ) [query_vars] => Array ( [page] => [custom-page] => parent/children [post_type] => custom-page [name] => parent/children [error] => [m] => [p] => 0 [post_parent] => [subpost] => [subpost_id] => [attachment] => [attachment_id] => 0 [static] => [pagename] => [page_id] => 0 [second] => [minute] => [hour] => [day] => 0 [monthnum] => 0 [year] => 0 [w] => 0 [category_name] => [tag] => [cat] => [tag_id] => [author] => [author_name] => [feed] => [tb] => [paged] => 0 [meta_key] => [meta_value] => [preview] => [s] => [sentence] => [title] => [fields] => [menu_order] => [embed] => [category__in] => Array ( ) [category__not_in] => Array ( ) [category__and] => Array ( ) [post__in] => Array ( ) [post__not_in] => Array ( ) [post_name__in] => Array ( ) [tag__in] => Array ( ) [tag__not_in] => Array ( ) [tag__and] => Array ( ) [tag_slug__in] => Array ( ) [tag_slug__and] => Array ( ) [post_parent__in] => Array ( ) [post_parent__not_in] => Array ( ) [author__in] => Array ( ) [author__not_in] => Array ( ) ) [tax_query] => [meta_query] => [date_query] => [post_count] => 0 [current_post] => -1 [in_the_loop] => [comment_count] => 0 [current_comment] => -1 [found_posts] => 0 [max_num_pages] => 0 [max_num_comment_pages] => 0 [is_single] => 1 [is_preview] => [is_page] => [is_archive] => [is_date] => [is_year] => [is_month] => [is_day] => [is_time] => [is_author] => [is_category] => [is_tag] => [is_tax] => [is_search] => [is_feed] => [is_comment_feed] => [is_trackback] => [is_home] => [is_404] => [is_embed] => [is_paged] => [is_admin] => [is_attachment] => [is_singular] => 1 [is_robots] => [is_posts_page] => [is_post_type_archive] => [query_vars_hash:WP_Query:private] => f0da19eaf2b3e3204ad56b687e2b4ecc [query_vars_changed:WP_Query:private] => [thumbnails_cached] => [stopwords:WP_Query:private] => [compat_fields:WP_Query:private] => Array ( [0] => query_vars_hash [1] => query_vars_changed ) [compat_methods:WP_Query:private] => Array ( [0] => init_query_flags [1] => parse_tax_query ) )

今のところ、ページを特定できそうな情報としては get_query_var('name') だけのように思えます。
子ページを持っている場合は、「親ページ/子ページ」の値が格納されています。

get_queried_object() のように表示しようとしているページのデータを取得するにはどのような方法があるでしょうか?

【追記】
get_page_by_path() で name からページ情報が取得できるようだったので、コードを次のようにしてテストしました。
しかし残念ながら、何も表示されません。

php

public function my_pre_get_posts($query){ print_r( get_page_by_path(get_query_var('name')),get_query_var('post_type') );

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。