見出し画像

【WordPress】トップページから特定の親を持つ子ページ一覧を表示する方法

想定している状況としては、「front-page.php(トップページ)に『A』という親を持つ子ページ一覧を表示させたい」という状況です。

早速コードを書いていきます。


まずは前半です。

//<front-page.php
<?php
$shop_obj = get_page_by_path( 'A' );
$post = $shop_obj;
setup_postdata( $post );
?>
    
    <h2><?php the_title(); ?></h2>
    <p><?php echo get_excerpt(); ?></p>

<?php wp_reset_postdata(); ?>

ここまでで、「A」という親ページのタイトルと抜粋文の表示ができました。


$shop_obj = get_page_by_path( 'A' );

→引数に固定ページのスラッグ(固有のURL)を指定することで、そのページのオブジェクトを取得できます。

get_page_by_path('A')としたので、Aという固定ページのオブジェクトをこれで取得できました。このオブジェクトが入った$shop_objを、さらに$postという変数に入れておきます。


setup_postdata( $post );
wp_reset_postdata();​

→setup_post( $post )とすることで、引数の投稿情報をセットし、wp_reset_postdata()の間でセットした投稿情報をもとにテンプレートタグを実行しています。

setup_post()はサブクエリでの処理なので、メインクエリに戻すときwp_reset_postdata()を記述する必要があります。


 <h2><?php the_title(); ?></h2>
 <p><?php echo get_excerpt(); ?></p>

→setup_postdata( $post )でセットされた投稿の情報をもとに、タイトルと抜粋文の中身を表示しています。

ここでは、「$post」つまり、固定ページ「A」のタイトルと抜粋文を表示しています。


さて、ここから、「A」の子ページ一覧を取得して表示します。

まずは子ページ取得の関数、名前を「get_child_pages」として、function.phpに作成していきます。

//function.php
//子ページ一覧の抽出

function get_child_pages( $number = -1, $parent_id = null ) {
    array(
        'posts_per_page' => $number,
        'post_type' => 'page,
        'orderby' => 'menu_order',
        'post_parent' => $parent_id,
);

$child_pages = new WP_Query( $args );
return $child_pages;
}

簡単に一行づつコードを見ていきましょう。


'posts_per_page' => $number,

→「何件のデータを取得するか」を指定しています。ここでは、$numberに「−1」が当てられている為、これは全件取得するという意味になります。


'post_type' => 'page,

→取得する投稿タイプを指定しています。

「page」は、「固定ページ」を表しています。


'orderby' => 'menu_order',

→データの並び順を指定しています。ここでは、WordPress管理画面にて指定した並び順に従うという記述をしています。


'post_parent' => $parent_id,

→どの親ページを参照するか?を指定しています。ここでは「$parent_id」として、引数で受け取った親ページのIDを渡しています。

この後、front_page_.php(トップページ)で、この関数を呼び出す際に参照したい親ページのID情報を引数として割り当てれば、良いわけです。


$child_pages = new WP_Query( $args );

→WP_Queryを使えば、引数に指定したデータを取得してくることができます。ここでは引数に先ほど作成した「$args」が指定してありますので、特定の親に属する子ページを、取得することができます。


return $child_pages;

→最後に、それらの処理を変数に入れ、returnで返しています。



では、front_page.phpを編集して、子ページ一覧の表示を完成させていきましょう。


//front_page.php

<?php
$child_page = get_child_page();
if( $child_page->have_posts() ):
    while( $child_page->have_posts() ): $child_page->the_post();
?>

    <a href"<?php the_permalink(); ?>
    <div><?php the_post_thumbnail(); ?>
    <p><?php the_title(); ?>

<?php
    endwhile;
endif;
?>

これで、トップページにて子ページ一覧の表示が完成しました。

それぞれのページには、クリックすると飛べるようにリンクが割り振られています。


$child_page = get_child_page();

→先ほど「function.php」に作った子ページを取得する関数を呼び出して、変数に入れています。


if( $child_page->have_posts() ):
    while( $child_page->have_posts() ): $child_page->the_post();

→「have_posts()」で、処理すべき記事があるかどうか判断しています。どこを見て判断しているかというと、「the_post()」の値を見て判断しています。「the_post()」では、投稿等の情報を取ってきてセットしています。

トップページにてそのまま「have_posts()」などとしてしまうと、トップページの投稿の情報を参照してしまう為、「$child_page->have_posts()」このように記述して、どこからデータを取ってきてセットするか、を定めています。


    <a href"<?php the_permalink(); ?>
    <div><?php the_post_thumbnail(); ?>
    <p><?php the_title(); ?>

→取得した子ページのパーマリンク、サムネイル、タイトルを表示しています。

whille文で繰り返しているので、処理すべき記事が有る限り、ループし続けます。



これで、トップページから特定の親を持つ子ページ一覧を表示することができました。

お疲れ様でした。





この記事が気に入ったらサポートをしてみませんか?