サポート » 使い方全般 » 「同じカスタムフィールドの値を持つ記事」の一覧ページ

  • 「りんご」を持つ記事の一覧ページを作りたいのですけれど、そのような場合はどうしたらいいのでしょうか?

    【前提】

    ■カスタムフィールド名
    →「tag」

    ■カスタムフィールド値
    →「りんご」「バナナ」

    ■目指すURL
    →http://example.com/任意の文字/りんご
    →http://example.com/任意の文字/バナナ
    という感じ。
    (任意の文字はもちろん同じでいいのですが、「tag」というカスタムフィールド名ではなく自分で変更したいので任意の文字と書きました)

    【疑問】
    たとえば「arcive.php」をコピーして、「arcive-tag.php」という固定ページテンプレートを作りました。でも、そのテンプレートを使う固定ページの編集画面でURLを指定しますよね?

    そのときに
    「http://example.com/任意の文字」
    というURLを登録すると、
    「http://example.com/任意の文字/りんご」
    というリンクをクリックしても「arcive-tag.php」は読み込んでくれず404になってしまいます。(>_<)

    どうしたら「りんご」を持つ記事の一覧ページを作ることができるのでしょうか…?

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • タグやカテゴリーを使えば、特別な手間もかからず実現できると思います。
    どうしてもカスタムフィールドで行いたい理由があるのでしょうか?

    トピック投稿者 meijinochoco

    (@meijinochoco)

    はい。事情ありです。どうしてもカスタムフィールド名をタグとして扱いたいのです。
    せっかくアドバイス頂いたのにすみません。。

    ちなみに現状では、タグとして扱っているカスタムフィールド名の数だけ固定ページを作り、
    ・http://example.com/fluits/apple
    ・http://example.com/fluits/grape
    ・http://example.com/fluits/banana
    これらの共通テンプレート「page-tags」に下記を書いて対応しております。

    もし下記について、「もっとこうしたらどう?」などのご意見をいただけましたら幸いです。

    <?php
    /*
    Template Name: page-tags
    */
    get_header(); ?>
    
    <?php 			
      $url = $_SERVER["REQUEST_URI"];
      $str = str_replace('/', '', $url);
      $tag = urldecode($str);
    ?>
    
    <div id="contents">
    	
      <div class="listtitle">			
        <h2><?php echo $tag ?>の記事一覧</h2>
      </div>			
    
      <div id="container">
    		
        <!--post-->
        <?php $args = Array(		
          'post_type' => 'post',
          'posts_per_page' => -1,
          'meta_key' => 'tag_post',
          'meta_value' => $tag
        );
        $the_query = new WP_Query($args);
        if($the_query -> have_posts()):
          while($the_query -> have_posts()): $the_query -> the_post();
    
            get_template_part( 'template-parts/list', 'post' );
    
          endwhile;
        endif;
        wp_reset_postdata(); ?>
    		
        <!--custom1-->
        <?php $args = Array(			
          'post_type' => 'custom1',
          'posts_per_page' => -1,
          'meta_key' => 'tag_custom1',
          'meta_value' => $tag
        );
        $the_query = new WP_Query($args);
        if($the_query -> have_posts()):
          while($the_query -> have_posts()): $the_query -> the_post();
    
            get_template_part( 'template-parts/list', 'custom1' );
    
          endwhile;
        endif;
        wp_reset_postdata(); ?>
    
        <!--custom2-->
        <?php $args = Array(			
          'post_type' => 'custom2',
          'posts_per_page' => -1,
          'meta_key' => 'tag_custom2',
          'meta_value' => $tag
        );
        $the_query = new WP_Query($args);
        if($the_query -> have_posts()):
          while($the_query -> have_posts()): $the_query -> the_post();
    
            get_template_part( 'template-parts/list', 'custom2' );
    
          endwhile;
        endif;
        wp_reset_postdata(); ?>
    		
      </div>
    	
        <?php pingraphy_the_posts_navigation(); ?>
    		
    </div>
    
    <?php get_footer(); ?>

    @ounziw氏のおっしゃる通り、分類は分けてもいいのでは。2度手間が嫌なのかもしれませんが。
    まったくわからないので勉強がてら調べてみました。斜め上かもしれない。
    WordPressのクエリに独自テーブルをくっつけてカスタマイズする
    関数リファレンス/get query var
    テンプレート階層
    そもそもスレ主さんの解決策でいいんじゃないでしょうか。知ったかだけど。
    まずテンプレートを呼び出して、クエリ文字列から値を取得して、一覧を取得する。
    まあテンプレートを1枚(カスタム投稿が候補かも)にして、クエリ文字列からappleを取得できればゴールなのでしょうが。
    独自テーブルまではやりすぎかもしれませんが。でもカスタム投稿カスタム分類カスタムフィールド独自テーブルまでが1セットって考えのプラグインも海外にはあるみたいですけどね。英語だからよくわからない。

    トピック投稿者 meijinochoco

    (@meijinochoco)

    初心者の不勉強なコードと意見で大変恐縮なのですけれど、なにかもっと、こう、、、

    たとえばカテゴリアーカイブページって、「テンプレート1枚(arcive.php)」で作動するじゃないですか?

    でも現状の私の解決策だと「テンプレート1枚(page-tags.php)+カスタムフィールドの値の数と同じ数の固定ページ(apple.banana,grape)」が必要でして、これではカスタムフィールドの値を追加するたびにいちいち固定ページを作らなくちゃならないところがちょっとイヤな感じなのです。(;’∀’)

    リンク先ありがとございます。勉強してきます。

    カスタム分類を使うのはいかがですか? (タグでもカテゴリーでもなく。)
    https://wpdocs.osdn.jp/カスタム分類

    参考ページ: カスタム投稿タイプとカスタムタクソノミーまとめ

    トピック投稿者 meijinochoco

    (@meijinochoco)

    ありがとうございます。
    「なぜ、タグでもカテゴリでもカスタム分類でもなく、カスタムフィールドなのか?」と言うと、ユーザーが投稿するサイトでして、そのユーザー投稿機能を実装するにあたってカスタムフィールドしか選択できない仕様になっているからなのです。タグを選択できれば解決なのですが、それは前提としてナシなのです。すみません。
    いつもアドバイス感謝です。

    検証していません(見つけただけ)が下記の記事がヒントになるかもしれません。

    WordPressのパーマリンクを自由自在にカスタマイズ
    https://b-risk.jp/blog/2014/02/permalink-customize/

    それと途中までになっていますが本フォーラムの過去トピック。
    https://ja.wordpress.org/support/topic/パーマリンクにカスタムフィールドの値を使用す/

    トピック投稿者 meijinochoco

    (@meijinochoco)

    ありがとうございます!
    >WordPressのパーマリンクを自由自在にカスタマイズ
    これはイケそうな手ごたえですね。

    ①functions.phpへの追記
    ②管理画面のパーマリンク設定で「変更を保存」をクリック
    ③arcive.phpへの追記

    のうち、

    ①②によって、
    ・http://example.com/fluits/apple
    ・http://example.com/fluits/grape
    ・http://example.com/fluits/banana
    いずれにアクセスしても404にはいかなくなりました。

    どうやら「http://example.com/meta_key/meta_value」というルールの追加はできたようす。

    問題は③です。(>_<)

    arcive.phpへの記載ですが、たとえば次のようなテンプレートでは、どこかおかしいところはございますでしょうか…?

    下記ですと「content-none.php」が読み込まれてしまうという状況です。

    ▼arcive.php

    
    <?php get_header(); ?>
    
    <!--今回の追記部分-->
    <?php
    if ( $meta_key = get_query_var('fluits') && $meta_value = get_query_var('apple') ) {
      query_posts( array('meta_key'=>$meta_key, 'meta_value'=>$meta_value) );
    }
    ?>
    
    <!--以下は元々あるもの-->
    <div id="contents">
    	
      <div class="listtitle">			
        <h2><?php echo $tag ?>の記事一覧</h2>
      </div>			
    
      <div id="container">		
    		
        <?php if ( have_posts() ) : ?>
    		
          <div class="masonry" class="clearfix">
            <?php while ( have_posts() ) : the_post(); ?>
              <?php get_template_part( 'template-parts/content', get_post_format() );	?>
            <?php endwhile; ?>
    		
    	<?php else : ?>
    
              <?php get_template_part( 'template-parts/content', 'none' ); ?>
    
    	<?php endif; ?>
    	
          </div>
    		
            <?php pingraphy_the_posts_navigation(); ?>
    		
      </div>
    
    </div>
    	
    <?php get_footer(); ?>

    arcive.phpへの記載ですが、たとえば次のようなテンプレートでは、どこかおかしいところはございますでしょうか…?

    get_query_var() の使い方を参考サイトのオリジナルのコードと比べましょう。
    オリジナルのコードが何を意味するか調べることをお勧めします。
    https://b-risk.jp/blog/2014/02/permalink-customize/

    (ファイルは archive.php ですよね。)

    それから、この先は今すぐでなくて良いと思いますが、archive.php で query_posts() を使うのはあまりお勧めできません。いまの query_posts() を使う方法がうまく行った後に、例えば下記の記事を参考に pre_get_posts を使う方法に切り替えるのをご検討ください。
    カスタムクエリの追加方法と一緒に追加しておきたい関数やフックなど | Wood-Roots:blog

    トピック投稿者 meijinochoco

    (@meijinochoco)

    何を意味するか…すみません。かなりわからないです(>_<)
    お助け頂けませんでしょうか…。。

    では、何を意味するかは後回しで構いませんので、コードの get_query_var() が出てくる箇所をその周辺も含め、オリジナルと比較してみましょう。

    比較すると、違うところは下記の部分です。get_query_var() のパラメータは変えなくて良いと思うのですが(動作検証していませんが)。
    @meijinochoco さんのコード:

    <!--今回の追記部分-->
    if ( $meta_key = get_query_var('fluits') && $meta_value = get_query_var('apple') ) {
      query_posts( array('meta_key'=>$meta_key, 'meta_value'=>$meta_value) );
    }
    

    参考サイトのオリジナルのコード:

    if ( $meta_key = get_query_var('meta_key') && $meta_value = get_query_var('meta_value') ) {
      query_posts( array('meta_key'=>$meta_key, 'meta_value'=>$meta_value) );
    }
    
12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「「同じカスタムフィールドの値を持つ記事」の一覧ページ」には新たに返信することはできません。