サポート » 使い方全般 » 特定のカスタムフィールドの値を持つ投稿をリスト出力するには

  • 解決済 crysta

    (@crysta)


    Crystaと申します。

    以下のような内容の投稿が何件かあります。

    投稿タイトル:○○○
    所属グループ:グループA

    投稿タイトル:□□□
    所属グループ:グループA

    これらは、以下のように記述しています。

    <?php the_title(); ?>
    <table>
    <tr><th>所属グループ</th><td><?php echo get_post_meta($post->ID,'所属グループ',TRUE); ?></td></tr>
    …他のカスタムフィールド出力設定
    </table>

    他方、あるカテゴリーページでは、その記事内容として「グループメンバー」部分に以下のように出力したいのです。

    投稿タイトル:グループA
    グループメンバー:○○○、□□□⇒(それぞれの記事へリンク)

    投稿タイトルと、別投稿の持つカスタムフィールドの値を照合して、完全一致する値を持つ
    投稿のタイトルをリンクで出力するには、どのようにphpを記述したらよいのでしょうか?

    phpの記述は読み下せますが、一から記述することがまだできないレベルです。
    何から何まで…という感じで大変申し訳ないのですが、よろしくお願いいたします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • 投稿タイトルと、別投稿の持つカスタムフィールドの値を照合して、完全一致する値を持つ
    投稿のタイトルをリンクで出力するには、どのようにphpを記述したらよいのでしょうか?

    PHPだけで記述するにはループをさせなければいけないとなると、そのカテゴリーページを開くたびに全ての記事とマッチングするループさせていたら、記事が増えていく分だけループが増えていくので現実的ではないですね。
    「グループA」という文字がカスタムフィールドにしかないとなると、一番可能性のある方法はSQLを投げて「グループA」の文字があるカスタムフィールドの記事IDを取得して、一覧表示させるループ部分はPHPで記述するとかでしょうか。
    具体的なソースが示せません・・・ごめんなさい:(

    追記です。
    過去にカスタムフィールドの集計に関する投稿がありました。
    http://ja.forums.wordpress.org/topic/630?replies=3
    同じ考え方でfunctions.phpなどでSQLを投げる構文を記述しておいて、一致させたいタイトルを変数で投げてあげれば該当する記事IDだけを配列などで返せるのではないでしょうか。
    SQLはまだまだ勉強中ですので、ソースは識者の方にお願いします;(
    もっと簡単な方法があればいいのですけど・・・

    モデレーター jim912

    (@jim912)

    Crystaさん、こんにちは。

    まずは手順の概要だけ記述しますので、トライされてみてはいかがですか?

    1. その記事の所属グループ名を取得
    2. 所属グループ名が空でなければ、get_postsで同じグループ名の記事を取得
    3. 取得できた記事をforeachでループさせ、get_permalinkで記事のURLを取得し、リンク文字列を生成
    4. 生成されたリンク文字列を「、」で繋いでグループメンバーで出力する文字列を生成
    トピック投稿者 crysta

    (@crysta)

    Crystaです。

    shokun0803さん、jim912さん、早速のご回答をありがとうございます。
    希望動作の記述が少し足りなかったようなので、申し訳ありませんが補足させていただきます。

    シングルページ

    投稿タイトル:○○○
    所属グループ:グループA

    投稿タイトル:□□□
    所属グループ:グループA

    「投稿タイトル」に入力するのは、カテゴリーページの「所属グループ」に表示したい構成メンバー(人名)です。
    他方、カテゴリーページに表示する「投稿タイトル:グループA」の「グループA」にあたる部分は、「グループA」あり「グループB」あり「グループあいうえお」ありと、どんな名前のグループが何件発生するかは投稿する方々しだいの情報で、グループ名やグループ情報の投稿数が固定の情報ではありません(構成メンバーは必ず1名は存在します)。
    また、グループの投稿そのものがなくなってしまうこともありうる、かなり流動的な情報です。

    悩んでいるのは、

    1. カテゴリページに表示する、投稿タイトル:グループA の「グループA」を、ソースの記述内に特定文字列として指定できない
    2. カスタムフィールドの「所属グループ:グループA」の「グループA」も、上記を受け、ソースの記述内に指定できない
    3. 投稿しだいの情報に含まれるそれぞれの値を、どうやってマッチングさせるのか?

    という点です。

    当初はタギングで対応することを考えましたが、せっかくカスタムフィールドに情報を入力しているのに、同じものをタグ登録させるのは二度手間になってしまう…というのを避けたかったのです。

    難しい内容でしょうか…?
    再度、アドバイスをお願いいたします。

    トピック投稿者 crysta

    (@crysta)

    Crystaです。

    処理の流れを私なりに考えてみたのですが、考え方として間違っている部分や足りない部分があればご指摘ください。

    【カテゴリー設定】
    グループ情報一覧のカテゴリーID:50(親カテゴリー)グループ情報の投稿はこちら
    メンバー個別情報のカテゴリーID:51(子カテゴリー)構成メンバーの投稿はこちら

    1. ループの出力条件として、カテゴリーID:50を指定する
    2. ループ開始
    3. カテゴリーID:50の投稿タイトルを取得する
    4. カテゴリーID:51のカスタムフィールド「所属グループ」に入力されている値を取得する
    5. 1.と2.で取得した値をマッチングさせる
    6. カテゴリーID:50の投稿タイトルと完全一致したカスタムフィールドの値を持つカテゴリーID:51のタイトルをリンクでリスト表示する
    7. 完全一致しない値を持つカテゴリーID:51のタイトルは、カテゴリーID:50には表示しない
    8. ループ停止

    基本的なことで恐縮ですが、上記のような処理をするための記述をしておくのがfunction.phpという理解でよいでしょうか?

    よろしくお願いいたします。

    理解力がなくてすみません。相変わらずよく理解できていません。
    なんだかものすごく面倒な設定をされていませんか?

    「投稿タイトル」に入力するのは、カテゴリーページの「所属グループ」に表示したい構成メンバー(人名)です。

    つまり、wordpressの投稿でタイトルに人名を入れて投稿しているということでしょうか。
    これは重複はしていないのですよね?

    他方、カテゴリーページに表示する「投稿タイトル:グループA」の「グループA」にあたる部分は、「グループA」あり「グループB」あり「グループあいうえお」ありと、どんな名前のグループが何件発生するかは投稿する方々しだいの情報で、グループ名やグループ情報の投稿数が固定の情報ではありません(構成メンバーは必ず1名は存在します)。
    また、グループの投稿そのものがなくなってしまうこともありうる、かなり流動的な情報です。

    これも良く分からないのですが、この「グループA」などをカスタムフィールドに投稿者が自由に名前をつけて投稿しているということですか?それともカテゴリ名「グループA」を投稿者が自由にカテゴリを増やしたり消してしまったりして投稿しているということですか?

    wordpressの投稿画面でどこに「人名」が入って、どこに「グループA」などの文字が入って投稿ボタンを押下しているのか具体的に教えていただけませんか・・・

    モデレーター jim912

    (@jim912)

    Crystaさん、こんにちは。

    基本的な所は、間違っていないと思います。

    1,2,8は、テンプレートのループに任せてしまえばよいので、今回実装するロジックには含めなくて良いです。つまりID50のカテゴリーやグループの記事を表示する際に、すでに行われている処理です。

    3は、テンプレートのループ内で$post->post_titleに入っています。

    4,5,6,7については、get_postsのパラメータとして、meta_keyに所属グループ、meta_valueに$post->post_titleを指定すれば、マッチする記事だけを抽出してくれるので、今回記述する部分では気にしなくてよいです。

    以下のコードをカテゴリーもしくは、投稿テンプレートのループ内に追加すると、タイトルと同じカスタムフィールド値を持つ記事が抽出されていることが確認できるかと思います。

    $group_members = get_posts( 'posts_per_page=-1&order=asc&meta_key=所属グループ&meta_value=' . $post->post_title );
    var_dump($group_members);

    最後の質問ですが、どこに書かなければいけないというものは特にありません。ただ、ユーザーが自作するfunctionは、WordPressをアップグレードする際の手間や編集性を考えると、テーマのfunctions.phpに追加するのは1つの選択肢だと思います。

    また、まずはテンプレートに処理を直書きしてうまく表示させてみるのが先決かと思います。

    モデレーター jim912

    (@jim912)

    Crystaさん、こんばんは。

    少々お時間が経っていますが、その後いかがでしょう。
    私なりに作ったコードを載せておきますので、よければ試してみてください。
    テンプレートのループ内に追加していただければ、動くと思うのですが。

    <?php
    $categories_of_post = get_the_category();
    foreach ( $categories_of_post as $cat_of_post ) {
    	if ( $cat_of_post->cat_ID == 50 ) {
    		$group_members = get_posts( 'numberposts=-1&order=asc&meta_key=所属グループ&meta_value=' . $post->post_title );
    
    		$member_list = array();
    		if ( $group_members ) {
    			foreach ( $group_members as $member ) {
    				$member_title = apply_filters( 'the_title', $member->post_title );
    				$member_link = get_permalink( $member->ID );
    				$member_list[] = '<a href="' . $member_link . '" title="' . attribute_escape( $member_title ) . '">' . $member_title . '</a>';
    			}
    		}
    		$member_list = implode( '、', $member_list );
    		break;
    	}
    }
    ?>
    <?php echo $member_list; ?>
    トピック投稿者 crysta

    (@crysta)

    Crystaです。

    shokun0803さん、jim912さん

    ずいぶんと間が空いてしまって、本当に申し訳ありません。
    前回の質問投稿の直後に急な出張が入り、案件にくわえてインフルエンザまで
    いただいてしまいました…
    今、自宅でおふたりからのアドバイスにやっと目を通したところです。

    >shokun0803さん
    わかりづらい文面で申し訳ありません。
    体調が戻りましたら、イメージしていただきやすい内容で再度、質問投稿させていただきます。

    >jim912さん
    わかりづらい文面にもかかわらず、コードまでご指導いただき本当にありがとうございます。
    会社の規定で出勤停止中なのでまだテストできませんが、ぜひ試して結果をご報告いたします。

    本当にありがとうございます。
    復帰しましたらまた投稿いたしますので、よろしくお願い申し上げます。
    取り急ぎ、お礼とご連絡まで。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「特定のカスタムフィールドの値を持つ投稿をリスト出力するには」には新たに返信することはできません。