Как правильно вызывать пользовательские даты полей в сообщениях, где фильтр с использованием инструкций SQL


В настоящее время у меня есть цикл, перечисляющий сообщения между двумя датами с использованием фильтра posts_where:

 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' ";

Например, следующий SQL-запрос, похоже, не работает, даже если правильные значения (2001-10-29, 2004-11-03, и т.д.) присутствуют в original_date meta_key из сообщений:

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? Как мы можем подойти к этому?

Author: maduroblanco, 2010-12-17

2 answers

Спасибо Амбициозной Амебе за ответ. Следующий улучшенный код решает проблему:

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;
 7
Author: maduroblanco, 2017-04-13 12:37:46

Если у вас есть Неизвестный столбец wp_postmeta.meta_key в предложении where

Вероятно, вы хотите объединить таблицу $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');
 4
Author: Robert Isaev, 2014-06-03 12:10:23