web-dev-qa-db-ja.com

SQLステートメントを使用してカスタムフィールドの日付をposts_whereフィルタに正しく呼び出す方法

現在私は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と同じ目的を果たすために、この$wherepost_dateクエリに正しく呼び出すにはどうすればよいでしょうか。

$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";

たとえば、投稿の2001-10-292004-11-03に正しい値(original_datemeta_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配列から余分なものを取り除いてください。どうすればこれに近づくことができますか?

7
maduroblanco

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;
6
maduroblanco

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');
3
Robert Isaev