現在私はposts_where
フィルタを使って2つの日付の間の投稿をリストするループを持っています:
function filter_where( $where = '' ) {
$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
return where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
while (have_posts()) :
the_post();
the_content();
endwhile;
meta_key
というoriginal_date
では、post_date
の代わりに使用したい投稿ごとに異なる日付を保存しました。 meta_key
と同じ目的を果たすために、この$where
をpost_date
クエリに正しく呼び出すにはどうすればよいでしょうか。
$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";
たとえば、投稿の2001-10-29
2004-11-03
に正しい値(original_date
、meta_key
など)が存在していても、次のSQLクエリは機能しないようです。
global $wpdb;
$where .= " AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) >= '2000-01-01' AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) <= '2004-12-31' ";
一方、以下は同じ投稿に対してpost_date
を参照として使用して問題なく動作します。
$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
おそらく、結果をmeta_value
と同じ形式にフォーマットするには、post_date
配列から余分なものを取り除いてください。どうすればこれに近づくことができますか?
AmbitiousAmoeba に感謝します。以下の改良されたコードは問題を解決します:
function filter_where( $where = '' ) {
global $wpdb;
$where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
return where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
while (have_posts()) :
the_post();
the_content();
endwhile;
where
句にUnknown列wp_postmeta.meta_key
がある場合
$wpdb->postmeta
テーブルをこのクエリに結合したいでしょう。
function custom_posts_join($join){
global $wpdb;
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
return $join;
}
add_filter( 'posts_join' , 'custom_posts_join');