我一直在尝试创建自定义搜索查询,并且在这方面取得了一些进展,但又遇到了另一个障碍。
我正在尝试将 wp_query 中的 meta_query、关键字搜索 ('s') 和 tax_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 在将它输出到 SQL 查询之前对 tax_query 做了一些其他的魔法。
这是我到目前为止所得到的:
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;
Run Code Online (Sandbox Code Playgroud)
这有效。但是,它不包括对标签或类别的搜索。我试图通过posts_join和posts_search过滤器手动添加它,但后来我意识到wordpress在输出SQL查询之前比较tax_query中的值,这在尝试添加时会导致问题。
任何帮助将不胜感激。
编辑:为了澄清起见,我正在尝试添加:
'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),
)
),
Run Code Online (Sandbox Code Playgroud)
但是使用 OR 类型的关系,而不是 wordpress 默认添加的 AND 关系。
您无法为此目的使用 tax_query。您必须覆盖 wordpress 提供的过滤器才能实现此任务。这是我的代码。希望有帮助:
function add_join_wpse_news($joins)
{
global $wpdb;
$joins = $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ;
$joins .= " inner join {$wpdb->term_relationships} as wrel on {$wpdb->posts}.ID = wrel.object_id";
$joins .= " inner join {$wpdb->term_taxonomy} as wtax on wtax.term_taxonomy_id = wrel.term_taxonomy_id";
$joins .= " inner join {$wpdb->terms} as wter on wter.term_id = wtax.term_id";
return $joins;
}
function add_where_wpse_news($where) {
$getname = 'what you want';
return $where. ' AND '. "wter.slug like '%$getname%' ";
}
add_filter('posts_join','add_join_wpse_news');
add_filter('posts_where','add_where_wpse_news');
Run Code Online (Sandbox Code Playgroud)
我只是添加了 posts_where 并修改了 posts_join 过滤器。
| 归档时间: |
|
| 查看次数: |
3443 次 |
| 最近记录: |