どーも、aoyamaです。社内にもうひとり「青山さん」がいらっしゃって、
メールでのやり取りでの導入部分が
青山さん
お疲れ様です、青山です。
とかなって、メールが続くとよくわからなくなったりします。
あと、社内でも宛先の間違いメールが、たまに届くようになりました。
大きな会社で、「佐藤」とか「鈴木」とかメジャーな苗字の人ってもっと大変なんだろうなと
思う今日、この頃です。
面倒ですね。
前回は、Knockout.jsで動くサンプルに関する記事を書いてみたりしました。
が、今回は、Wordpressネタにしようと思います。
「Wordpressでアイキャッチ画像(Post Thumbnail)がない投稿のみを取得する方法」
についてです。
結構簡単かなと調べてみたのですが、ざっと調べた限りでは見つからず、
結構苦労したので、共有です。
ニッチ過ぎて需要がないような気もしますが…。
WordPressでアイキャッチ画像(Post Thumbnail)が「ある」投稿のみを取得する方法
アイキャッチ画像(Post Thumbnail)が「ない」投稿の取得の話よりも、
まずは、「ある」投稿の取得方法から見ていきましょう。
1 |
query_post('meta_key=_thumbnail_id'); |
または、
1 |
query_post( array( 'meta_key' => '_thumbnail_id') ); |
これだけです。簡単ですね。
では、いよいよ本題です。
引数だけでなんとか出来ないか、試してみる
WordPress Codexの「query_posts」のページを眺めてみましょう。
「カスタムフィールド引数」の項目に指定できるキーが書いてあります。
- meta_key: (string) – Custom field key.
- meta_value: (string) – Custom field value.
- meta_compare: (string) – ‘meta_value=’ で指定された値を比較する演算子。デフォルトは ‘=’ で, ‘!=’、’>’、’>=’、’<'、'<=' も使える。
これらを使ってなんとか、出来ないかなーと眺めてみたものの。
そもそも、アイキャッチ画像がない時に「_thumbnail_id」というカスタムフィールドがあるのか?
と思ったので、DBを見てみることに。
1 |
SELECT * FROM wp_postmeta WHERE post_id = [対象の記事ID] AND meta_key like '_thumbnail_id'\G |
結果、meta_keyはアイキャッチ画像を削除すると消えるようです。
発行されるSQLを無理やり書き換える方向で考える
で、SQLを無理やり書き換える方向で検討してみます。
すべての条件で、SQLを書き換えるわけにはいかないので、下記の場合に書き換えるようにします。
1 2 3 4 |
query_posts('meta_key=_thumbnail_id&meta_compare=!='); //※meta_valueが指定されていないので、 //query_posts('meta_key=_thumbnail_id'); //と同じ。 |
上記の条件で発行されるSQLは下記の通り。
1 2 3 4 |
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = '_thumbnail_id' ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC |
記事用のテーブル(wp_post)の記事に対して、カスタムフィールドは複数存在するので
サブクエリを使わないと、wp_postmetaにmeta_key: _thumbnail_idを持たない記事を
抽出するのは難しそうです。
発行されるSQLを下記のように書き換えるようにします。
1 2 3 4 |
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN ( SELECT post_id FROM wp_postmeta WHERE meta_key = '_thumbnail_id') AS myjoin ON myjoin.post_id = wp_posts.ID WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (myjoin.post_id IS NULL ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC |
で、無理やり書き換えるために、functions.phpに下記の内容に追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// サムネイルなし投稿の取得 function custom_search_where_no_thumbnail($where, $wp_query) { global $wpdb; if (!is_admin() && !isset($wp_query->query['meta_value']) && isset($wp_query->query['meta_compare']) && $wp_query->query['meta_compare'] == '!=') { $where = str_replace("{$wpdb->postmeta}.meta_key = '".."'", "myjoin.post_id IS NULL", $where); } return $where; } add_filter('posts_where','custom_search_where_no_thumbnail', 10, 2); function custom_search_join_no_thumbnail($join){ global $wpdb, $wp_query; if (!is_admin() && !isset($wp_query->query['meta_value']) && isset($wp_query->query['meta_compare']) && $wp_query->query['meta_compare'] == '!=') { $join = " LEFT JOIN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id') AS myjoin ON myjoin.post_id = {$wpdb->posts}.ID"; } return $join; } add_filter( 'posts_join', 'custom_search_join_no_thumbnail'); |
といった感じで、かなり力技ですが、
Wordpressでアイキャッチ画像(Post Thumbnail)がない投稿のみを取得する
ことが出来るようになりました。
おわりに
弊社では、一緒に働いていただけるエンジニアを募集中です。
興味のあるかたは、「エンジニア採用サイト」をご覧いただき、ご応募ください。
ご応募お待ちしております。
受託案件を担当しています。 Javascript, Wordpressなどテーマはその時々で変わりますが、役に立つ情報を提供できればと思います。