Я пытаюсь изменить основной цикл WordPress на страницах моих категорий следующим образом:
add_filter('parse_query', 'my_modified_query');
function my_modified_query( $q ) {
if (!is_admin() && is_category()) {
$q->set( 'orderby', 'meta_value' );
$q->set( 'meta_key', 'my_key' );
}
return $q;
}
но, похоже, это не работает.
Однако изменение чего-либо еще, например:
$q->set( 'order','title' );
$q->set( 'orderby', 'DESC');
работает отлично. Просто нет
$q->set( 'orderby', 'meta_value' );
$q->set( 'meta_key', 'my_key' );
Любая идея, почему это так?
Почему вы используете
parse_query
вместоpre_get_posts
фильтра?Я получил 2 ответа! Это действительно сделало мой день (обычно я спрашиваю и никогда не получаю ответов, хе-хе). Я обязательно попробую то, что вы предлагаете. Спасибо за это. Я знаю о порядке и переключении порядка, это было случайно, но спасибо, что указали и на это тоже 🙂
Обратите внимание, что вы можете (или должны иметь возможность) использовать
set_query_var
внутренниеparse_query
фильтры, которые в основном делают то же самое$q->set
, просто выглядят красивее… 🙂Хорошо, поэтому я попробовал все предложенное, но, похоже, ничто не сортирует мои сообщения с помощью определенного настраиваемого поля, но я могу сказать, что мне удалось заставить его работать с помощью add_filter(‘request’, ‘my_modified_query’); До сих пор не могу понять, почему та же функция не работает с add_filter(‘parse_query’, ‘my_modified_query’); это позор, так как я теряю возможность использовать условные теги 🙁
Непосредственно перед концом
parse_query
фильтра добавьте что-то вродеupdate_option( 'problem_vars', $q->query_vars );
загрузки одной страницы, затем распечатайте его где-нибудь..print '<pre>';print_r( get_option( 'problem_vars' ) );print '</pre>';
и проверьте, чтобы все переменные запроса были такими, какими они должны быть..@t31os, Спасибо за это! Ну, по-прежнему ничего 🙁 Я вижу, что мои переменные заполнены правильно:
[orderby] => meta_value
но[meta_key] => price
никаких результатов (сообщения в этой категории имеют установленное настраиваемое поле «цена», поэтому я должен получить какие-то результаты!) Это не может быть ошибкой, может Не правда ли? Особенно, когда фильтрация работает на фильтре запроса.В конечном итоге все мета-запросы выполняются через
_get_meta_sql
.wp-includes/meta.php
Строка 402 — 403 в
_get_meta_sql
функцииСледующий условное выражение выполняется для любых метазапросов.
Для этого есть билет, в котором описывается, что мы должны уметь делать.
http://core.trac.wordpress.org/ticket/16735
Однако вы можете намеренно передать свой запрос
meta_value
вашим сообщениям, которые вряд ли будут иметь, и использовать!=
сравнение (не равно), технически это должно дать вам правильные сообщения, например..Однако есть еще одна вещь, вы неправильно поняли это раньше..
order
устанавливает, в каком направлении упорядочивать результаты, допустимыми значениями являютсяasc
илиdesc
(верхний или нижний регистр).orderby
устанавливает порядок результатов, например. дата, заголовок, мета-значение и т. д.Я не упомянул, что на самом деле теперь есть новый метод запроса сообщений на основе метаданных с использованием
meta_query
параметра, но, учитывая, что это не избавит от проблемы, о которой я упоминал выше, и более старые метапараметры все еще (в конце) преобразуются вmeta_query
любом случае, я просто предложу ссылку на некоторые примеры.http://scribu.net/wordpress/advanced-metadata-queries.html
Надеюсь, что все поможет.. 🙂