カスタムフィールドで任意の条件を満たす記事一覧を表示

前回はカスタムフィールドを使ってみたわけですが、今回はカスタムフィールドが共通である記事一覧を抽出してみたいと思います。
つまり、仮に system_name というカスタムフィールドに WordPress という値を入力した記事がいくつかあったとして、
その一覧だけ出してみようということです。
便利なプラグインや便利な関数がありそうな気もしますが、一切無視して今回も $wpdb からやってみたいと思います。

<?php
    // カスタムフィールドで、条件が合致する記事情報を抽出
    $meta_key = 'system_name';  // カスタムフィールド名を指定
    $meta_value = 'WordPress';  // カスタムフィールド値を指定
    $arrPostIds = $wpdb->get_col($wpdb->prepare("select post_id from wp_postmeta where meta_key = %s and meta_value = %s", $meta_key, $meta_value));
    foreach($arrPostIds as $post_id){
        $arrPosts[] = $wpdb->get_row($wpdb->prepare("select * from wp_posts where ID = %d", $post_id));
    }
    if(count($arrPosts) > 0){
        echo "<h1>" . $meta_key . " が " . $meta_value . " の記事一覧</h1>";
        foreach($arrPosts as $val){
            echo "<p><a href='?p=" . $val->ID . "'>" . $val->post_title . "</a></p>";
        }
    }
?>

wp-content/themes/twentytwelve/index.php の適当な箇所に以下のコードを張って試しましたところ、
とりあえず期待通りの表示にはなりました。テンプレートなら他でもいけるんじゃないかなと思います。
ちなみに $arrPosts は wp_posts から全て引っこ抜いていますので、必要とする情報はだいたい入っているのではないかなと思います。

【参考】 $arrPosts の中身(私のテスト環境の場合ですので、参考程度にどうぞ)

array(2) {
  [0]=>
  object(stdClass)#2013 (23) {
    ["ID"]=>
    string(1) "4"
    ["post_author"]=>
    string(1) "1"
    ["post_date"]=>
    string(19) "2013-07-20 11:47:51"
    ["post_date_gmt"]=>
    string(19) "2013-07-20 02:47:51"
    ["post_content"]=>
    string(15) "あいうえお"
    ["post_title"]=>
    string(18) "テスト投稿A"
    ["post_excerpt"]=>
    string(0) ""
    ["post_status"]=>
    string(7) "publish"
    ["comment_status"]=>
    string(4) "open"
    ["ping_status"]=>
    string(4) "open"
    ["post_password"]=>
    string(0) ""
    ["post_name"]=>
    string(54) "%e3%83%86%e3%82%b9%e3%83%88%e6%8a%95%e7%a8%bf%ef%bd%81"
    ["to_ping"]=>
    string(0) ""
    ["pinged"]=>
    string(0) ""
    ["post_modified"]=>
    string(19) "2013-08-11 15:47:32"
    ["post_modified_gmt"]=>
    string(19) "2013-08-11 06:47:32"
    ["post_content_filtered"]=>
    string(0) ""
    ["post_parent"]=>
    string(1) "0"
    ["guid"]=>
    string(31) "http://****/?p=4"
    ["menu_order"]=>
    string(1) "0"
    ["post_type"]=>
    string(4) "post"
    ["post_mime_type"]=>
    string(0) ""
    ["comment_count"]=>
    string(1) "0"
  }
  [1]=>
  object(stdClass)#2015 (23) {
    ["ID"]=>
    string(1) "7"
    ["post_author"]=>
    string(1) "1"
    ["post_date"]=>
    string(19) "2013-07-20 11:48:12"
    ["post_date_gmt"]=>
    string(19) "2013-07-20 02:48:12"
    ["post_content"]=>
    string(15) "かきくけこ"
    ["post_title"]=>
    string(18) "テスト投稿B"
    ["post_excerpt"]=>
    string(0) ""
    ["post_status"]=>
    string(7) "publish"
    ["comment_status"]=>
    string(4) "open"
    ["ping_status"]=>
    string(4) "open"
    ["post_password"]=>
    string(0) ""
    ["post_name"]=>
    string(54) "%e3%83%86%e3%82%b9%e3%83%88%e6%8a%95%e7%a8%bf%ef%bd%82"
    ["to_ping"]=>
    string(0) ""
    ["pinged"]=>
    string(0) ""
    ["post_modified"]=>
    string(19) "2013-08-11 17:22:23"
    ["post_modified_gmt"]=>
    string(19) "2013-08-11 08:22:23"
    ["post_content_filtered"]=>
    string(0) ""
    ["post_parent"]=>
    string(1) "0"
    ["guid"]=>
    string(31) "http://****/?p=7"
    ["menu_order"]=>
    string(1) "0"
    ["post_type"]=>
    string(4) "post"
    ["post_mime_type"]=>
    string(0) ""
    ["comment_count"]=>
    string(1) "0"
  }
}
カテゴリー: 未分類   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

* Copy This Password *

* Type Or Paste Password Here *

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>