фильтруйте результаты поиска с помощью мета-ключа пользовательского типа записи
Поиск по умолчанию возвращает все типы записей, что мне и нужно. Но для одного конкретного пользовательского типа записи я хочу ограничить результат определенным значением мета-ключа (пользовательской датой, которая должна быть больше, чем сегодня).
Использование крючка 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');
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 г.: Добавлен фильтр для пользовательского типа записи и упрощен условный заявление.
Вы можете ограничить свой запрос еще больше...
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));
Но не самый эффективный. Это три вопроса. Я упоминаю о других возможности в другом потоке: Пользовательский запрос с исключением категорий и "белым списком" после меты"