sarahneuber
  • 0
Новичок

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

  • 0

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

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

Share
  1. Почему вы используете parse_query вместо pre_get_posts фильтра?

    • 0
    • Я получил 2 ответа! Это действительно сделало мой день (обычно я спрашиваю и никогда не получаю ответов, хе-хе). Я обязательно попробую то, что вы предлагаете. Спасибо за это. Я знаю о порядке и переключении порядка, это было случайно, но спасибо, что указали и на это тоже 🙂

      • 0
    • Обратите внимание, что вы можете (или должны иметь возможность) использовать set_query_var внутренние parse_query фильтры, которые в основном делают то же самое $q->set, просто выглядят красивее… 🙂

      • 0
    • Хорошо, поэтому я попробовал все предложенное, но, похоже, ничто не сортирует мои сообщения с помощью определенного настраиваемого поля, но я могу сказать, что мне удалось заставить его работать с помощью add_filter(‘request’, ‘my_modified_query’); До сих пор не могу понять, почему та же функция не работает с add_filter(‘parse_query’, ‘my_modified_query’); это позор, так как я теряю возможность использовать условные теги 🙁

      • 0
    • Непосредственно перед концом parse_query фильтра добавьте что-то вроде update_option( 'problem_vars', $q->query_vars ); загрузки одной страницы, затем распечатайте его где-нибудь.. print '<pre>';print_r( get_option( 'problem_vars' ) );print '</pre>'; и проверьте, чтобы все переменные запроса были такими, какими они должны быть..

      • 0
    • @t31os, Спасибо за это! Ну, по-прежнему ничего 🙁 Я вижу, что мои переменные заполнены правильно: [orderby] => meta_value но [meta_key] => price никаких результатов (сообщения в этой категории имеют установленное настраиваемое поле «цена», поэтому я должен получить какие-то результаты!) Это не может быть ошибкой, может Не правда ли? Особенно, когда фильтрация работает на фильтре запроса.

      • 0
  2. В конечном итоге все мета-запросы выполняются через _get_meta_sql .

    Следующий условное выражение выполняется для любых метазапросов.

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

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

    Однако вы можете намеренно передать свой запрос 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_query параметра, но, учитывая, что это не избавит от проблемы, о которой я упоминал выше, и более старые метапараметры все еще (в конце) преобразуются в meta_query любом случае, я просто предложу ссылку на некоторые примеры.

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

    Надеюсь, что все поможет.. 🙂

    • 0

Оставить ответ

You must login to add an answer.