Я пытался создать пользовательский поисковый запрос, и я сделал некоторый прогресс в нем, но ударил еще один дорожный альбом.скомбинировать поиск по ключевым словам и налоговый запрос в wp_query
Я пытаюсь объединить meta_query, поиск по ключевым словам ('s') и tax_query в wp_query с отношением 'OR'.
Я получил meta_query и «S», чтобы работать вместе, благодаря этой фантастической пост: https://wordpress.stackexchange.com/questions/99849/search-that-will-look-in-custom-field-post-title-and-post-content
однако, tax_query еще дает мне неприятности. Я попытался добавить его с помощью того же метода, но кажется, что Wordpress делает какую-то другую магию с помощью tax_query, прежде чем он выведет ее в SQL-запрос.
Вот что у меня до сих пор:
function add_join_wpse_news($joins)
{
global $wpdb;
return $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ;
}
function alter_search_wpse_news($search,$qry)
{
global $wpdb;
$add = $wpdb->prepare("({$wpdb->postmeta}.meta_key = '_et_builder_settings' AND CAST({$wpdb->postmeta}.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s'));
$pat = '|\(\((.+)\)\)|';
$search = preg_replace($pat,'(($1 OR '.$add.'))',$search);
return $search;
}
function alter_groupby_wpse_news($groupby)
{
global $wpdb;
$mygroupby = "{$wpdb->posts}.ID";
if(preg_match("/$mygroupby/", $groupby)) {
// grouping we need is already there
return $groupby;
}
if(!strlen(trim($groupby))) {
// groupby was empty, use ours
return $mygroupby;
}
// wasn't empty, append ours
return $groupby . ", " . $mygroupby;
}
add_filter('posts_join','add_join_wpse_news');
add_filter('posts_search','alter_search_wpse_news',1,2);
add_filter('posts_groupby', 'alter_groupby_wpse_news');
$args_condensed = array
(
'post_type' => 'news',
'paged' => $paged,
's' => $getname,
);
$the_query = new WP_Query($args_condensed);
$max_pages = $the_query->max_num_pages;
echo $GLOBALS['the_query']->request;
И это работает. Однако он не включает поиск тегов или категорий. Я попытался добавить его вручную через фильтр posts_join и posts_search, но потом понял, что Wordpress сравнивает значения в tax_query перед выпуском SQL-запроса, что вызывает проблемы при попытке добавить его.
Любая помощь будет очень оценили.
EDIT: для разъяснения, я пытаюсь добавить в:
'tax_query' => array
(
'relation' => 'OR',
array //Search Tag
(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => array($getname)
),
array //Search Category
(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array($getname),
),
array //Search Category (Single Words)
(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => explode(" ",$getname),
),
array //Search Tag (Single Words)
(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => explode(" ",$getname),
)
),
но с отношением типа ИЛИ, в отличие от отношений и WordPress добавляет по умолчанию.
ЭТО РАБОТАЕТ! Я должен был изменить return $ where. ' А ТАКЖЕ '. msgstr "wter.slug like '% $ getname%'"; для возврата $ where. ' ИЛИ '. msgstr "wter.slug like '% $ getname%'"; Но после этого он начал тянуть по тегам. Фантастика. Теперь мне просто нужно выяснить, как заставить эту переменную $ getname работать правильно, и я буду установлен. Спасибо! На стороне примечания: знаете ли вы, почему здесь нужно установить $ getname? У меня есть ссылка на URL-адрес GET, но он утверждает, что он не определен при вызове этой функции. –