web-dev-qa-db-ja.com

子ページをリストするためのループの外側でpost-> IDにアクセスする

現在のページの子ページをテーマのサイドバーに表示したいです。しかし、私のサイドバー(左側)はテンプレートのループの前にあり、post-> IDはループの前であれば何も返しません。

私の現在のコード:

<?php

wp_list_pages('title_li=&child_of='.$post->ID); 

?>

これにアクセスするためにグローバル変数を呼び出すことについて何か読んだことがありますが、これまでのところ運がありませんでした。

任意の助けがいただければ幸いです。

1
rowefx

...ループの前であれば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);
}

これらはほんの一例です。私はあなたの正確な状況が何であるかわかりません。

1
s_ha_dum

これを試して:

// 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>";
}
1
crdunst

のようなコードを作ってみる

global $post;
var_dump($post);//test values in $post
wp_list_pages('title_li=&child_of='.$post->ID);
0
Ravinder Kumar

ここに正確な答えを出すのに十分な情報は本当にありませんが、あなたの疑いが正しければ、$post->IDget_the_ID()に置き換えてみてください。

0
Matthew Boynes