Измените основной цикл WordPress с фильтром parse_query

Я пытаюсь изменить основной цикл 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' );

какая-либо идея, почему это?

4
29.03.2011, 21:56
3 ответа

В конечном счете все запросы meta пробегаются _get_meta_sql.

Следующий coditional оператор работает за любыми запросами meta.

if ( empty( $meta_key ) && empty( $meta_value ) )
    continue;

Существует билет здесь для этого, которое обрисовывает в общих чертах то, что мы должны смочь сделать.
http://core.trac.wordpress.org/ticket/16735

Что можно сделать, однако намеренно передача запрос a meta_value Ваши сообщения никогда не будут, вероятно, иметь и использовать != (не равняется), сравнение, технически который должен получить Вас правые штанги, например.

$q->set( 'meta_key', 'my_key' );
$q->set( 'meta_value', 'WPSE_RULES!' );
$q->set( 'meta_compare', '!=' );
$q->set( 'orderby', 'meta_value' );

Существует одна дальнейшая вещь, хотя, у Вас есть они наоборот прежде..

$q->set( 'order','title' );
$q->set( 'orderby', 'DESC');
  • order устанавливает, какое направление заказать результаты, допустимые значения asc или desc (верхний или строчный).

  • orderby наборы, что к порядку результаты, например, дата, заголовок, meta значение, и т.д.

Я не упоминал, что существует на самом деле новый метод для запросов сообщений на основе meta теперь, с помощью meta_query параметр, но видящий, поскольку это не избежит проблемы, которую я упомянул выше и более старые meta параметры все еще (в конце) преобразовывается в a meta_query так или иначе я просто предложу ссылку на некоторые примеры.

http://scribu.net/wordpress/advanced-metadata-queries.html

Надеюсь, что все помогает..:)

6
19.02.2020, 22:11
  • 1
    я получил 2 ответа! Это действительно сделало мой день (я обычно спрашиваю вещи и никогда не получаю ответы, его, его). Я определенно попробую то, что Вы предлагаете. Спасибо за это. Я знаю о порядке и переключателе ordeby, который был случаен, но благодарит указать на это также :) –  Sarah Neuber 30.03.2011, 10:48
  • 2
    Отметьте, Вы можете (или должен смочь к), использование set_query_var внутри parse_query фильтры, какой basicailly делает то же как $q->set просто взгляды, более симпатичные... :) –  t31os 30.03.2011, 13:01
  • 3
    Хорошо, таким образом, я попробовал все предложенное, но ничто, кажется, не сортирует мои сообщения с specifc пользовательским полем, но я могу сказать, что мне удалось заставить его работать с помощью add_filter ('запрос', 'my_modified_query'); Все еще не может понять, почему та же функция не работала бы над add_filter ('parse_query', 'my_modified_query'); который является позором, поскольку я освобождаю способность использовать условный :( –  Sarah Neuber 31.03.2011, 14:46
  • 4
    Незадолго до конца parse_query фильтр добавляет что-то как update_option( 'problem_vars', $q->query_vars ); для загрузки на одну страницу затем распечатайте его где-нибудь.. print '<pre>';print_r( get_option( 'problem_vars' ) );print '</pre>'; и проверьте весь запрос, который - Вар, как они должны быть.. –  t31os 31.03.2011, 20:26
  • 5
    t31os, спасибо за это! Ну, тем не менее ничто :( Я вижу, что мои переменные заполнены правильно: [orderby] => meta_value и [meta_key] => price но никакие результаты безотносительно (сообщения в той категории имеют "цену" пользовательский полевой набор, таким образом, я должен получить некоторые результаты!) Это не может быть ошибкой, не может он? Особенно, когда фильтрация работает над фильтром запроса. –  Sarah Neuber 01.04.2011, 13:05

Servus Sarah. Я предполагаю, что это для одной из Ваших тем envato-магазина? Судите Вас уже для печати запроса как это (прежде чем возврат): echo '<pre>'; print_r($q); echo '</pre>';.

Я предполагаю, что Вы добавляете эту внутреннюю часть темы functions.php?

$q->set( 'oderby', 'DESC' ); работы, но $q->set( 'oderby', 'meta_value' ); нет? Попытайтесь использовать два основных orderby параметра, разделенные пробелами, чтобы проверить, работает ли поведение по умолчанию на всем протяжении. Если да, Вы могли бы просто столкнуться с некоторой орфографической ошибкой. Другие значения кроме 'my_key' работают на 'meta_key'? В противном случае затем, возможно, Вы пропускаете 'meta_value' параметр. Не уверенный в этом, но смотрят на этого: http://codex.wordpress.org/Function_Reference/WP_Query#Parameters или еще лучше прямой взгляд на функцию в базовом файле.

0
19.02.2020, 22:11
  • 1
    Servus, кажется, что Вы знаете меня :) Желание, которое я знал, кто Вы также! Я трижды проверил написание, но все это кажется хорошим. Это прослушивает меня, что я не могу найти, каково это. Я проверю снова все же. Спасибо за ответ! –  Sarah Neuber 30.03.2011, 10:46
  • 2
    Danke! Schon gemacht! :) –  Sarah Neuber 31.03.2011, 18:17

Вы, вероятно, получили решение, поскольку оно передало почти год, с тех пор как Вы отправили. У меня была та же проблема несколько часов назад, пока я не изобразил его, что я использовал числа - таким образом, я использовал meta_value_num insted meta_value.

1
19.02.2020, 22:11

Теги

Похожие вопросы