我有下面的代码,我试图编辑没有运气。
我希望能够包括可能有搜索词 s 作为后标签的职位。
add_action('pre_get_posts','modify_search');
function modify_search($query)
{
if ($query->is_search() && $query->is_main_search() && !is_admin()) {
if (isset($_GET['post_type'])) {
$query->set('s', sanitize_text_field($_GET['s']));
$query->set('post_type', sanitize_text_field($_GET['post_type']));
}
}
字符串
}
我尝试了多种不同的方法来设置查询的“tax_query”参数,但都没有成功。
其目标是能够列出所有的职位和cpts可能有搜索词在其标题,内容或摘录,但也有任何职位,包含搜索词作为一个职位的标签
任何帮助都将不胜感激
编辑:
function custom_search_filter($query) {
if ($query->is_search && !is_admin()) {
$tax_query = array(
'relation' => 'OR',
array(
'taxonomy' => 'post_tag',
'field' => 'name',
'terms' => $query->query_vars['s'],
),
);
// Debugging output
error_log(print_r($tax_query, true));
$query->set('tax_query', $tax_query);
}
}
add_action('pre_get_posts', 'custom_search_filter');
型
更新,以提供一个许多不同的方式,我已经尝试去这一点。
我不想改变搜索的默认方法,看标题,内容或摘录,我只是想钩到搜索,也显示任何可能包含搜索词提供的职位。
我会加上我也有一个表格与复选框,我过滤的结果的基础上,cpt的,但这是无关的,这项任务
1条答案
按热度按时间bwleehnv1#
使用SQL语言,这个问题是要求两个查询的UNION。WordPress本身并不处理这个问题。一个实验性的WordPress插件可以完成这个任务:合并查询。
下面的解决方案中的代码已经过测试。它使用原生WordPress钩子和函数。
解决方案包括以下步骤:
1.使用
posts_results
过滤器钩子来更新默认的搜索结果列表,1.使用
WP_Query
为经过标签过滤的帖子列表生成二级查询,1.将两个列表合并组合,
1.删除重复项,以及
1.排序最终结果。
posts_results
posts_results过滤器钩子用于更新从默认搜索结果生成的帖子列表。WordPress文档说:* 在状态检查之前过滤原始帖子结果数组。*
警告!
WordPress文档说:
这个过滤器的输入是一个帖子数组,由任何(?)WP_Query创建,用于查找帖子。
你应该准备在WordPress中使用WP_Query anywhere(核心,主题,子主题,第三方插件,块,小部件等)受此过滤器的影响。假设您限制其使用条件标签,如
is_search
和is_admin
,posts_results
过滤器挂钩应仅应用于搜索(结果)页面。因此,所有块,小部件,直接或间接使用WP_Query的搜索页面上的其他页面可能会受到此过滤器的影响。无限循环
由于WP_Query用于二次查询,并且 * 任何 * 使用WP_Query都会触发
posts_results
过滤器钩子,因此存在无限循环的风险。为了避免此问题,应在调用new WP_Query
之前删除posts_results
回调,在使用WP_Query后重新添加。在if语句中使用条件标记可以删除回调并重新添加。在下面的my_posts_search_results_filter
函数中不需要添加。但是,应该注意防止这些无限循环。WP_Query
WordPress文档是这样描述WP_Query post_type参数的:
[The]默认值为'post'。如果查询设置了'tax_query',则默认值为'any';
然而,测试表明,在二级查询中使用
tax_query
不会在省略post_type
时从自定义帖子类型生成帖子。因此,post_type
必须包含在二级查询参数中,并且必须显式列出任何所需的自定义帖子类型。排序
与SQL UNION一样,排序是在列表合并后完成的。usort用于按
post_date
的降序对合并后的列表进行排序(即最新的帖子优先)。解决方案
字符串