サポート » 使い方全般 » 同じ親ページに属する子ページのタイトルやカスタムフィールドを表示

  • 解決済 yukki

    (@yukki)


    お世話になります。
    タイトルにありますように、親ページに属した子ページのタイトル、カスタムフィールドを取得し、
    各子ページに表示する方法で悩んでいます。

    例は以下のような感じです。

    ID 10(親ページ)
      |- ID 20(ID 10に属する子ページ)
      |- ID 30(ID 10に属する子ページ)
      |- ID 40(ID 10に属する子ページ)

    ID 10を親としたID 20-40の子ページに、それぞれ 「キー:example」 「値:各ページ個別設定」 という
    カスタムフィールドを設定し、ID 20-40のページに以下のようなリスト表示をしたいのです。

    ID 20のexampleの値とID 20のページタイトルをリンク表示
    ID 30のexampleの値とID 30のページタイトルをリンク表示
    ID 40のexampleの値とID 40のページタイトルをリンク表示

    更にこれらを5件のみランダム表示させたいと思っています。
    わかりづらかったらすいません。

    こちらこちら、更にこちらなどを参考に色々と試して、タイトルと各ページへのリンクは何とか表示できたのですが、カスタムフィールドだけ、表示しているページの値しか取得することができなく、
    こちらに質問させて頂きました。

    PHPやデータベースの知識はありません。
    なにぶん初心者なもので知識が乏しいですが、お力をお貸し頂ければ助かります。
    宜しくお願いします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター jim912

    (@jim912)

    yukkiさん、こんにちは。

    タイトルとリンクが出力できているのであれば、カスタムフィールドを取得するためのデータは揃っているはずです。

    表示しているページの値になってしまっているのは、get_post_metaの第1引数が子ページのIDではなく、表示中のページのIDになってしまっているからでしょう。
    おそらくそれを変えるだけで直るものと思います。

    問題がなければ、お書きになったコードを見せていただけるとアドバイスしやすいのですが。

    トピック投稿者 yukki

    (@yukki)

    jim912さん、こんにちは。
    返信ありがとうございます。

    コードですが、jim912さんがこちらで書かれていたものを参考にさせて頂きました。

    <?php
    if ( in_array( $post->ID, array(ID20,ID30,ID40) ) ) {
    	$child_posts = get_posts( 'numberposts=5&order=ASC&orderby=post_title&post_type=page&post_parent=ID10' );
    	if ( $child_posts ) {
    		foreach ( $child_posts as $child ) {
    			$c_pagelink = get_page_uri( $child->ID );
    			$c_title = apply_filters( 'the_title', $child->post_title );
    			$c_example = get_post_meta($post->ID,example, true);
    ?>
    <li><?php echo $c_example; ?><a href="<?php echo $c_pagelink; ?>"><?php echo $c_title; ?></a></li>
    <?php
    		}
    	}
    }
    ?>

    上記の<?php echo $c_example; ?>という箇所に、それぞれの子ページで設定した「キー:example」 の値を表示させたいです。

    また、上記コードでは、親ページと子ページのIDをそれぞれ指定して出力しているのだと思いますが、親ページに属する全ての子ページの情報を取得する場合、親ページのIDだけを指定して出力させることはできますでしょうか。ページへの表示数は、numberpostsでコントロールするという感じです。

    更にランダム表示もしたいと書いたのですが、get_postsで取得しているのでorderbyでのrand指定はできませんでした。
    こちらは色々と難しいのであれば諦めますが、多少の変更で可能であれば併せてお教え頂けると助かります。

    もうひとつ(すいません)、確認してみて気づいたのですが、出力されるリンク構造が http://example.com/ID10/ID10/ID20 という風に、親ページ(ID10)が一階層余計に入ってしまいます。
    リンク自体は問題なく機能するのですが、修正することは可能でしょうか。

    だらだらとわかりにくい説明で大変申し訳ありませんが、何卒宜しくお願い致します。

    モデレーター jim912

    (@jim912)

    yukkiさん、こんにちは。

    上記の<?php echo $c_example; ?>という箇所に、それぞれの子ページで設定した「キー:example」 の値を表示させたいです。

    $c_example = get_post_meta( $child->ID,example, true);

    で表示できるはずです。

    上記コードでは、親ページと子ページのIDをそれぞれ指定して出力しているのだと思いますが、親ページに属する全ての子ページの情報を取得する場合、親ページのIDだけを指定して出力させることはできますでしょうか。

    ID10の子ページのみで表示させたいのであれば、最初の分岐が

    if ( $post->post_parent == ID10 ) ) ) {

    となります。全ての子ページで自分の親ページに属する子ページのリストを表示させる場合は若干異なりますが。

    更にランダム表示もしたいと書いたのですが、get_postsで取得しているのでorderbyでのrand指定はできませんでした。

    get_postsは基本的にquery_postsと同じパラメータ指定が可能です。randでも有効になるのではと思いますがダメでしたか?

    もうひとつ(すいません)、確認してみて気づいたのですが、出力されるリンク構造が http://example.com/ID10/ID10/ID20 という風に、親ページ(ID10)が一階層余計に入ってしまいます。
    リンク自体は問題なく機能するのですが、修正することは可能でしょうか。

    これは少々わかりかねますが、wp_list_pagesなどでの出力はID10は1つのみですか?また、ID10を1つ削ってアクセスした場合でもID20のページが表示されますか?

    それから、カスタムフィールドのキーがexampleと特定されていますので、get_postsのパラメータにmeta_key=exampleを追加したほうが堅いですね。

    トピック投稿者 yukki

    (@yukki)

    jim912さん、こんばんは。
    返信ありがとうございました。

    以下のコードで同じ親ページに属する子ページのカスタムフィールド取得と、
    リストのランダム表示ができるようになりました!

    <?php
    if ( $post->post_parent == ID10) {
    	$child_posts = get_posts( 'numberposts=5&order=ASC&orderby=rand&post_type=page&meta_key=example' );
    	if ( $child_posts ) {
    		foreach ( $child_posts as $child ) {
    			$c_pagelink = get_page_uri( $child->ID );
    			$c_title = apply_filters( 'the_title', $child->post_title );
    			$c_example = get_post_meta( $child->ID, example, true );
    ?>
    <li><?php echo $c_example; ?><a href="<?php echo $c_pagelink; ?>"><?php echo $c_title; ?></a></li>
    <?php
    		}
    	}
    }
    ?>

    ID10の子ページのみで表示させたいのであれば、最初の分岐が
    if ( $post->post_parent == ID10 ) ) ) {
    となります。全ての子ページで自分の親ページに属する子ページのリストを表示させる場合は若干異なりますが。

    条件分岐で各ページに表示しようと思っていたのですが、もしご面倒でなければ 『全ての子ページで自分の親ページに属する子ページのリストを表示させる』 という方法も教えて頂けないでしょうか。宜しくお願いします。

    リンク階層の部分については同じ現象が続いております。

    これは少々わかりかねますが、wp_list_pagesなどでの出力はID10は1つのみですか?また、ID10を1つ削ってアクセスした場合でもID20のページが表示されますか?

    はい、テンプレートタグで出力している部分は正常に表示されています。
    更に確認したのですが、親ID10に属するID20に表示されたID30へのリンクをステータスバーで確認すると、http://example.com/ID10/ID20/ID10/ID30 という階層で表示されます。
    ただ、URLをコピペして、間のID10やID20を削ってアクセスしても、正常なURL(http://example.com/ID10/ID30) にきちんとアクセスはできます。

    これはいったいなんなのでしょう・・・?

    モデレーター jim912

    (@jim912)

    yukkiさん、こんにちは。

    『全ての子ページで自分の親ページに属する子ページのリストを表示させる』 という方法も教えて頂けないでしょうか。宜しくお願いします。

    下記でいけると思います。

    if ( count( $post->ancestors ) == 1 ) {
    	$child_posts = get_posts( 'numberposts=5&order=ASC&orderby=rand&post_type=page&meta_key=example&post_parent=' . $post->post_parent );

    ※ 子ページでのみ出力されます。孫ページなどでは実行されません。

    リンク階層の部分については同じ現象が続いております。

    よく見たら、リンク文字列を生成する関数が違っていました。
    get_page_uriではなく、get_page_linkを使わないとだめですね。紛らわしいので見逃してしまっていました。

    トピック投稿者 yukki

    (@yukki)

    jim912さん、こんにちは。
    丁寧に教えて頂いたお陰で、全て希望通りの動作を確認することができました。

    説明が下手で紛らわしい箇所が多々あり申し訳ありませんでした。
    症状を詳しく説明するのにも、ある程度の知識がないと苦労しますね。
    WordPressの基本的な使い方に関してはある程度わかっていたつもりですが、この機会にもう少し深く勉強してみようと改めて思いました。

    この度は最後まで丁寧にご指導頂き、本当にありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「同じ親ページに属する子ページのタイトルやカスタムフィールドを表示」には新たに返信することはできません。