фильтруйте результаты поиска с помощью мета-ключа пользовательского типа записи


Поиск по умолчанию возвращает все типы записей, что мне и нужно. Но для одного конкретного пользовательского типа записи я хочу ограничить результат определенным значением мета-ключа (пользовательской датой, которая должна быть больше, чем сегодня).

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

Можно ли использовать мета_запрос только для одного конкретного кпп?

Это должно быть достаточно ясно, но, тем не менее, вот некоторый код:

function searchExcludeOldMatches($query) {
    if (!is_admin()&&$query->is_search) {
        $query->set('meta_query', array(
            array(
                'key' => 'cpt-match-date'
                ,'value' => date('Y/m/d',time())
                ,'type' => 'DATE'
                ,'compare' => '>'
            )
        ));
    };
    return $query;
};
add_filter('pre_get_posts','searchExcludeOldMatches');
Author: Sjeiti, 2013-05-15

2 answers

Возможно, раньше это не работало, но мета-запросы WordPress теперь поддерживают параметр relation. Чтобы завершить то, что хотел сделать @s_ha_dum, просто добавьте параметр отношения (как ИЛИ) и добавьте второй мета-запрос для НЕ СУЩЕСТВУЕТ. Пример:

function searchExcludeOldMatches( $query ) {
    //if we're on the admin panel, or it's a search, or it's not the post type we want to filter, return the original query
    if( is_admin() || !$query->is_search() || $query->get( 'post_type' ) != 'yourposttype' )
        return $query;

    //this is the query we want to update
    $query->set('meta_query', array(
        'relation' => 'OR',
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            ,'compare' => '>'
        ),
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            'compare' => 'NOT EXISTS'
        ),
    ));
    return $query;
}
add_filter('pre_get_posts','searchExcludeOldMatches');

Для дальнейшего чтения ознакомьтесь со страницей Кодекса мета-запросов WP: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

Изменить 17 ноября 2015 г.: Добавлен фильтр для пользовательского типа записи и упрощен условный заявление.

 1
Author: Elly Post, 2015-11-17 21:04:04

Вы можете ограничить свой запрос еще больше...

if (
  !is_admin() 
  && $query->is_search() 
  && ($query->get('post_type') == 'yourposttype')
) { 
  // ...

Но если вы хотите запросить все типы записей, но ограничить эти результаты только одним типом записей в одном запросе , вы не можете этого сделать. Возможно, вам понадобится оператор UNION, и WP_Query это не поддерживает. Вам нужно будет использовать несколько запросов или написать свой собственный SQL.

Самый простой способ сделать это примерно так:

$post_ids = new WP_Query(array(
  // query for one post type
  'fields' => 'ids',
  // other parameters
));

$post_ids_2 = new WP_Query(array(
  // query for the others
  'fields' => 'ids',
  // other parameters
));
// join them
$post_ids = $post_ids->posts + $post_ids_2->posts;
$posts_qry = new WP_Query(array('post__in'=> $posts_ids));

Но не самый эффективный. Это три вопроса. Я упоминаю о других возможности в другом потоке: Пользовательский запрос с исключением категорий и "белым списком" после меты"

Связанные

Https://wordpress.stackexchange.com/a/79977/21376

 1
Author: s_ha_dum, 2017-04-13 12:37:54