カスタムフィールドをタグと同じようにリンクさせたい
-
初めまして。色々探してみたのですが、どうにも解決できなかったので質問させてください。
WordPressのタグは、タグ名をクリックすると、そのタグを含む一覧の記事がピックアップされますが、
これと同じ機能をカスタムフィールドにも持たせたいのです。たとえばこんな風にカスタムフィールドを入力し、テンプレートに出力した場合、
(入力にはCustom Field Gui Utility プラグインを使用)
season:冬,正月
theme:和風
この、「冬」や「正月」「和風」1つ1つにリンクを張り、同じカスタムフィールド名と値を持った記事の一覧が出力されるようにしたいと思っております。この機能の実現方法がありましたらお教えくださいませ。よろしくお願いします。
-
以下、未検証:
各々のリンクを以下のようにして
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 の有無チェックとかはよきにはからってください。
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 さんにベストなものを作ってみてください。LVP8さん、kzさん、ありがとうございます。すごく助かりました!
教えて頂いた通りにしたところ、良い感じにできました。
(パーマリンクの設定がまだだったので、これを ~/%postname% にしてから作業しました。)工事中のページですが、こんな感じになりました。
http://sticker.m5.coreserver.jp/値が複数の場合は、正規表現でどうにかなりそうなので頑張ってみようと思います。
あれからカンマの入っている値を、カンマで区切った複数のリンクとして
書き出すようにしたのですが、値が完全一致しないと表示されません。
記事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)://指定したカスタムフィールドに何らかの値が入っている場合に変更して試してみてください。
トピック「カスタムフィールドをタグと同じようにリンクさせたい」には新たに返信することはできません。