• 解決済 cockatiel

    (@cockatiel)


    初めまして。色々探してみたのですが、どうにも解決できなかったので質問させてください。

    WordPressのタグは、タグ名をクリックすると、そのタグを含む一覧の記事がピックアップされますが、
    これと同じ機能をカスタムフィールドにも持たせたいのです。

    たとえばこんな風にカスタムフィールドを入力し、テンプレートに出力した場合、
    (入力にはCustom Field Gui Utility プラグインを使用)
    season:冬,正月
    theme:和風
    この、「冬」や「正月」「和風」1つ1つにリンクを張り、同じカスタムフィールド名と値を持った記事の一覧が出力されるようにしたいと思っております。

    この機能の実現方法がありましたらお教えくださいませ。よろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 以下、未検証:

    各々のリンクを以下のようにして
    http://example.com/archives.php?key=season&value=冬

    archives.php を作成して以下を記述。

    <?php
    query_posts('posts_per_page=-1&meta_key=' . $_GET['key'] . '&meta_value=' . $_GET['value']);
    if(have_posts()) :
      while(have_posts()) :
        the_post();
        /* do stuff */
      endwhile;
    endif;
    wp_reset_query();
    ?>

    url エンコードとか $_GET の有無チェックとかはよきにはからってください。

    トピック投稿者 cockatiel

    (@cockatiel)

    kzさん。早速のレス、ありがとうございます!

    戴いたアドバイスを参考に試してみたのですが、私のやり方がまずいのか
    archives.php に飛ぶと、「Fatal error: Call to undefined function query_posts() in /略/archives.php on line 2」が出しまいます。←書き直しました。ごめんなさい

    1.テンプレートの「archives.php」を、提示いただいたコードに書き換える。
    2.リンクを入れたいカスタムフィールド部分の表記を以下のようにする。

    <!-- seasonに値があれば表示 -->
    <?php if(get_post_meta($post->ID,'season',true)): ?>
    	season:
    	<a href="<?php bloginfo('template_url'); ?>/archives.php?key=season&value=<?php echo get_post_meta($post->ID,season,True); ?>">
    		<?php echo get_post_meta($post->ID,season,True); ?>
    	</a><br />
    <?php endif; ?>

    2つめのカスタムフィールドは略。汚いソースでごめんなさい。
    (値が複数になった場合は使えない問題有り)

    興味があったので、kzさんのコードを記載したページを作成して試してみました。
    meta_key ごとにページを作成すれば見た目や表示内容も変えられますし、value値だけの取得でいいので、URLも簡素になりますね。

    スラッグを「season」としたページと page-season.php というテンプレートを作成
    URL:http://example.com/season?value=冬

    <?php
     query_posts('posts_per_page=-1&paged=$paged&meta_key=season&meta_value=' . $_GET['value']);
     if(have_posts()) :
    ?>
    <h2><?php echo $_GET['value']; ?></h2>
    
    <?php while(have_posts()) : the_post(); ?>
    <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    <p>表示の中身</p>
    
    <?php endwhile; endif; wp_reset_query(); ?>

    あ。ページテンプレートにしないとですね。
    1.例えば meta.php の名前でファイルを作成して以下を記述。

    <?php
    /**
    Template Name: Meta
    */
    ?>
    <?php
    get_header();
    echo '<p>debug: key=' . $_GET['key'] . ' + value=' . $_GET['value']. '</p>';
    query_posts('posts_per_page=-1&meta_key=' . $_GET['key'] . '&meta_value=' . $_GET['value']);
    if(have_posts()) :
      while(have_posts()) :
        the_post();
        /* do stuff */
      endwhile;
    endif;
    wp_reset_query();
    get_footer();
    ?>

    2.ページを新規作成してスラッグを meta にしてページテンプレートを Meta にする。
    3.http://example.com/meta?key=season&value=冬
      でアクセス。
    で動きました。
    LVP8 さんのご提案や色々試して cockatiel さんにベストなものを作ってみてください。

    トピック投稿者 cockatiel

    (@cockatiel)

    LVP8さん、kzさん、ありがとうございます。すごく助かりました!
    教えて頂いた通りにしたところ、良い感じにできました。
    (パーマリンクの設定がまだだったので、これを ~/%postname% にしてから作業しました。)

    工事中のページですが、こんな感じになりました。
    http://sticker.m5.coreserver.jp/

    値が複数の場合は、正規表現でどうにかなりそうなので頑張ってみようと思います。

    トピック投稿者 cockatiel

    (@cockatiel)

    あれからカンマの入っている値を、カンマで区切った複数のリンクとして
    書き出すようにしたのですが、値が完全一致しないと表示されません。
    記事A  season:冬,クリスマス
    記事B  season:冬
    で mate?key=season&value=冬 に飛んだ場合、
    記事Bは表示されるのですが、記事Aは表示されないのです。

    記事AもBも表示する為の、何か良い解決策がありましたらご教授いただけると嬉しく思います。

    ちなみにテンプレートに記述したソースは↓となります(汚くてごめんなさい)

    $custom_id = "season";//カスタムフィールドID
    $custom_class = get_post_meta($post->ID,$custom_id,true);
    $custom_classarry = explode(",", "$custom_class");//↑をカンマ区切りで配列化
    if($custom_class)://指定したカスタムフィールドに何らかの値が入っている場合
    	echo $custom_id . ": ";
    	foreach ($custom_classarry as $k => $name) {//繰り返し
    		echo '<a href="/mate?key=' . $custom_id .'&value=' . $name . '">' . $name . '</a>';//リンクタグ
    		if (end(array_keys($custom_classarry)) != $k) {echo ", ";}//区切り文字
    	}
    	echo "<br />";
    endif;

    未検証ですけど、コンマ区切りにせずに「同じキー+異なる値」を複数与えれば良さそうな気がします。
    記事A  season:冬
         season:クリスマス

    で、

    $custom_class = get_post_meta($post->ID,$custom_id,true);
    $custom_classarry = explode(",", "$custom_class");//↑をカンマ区切りで配列化
    if($custom_class)://指定したカスタムフィールドに何らかの値が入っている場合

    $custom_classarry = get_post_meta($post->ID,$custom_id,false);
    if(count($custom_classarry) > 0)://指定したカスタムフィールドに何らかの値が入っている場合

    に変更して試してみてください。

    トピック投稿者 cockatiel

    (@cockatiel)

    kzさん、再びありがとうございます。見事成功しました。

    カンマ区切りになっていたのは、Custom Field GUI Utility 3プラグインの仕様でしたが、最初から分けて入力すれば良かったのですね。
    このプラグインをOFFにして手入力に切り替えたところ、理想通りの動きになりました。
    (プラグインが動いているとカンマ区切りに修正されてしまう為)
    修正ついでにソースも短くして頂けて助かります。
    何から何まで感謝です。本当にありがとうございました!

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「カスタムフィールドをタグと同じようにリンクさせたい」には新たに返信することはできません。