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

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

ただいまの
回答率

88.34%

【Wordpress】通常投稿に親子関係を持たせた上で、更に指定のカテゴリの一覧ページに親+子ワンセットで表示させていきたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,280

NNC

score 15

Wordpressで飲食店のポータルサイトを作成しています。

各大元の店の紹介ページを通常の投稿機能で行い
下記内容をfunctions.phpに記載を行い

function registered_post_hierarchical( $post_type, $post_type_object ) {
  if ( $post_type == 'post' ) {
    $post_type_object->hierarchical = true;
    add_post_type_support( 'post', 'page-attributes' );
  }
}
add_action( 'registered_post_type', 'registered_post_hierarchical', 10, 2 );


△△店や◇◇店と言った風に更にその各店舗を子ページとして投稿できるようにしてはおりますが

固定ページで作成している一覧ページに特定のカテゴリのみを表示し、
各親ページの下に子ページを表示させる方法が見つからず苦戦しております。

イメージと致しましては

■ストア1(親ページ)
├─△△店(子ページ)
├─◇◇店(子ページ)
└─☆☆店(子ページ)

■ストア2(親ページ)
├─▲▲店(子ページ)
├─◆◆店(子ページ)
└─★★店(子ページ)

という風に親ページとその子ページをワンセットで表示させていけるようにしたいと思っております。
※小ページ部分にはアイキャッチとAdvanced Custom Fieldsで追加した項目を表示させるようにする予定です。

<?php
  $arg = array(
             'posts_per_page' => -1,
             'orderby' => 'date',
             'order' => 'DESC',
             'category_name' => 'tokyo' // 仮で東京と言うカテゴリに設定してある投稿のみ表示させております。
         );
  $posts = get_posts( $arg );
  if( $posts ): ?>
  <?php
      foreach ( $posts as $post ) :
        setup_postdata( $post ); ?>
      <li>
      <a href="<?php the_permalink(); ?>">
    <?php if ( has_post_thumbnail() ): ?>
    <?php the_post_thumbnail( 'thumbnail' ); // 親ページのアイキャッチ ?>
    <?php else: ?>
    <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
    <?php endif; ?>
    </a>
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>

      <dl class="shop">
      <!-- ↓↓ここに親ページに含まれている子ページを一覧で出して行きたい -->
      <dt>
      <a href="<?php the_permalink(); ?>">
    <?php if ( has_post_thumbnail() ): ?>
    <?php the_post_thumbnail( 'thumbnail' ); // 子ページのアイキャッチ ?>
    <?php else: ?>
    <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
    <?php endif; ?>
    </a>
      子ページの店舗名
      </dt>
      <dd><?php the_field('shop_address'); // Advanced Custom Fieldsで追加した項目 ?></dd>
      <dd><?php the_field('shop_tell'); // Advanced Custom Fieldsで追加した項目 ?></dd>
      <dd><?php the_field('shop_open'); // Advanced Custom Fieldsで追加した項目 ?></dd>
      </dl>
      <?php endforeach; ?>
<?php
  endif;
  wp_reset_postdata();
?>


上記は謝っている記述である事は承知の上ですが、
やりたい事をお伝えさせて頂くご説明用として解釈して頂ければ幸いです。

上記内において
<!-- ↓↓ここに親ページに含まれる子ページを一覧で出して行きたい -->
の下からの方法が見つからない状態で御座います。

ご説明が上手く伝わっているか不安な所では御座いますが、伝わらないようでしたら、お申し出ください。

ぜひ、お知恵をお貸し頂ければ幸いです。
どうぞ宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

wp_list_filter 関数で親ページ、子ページをそれぞれ取得すれば可能だと思います。

<?php

$args = array(
    'orderby'        => 'date',
    'order'          => 'DESC',
    'category_name'  => 'tokyo',
    'posts_per_page' => -1,
);

$stores = get_posts( $args );

if ( $stores ) {
    $parents = wp_list_filter( $stores, array( 'post_parent' => 0 ) );

    foreach( $parents as $parent ) {
        setup_postdata( $GLOBALS['post'] =& $parent );
        ?>

        <!-- ここで親ページの情報を出力する. -->

        <?php
        $children = wp_list_filter( $stores, array( 'post_parent' => get_the_ID() ) );

        foreach ( $children as $child ) {
            setup_postdata( $GLOBALS['post'] =& $child );
            ?>

            <!-- ここで子ページの情報を出力する. -->

            <?php
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/08 15:24

    お世話になります。
    ご回答頂きありがとうございます。

    >回答に記載したコメント部分に the_title(); とだけ書いてもエラーになりますか?

    こちらですが、言葉足らずで申し訳ございません。
    the_title();やthe_post_thumbnail( 'thumbnail' );と言ったのみの記載ですと反映はしているのですが

    <a href="<?php the_permalink(); ?>">
    <?php if ( has_post_thumbnail() ): ?>
    <?php the_post_thumbnail( 'thumbnail' ); ?>
    <?php else: ?>
    <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
    <?php endif; ?>
    </a>

    のような、記述ですとエラーになってしまうと言う意味合いになります。

    いわゆる、htmlとの複合記述が反映しないと言う形になるかと存じますが
    そちらを行うとエラーになってしまう為、良い方法御座いましたらご教授頂ければ幸いで御座います。

    キャンセル

  • 2019/07/08 15:43

    (<?php で開始された)PHPのコード内に <a href="..."> などの HTML は記述できません。PHPの初歩的な事柄ですので、PHP の開始タグと終了タグの使用方法について今一度検索等によりご確認ください。回答のコードには終了タグと開始タグを追記しましたので合わせてご確認ください。

    キャンセル

  • 2019/07/08 16:22

    お世話になります。

    >回答のコードには終了タグと開始タグを追記しましたので合わせてご確認ください。
    ご教授頂きありがとうございます。
    調整時にそちらの方法を行っていましたが、
    最後4段目に記述して頂いた<?phpの記述が抜けており
    そちらが原因のようでした。

    無事反映の方、確認致しました。

    この度は、ご回答頂きありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • トップ
  • PHPに関する質問
  • 【Wordpress】通常投稿に親子関係を持たせた上で、更に指定のカテゴリの一覧ページに親+子ワンセットで表示させていきたい。