Фильтровать список записей администратора с помощью нескольких фильтров; как структурировать объект запроса с помощью логического И оператора

#wordpress

#wordpress

Вопрос:

Мне нужна помощь в понимании того, как структурировать объект WP_Query для применения нескольких критериев / фильтров.

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

После установки переменной get отлично работает следующее для фильтрации списков записей администратора с помощью одной переменной get (помеченной «Notification» в переменной get и ключа базы данных ACF «author_notified»).

 add_filter( 'parse_query', 'filter_admin',15 );

function filter_admin( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'post' == $type amp;amp; is_admin() amp;amp; $pagenow=='edit.php' amp;amp; isset($_GET['Notification']) amp;amp; $_GET['Notification'] != '') {
        $query->query_vars['meta_key'] = 'author_notified';
        $query->query_vars['meta_value'] = $_GET['Notification'];
    }

}
  

В результате получается объект запроса, в котором WP_Query[query_vars][meta_key] и WP_Query[query_vars][meta_value] нацелены на желаемое подмножество записей.

Как должен быть структурирован объект запроса, чтобы предназначаться для подмножества записей, которые соответствуют двум аналогичным критериям одновременно? Или, проще говоря, как мне фильтровать списки записей администратора по двум критериям, которые оба должны быть истинными?

Я все еще новичок в PHP / WordPress и не уверен, как структурировать объекты запроса. Любая помощь или предложения будут высоко оценены!

Комментарии:

1. Когда вы говорите, что это «кажется, не работает», можете ли вы быть более конкретным? например, выдает ли это ошибку, неожиданные результаты, черный экран или просто не имеет эффекта? Кроме того, какую отладку вы выполнили, чтобы увидеть, что происходит, например, posts_filter2 вызывается? Запускается ли предложение if? Можете ли вы показать нам, как это выглядит, когда вы распечатываете свой $get_query массив? Легче отлаживать что-то подобное, если вы можете видеть результат, и мы можем вернуться оттуда.

2. Спасибо FluffyKitten. Вызывается функция posts_filter2; но фильтрация не выполняется — все записи видны. Спасибо за указатель повторно: распечатываю массив $ get_query, я пытаюсь это сейчас…

3. В первом методе фильтр работает, устанавливая для WP_Query[query_vars][meta_key] значение author_notified , а для WP_Query[query_vars][meta_value] правильное значение (0 или 1). Как должен быть структурирован WP_Query для достижения двух критериев фильтрации? Это большой пробел в моих знаниях — похоже, что [query_vars] будет обрабатывать только отдельные значения и не принимает логические массивы в качестве значений. Нужно ли мне использовать WP_Query [meta_query] вместо WP_Query[query_vars]?

4. Рад, что вы разобрались! Я всегда нахожу, что это помогает точно видеть, что находится в массиве, который вы передаете в wp_query. К вашему сведению, я вижу, вы изменили свой вопрос — я действительно думаю, что код в вашем исходном вопросе мог бы быть полезен другим пользователям, потому что они вполне могли пытаться достичь этого таким же образом.

5. Ах, хорошая мысль. В основном это в ответе, но я добавлю его обратно, чтобы убедиться, что он доступен для поиска. 🙂

Ответ №1:

Решено, большое спасибо советам по устранению неполадок от @FluffyKitten.

Объект WP_Query должен быть структурирован следующим образом, чтобы обеспечить несколько фильтров для списка записей администратора. По сути, поля ACF могут быть добавлены с помощью логических операторов в WP_Query[query_vars][meta_query]:

         [meta_query] => Array
            (
                [relation] => AND
                [0] => Array
                    (
                        [key] => author_notified
                        [value] => 1
                        [compare] => =
                        [type] => NUMERIC
                    )

                [1] => Array
                    (
                        [key] => recommended_decision
                        [value] => 0
                        [compare] => =
                        [type] => CHAR
                    )

            )
  

Эта структура объекта запроса может быть реализована с помощью функции следующим образом, предполагая, что переменные GET с именами «Уведомление» и «Рекомендация» уже установлены в другом месте:

 add_filter( 'parse_query', 'posts_filter2',15 );

function posts_filter2( $query ){
   global $pagenow;
   $type = 'post';
   if (isset($_GET['post_type'])) {
       $type = $_GET['post_type'];
   }
   if ( 'post' == $type amp;amp; is_admin() amp;amp; $pagenow=='edit.php') {

        $queryParamsCounter = 0;
        if (isset( $_GET['Notification'] ) amp;amp; $_GET['Notification'] != '')
        {
          $notification = (int)$_GET['Notification'];
          $queryParamsCounter  ;
        }
        if (isset( $_GET['Recommendation'] ) amp;amp; $_GET['Recommendation'] != '')
        {
          $queryParamsCounter  ;
          $recommendation = $_GET['Recommendation'];
        }

        $meta_query = array();

        if ($queryParamsCounter > 1) {
          $meta_query['relation'] = 'AND';
        }

        if (isset($notification)) {
          $meta_query[] =       array(
            'key' => 'author_notified',
            'value'    => $notification,
            'compare' => '=',
            'type'    => 'NUMERIC',  
          );
        }
        if (isset($recommendation)) {
          $meta_query[] = array(
            'key'     => 'recommended_decision',
            'value'   => $recommendation,
            'compare' => '=',
            'type'    => 'CHAR',
          );
        }

        $query->set( 'meta_query', $meta_query);

    }
}
  

Обратите внимание, что если выбран только один фильтр, ключ отношения не следует использовать.

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