web-dev-qa-db-ja.com

ループを使用して親ページの下にすべてのレベルのサブページを表示する途中で

Wp_list_pagesのようなリストタグの代わりにループを必要とするのは、関連するあらゆる情報を表示できるようにするためです。 WPテンプレートタグと関数を使用しているページで。これは、ショーケーススタイルの表示用で、階層的なコンテンツを持ち、並べ替えられるため、この使用法についてはpages> postsをご覧ください。

現在のページの子を表示するためのループと孫を表示するための内側のループを取得することまで可能ですが、これは単なる強引なプロトタイプであり、次のレベルに進む必要があります。

必要なのは、post_parentで始まる1つのループを使用して(子ページが表示されるように)、検出された各子ページに投稿IDを変更する関数を挿入することです。それから1レベルバックアウトし、次に利用可能なIDなどに行きます。

私の問題は、それを実現するにはWPプログラマ(または実際のプログラマ)では十分ではないということです。それがすべてコードの中に入っていれば私はそれを解決することができますが、WPは明らかにhave_postとthe_postで隠された関数を使って利用可能な投稿IDを調べます必要なものを統合します。

これが私が今いるところです。任意の助けは大歓迎です!

<?php   
$args = array(
'posts_per_page' => -1,
'post_parent' => $post->ID,
'post_type' => 'page',
'post_status' => '',
'orderby' => 'title',
'order' => 'ASC',);

query_posts($args); ?>

<?php if(have_posts()) : while (have_posts()) : the_post(); ?>

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php     $inner_query = new WP_Query("post_type=page&posts_per_page=-1&post_parent={$id}&order_by=title&order=ASC"); ?>

<?php while ($inner_query->have_posts()) : $inner_query->the_post(); ?>

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php endwhile; // end inner loop ?>
<?php endwhile; //end outer loop ?>     
<?php endif; // end outer if have_posts?>
4
dains

再帰的な関数、すなわち自分自身を呼び出す関数を探しているように思えます。これがどのように行うことができるかの大まかな概要は以下のとおりです。

function wpse13669_show_all_children( $post_id, $current_level ) {
    $children = get_posts( array(
        'post_type' =>'page',
        'posts_per_page' =>-1,
        'post_parent' => $post_id,
        'order_by' => 'title',
        'order' => 'ASC' ) );
    if ( empty($children) ) return;

    echo '<ul class="children level-'.$current_level.'-children">';

    foreach ($children as $child) {

        /* Here would be the point where you
            do whatever you want to display the 
            posts. The variable $current_level can
            be used if you want to style different 
            levels in the hierarchy differently */

            echo '<li>';

        echo '<a href="'.get_permalink($child->ID).'">';
        echo apply_filters( 'the_title', $child->post_title );
        echo '</a>';

        // now call the same function for child of this child
        wpse13669_show_all_children( $child->ID, $current_level+1 );

            echo '</li>';

        }

    echo '</ul>';

    }

注:ネストされた<ul>リストの種類を表示するようにコードを編集しました。WordPressが内部的にこのような処理を行う方法を知りたい場合(これよりもはるかに複雑ですが、理解する価値があります。あなたのコードで本当にカスタムなことをする必要があるならば、あなたはclass-wp-walker.phpfile)のためのソースコードを見る必要があります。 WP全体のメニュー、コメント、ページリストなど

あなたが望む出力構造を使ってその関数を定義し、あなたのループの中からそれを呼び出すだけなら、それはあなたが探していることをするべきです。私はそこに$ current_level変数を入れるだけで、孫とは異なる子供に簡単にスタイルを付けることができます。

(メインループ内)

wpse13669_show_all_children( $post->ID, 1 );
7
goldenapples