2014-11-30 5 views
1

Я искал ошибку на некоторое время и понятия не имею, что может быть причиной этого.Wordpress orderby запрос иногда не работает

Около 80% времени, следующий код работает, но иногда это просто приказы совершенно случайные:

function filter_where($time, $where = '') { 
$where .= " AND post_date > '" . date('Y-m-d H:i:s', strtotime($time)) . "'"; 
$where .= " AND post_status = 'publish' "; 
return $where; 
} 
add_filter('posts_where', 'filter_where'); 

$array = array(
    'cat' => 2, 
    'meta_key' => 'ratings_score', 
    'orderby' => 'meta_value_num', 
    'order' => 'DESC', 
    'meta_query' => array(
     array(
      'key' => 'ratings_score', 
     ), 
    ), 
    'posts_per_page' => 6 
); 

filter_where($time); 

query_posts($array); 

Функция работает фильтр. Я тестировал его с разными значениями $time и post_status.

Может ли это быть какой-то задержкой или я заказал код неправильно? Некоторые сообщения не имеют meta_key из ratings_score, но все сообщения в cat = 2 имеют это meta_key.

Возможно, это как-то связано с проблемой?

+0

Убедитесь, что вы вызываете wp_reset_query прямо перед каждым выполнением запроса или сразу после этого. http://codex.wordpress.org/Function_Reference/wp_reset_query –

ответ

1

Прежде всего, никогда использование query_posts

Примечание: Эта функция не предназначена для использования плагинов или темы. Как поясняется ниже, есть более эффективные, более эффективные варианты для изменения основного запроса. query_posts() является слишком упрощенным и проблематичным способом изменения основного запроса страницы путем замены его новым экземпляром запроса. Он неэффективен (повторно запускает SQL-запросы), и в некоторых случаях он будет неудачным (особенно часто при работе с разбивкой по страницам).

Вы должны использовать WP_Query или get_posts и только, когда вы не можете достичь результатов вы после этого путем изменения основного запроса с pre_get_posts

Вы правильно добавив свой фильтр перед вашими аргументами запроса, но вы снова добавляете функцию снова после аргументов запроса. Я считаю, что это одна из больших проблем. Вы должны удалить фильтр после аргументов запроса, не повторно добавлять их

Замените эту строку

filter_where($time); 

с

remove_filter('posts_where', 'filter_where'); 

одно замечание, почему вы определяющего $time, но тогда вы Безразлично Не используйте его вообще?