現在のページの子ページをテーマのサイドバーに表示したいです。しかし、私のサイドバー(左側)はテンプレートのループの前にあり、post-> IDはループの前であれば何も返しません。
私の現在のコード:
<?php
wp_list_pages('title_li=&child_of='.$post->ID);
?>
これにアクセスするためにグローバル変数を呼び出すことについて何か読んだことがありますが、これまでのところ運がありませんでした。
任意の助けがいただければ幸いです。
...ループの前であればpost-> IDは何も返しません
一般的に言って、これは誤りです。 $post
変数は、ループがテーマ内で開始されるかなり前に、ほとんどのページで設定されています。メインクエリは、その変数をループの最初の投稿に「プライム」します。それでも、ループの外側のこの変数に依存するのが最も信頼できるアプローチではありません。もっと信頼できます、 get_queried_object
を使うことになるでしょう。
$qobj = get_queried_object();
wp_list_pages('title_li=&child_of='.$qobj->ID);
get_queried_object
は現在表示しているページによって異なる情報を返すため、使用する前にページタイプを確認することをお勧めします。
if (is_page()) {
$qobj = get_queried_object();
wp_list_pages('title_li=&child_of='.$qobj->ID);
}
またはオブジェクト自体を確認してください。
$qobj = get_queried_object();
if (isset($qobj->post_type) && 'page' == $qobj->post_type) {
wp_list_pages('title_li=&child_of='.$qobj->ID);
}
これらはほんの一例です。私はあなたの正確な状況が何であるかわかりません。
これを試して:
// get the post id
$post_id = get_queried_object_id();
// get the children
$children = get_pages('child_of' => $post_id);
//output them
if( count( $children ) != 0 ) {
echo "<ul>";
foreach ($children as $child) {
// if we only want children, not grandchildren
if ($child->post_parent == $post_id) {
echo "<li><a href=\"" . get_permalink($child->ID) . "\">";
echo $child->post_title;
echo "</a></li>";
}
}
echo "</ul>";
}
のようなコードを作ってみる
global $post;
var_dump($post);//test values in $post
wp_list_pages('title_li=&child_of='.$post->ID);
ここに正確な答えを出すのに十分な情報は本当にありませんが、あなたの疑いが正しければ、$post->ID
をget_the_ID()
に置き換えてみてください。