WP_QUERY在执行搜索查询之前挂接

时间:2015-10-12 作者:Nicola Boccardi

有人知道在执行搜索查询之前(不在主循环中)是否有一个钩子来更改“s”参数以避免Wordpress的短语分裂吗?欢迎使用示例。。。谢谢

P、 S:我也尝试了以下方法,但sql查询的第一部分似乎表明WP已经完成了搜索,然后重新运行一个由首先找到的post\\u ID过滤的查询:

function alter_the_query( $where = \'\' ) {
global $wpdb, $table_prefix, $wp_query;
$tmpQobj = $wp_query->queried_object;
$tmpTitle = $wp_query->queried_object->post_title;

$where .= $wpdb->prepare( " AND ({$table_prefix}posts.post_title like %s OR {$table_prefix}posts.post_content like %s )", "%{$tmpTitle}%", "%{$tmpTitle}%" );

debug($where);

return $where;
}
add_filter( \'posts_where\', \'alter_the_query\' );
这是debug返回的请求值(*代表表前缀)的内容:

[request] => SELECT SQL_CALC_FOUND_ROWS  ***_posts.ID FROM ***__posts  WHERE 1=1  AND ***__posts.ID IN (534,868,911,917) AND ***__posts.post_type IN (\'multimedia\', \'news\', \'social_project\', \'publication\') AND ((***__posts.post_status = \'publish\')) AND (***__posts.post_title like \'%string to search%\' OR ***__posts.post_content like \'%string to searchs%\' )  ORDER BY FIELD( ***__posts.ID, 534,868,911,917 ) LIMIT 0, 3
如您所见,原始搜索已经完成,我的更改只影响第二个查询。。。我不知道为什么WP核心开发人员会这样做,但这是一场噩梦。。。

我的意思是,我如何钩住第一个查询,即与原始搜索相关的查询?

2 个回复
SO网友:HU ist Sebastian

要避免分割搜索短语,请使用sentence pre\\u get\\u posts挂钩中的查询变量:

function only_search_for_full_phrase( $query ) {
    if ( $query->is_search() && $query->is_main_query() ) {
        $query->set( \'sentence\', true );
    }
}
add_action( \'pre_get_posts\', \'only_search_for_full_phrase\' );
没有测试它,但应该做到这一点。

快乐的编码!

SO网友:Welcher

您正在寻找pre_get_posts

相关推荐

About Hooks and Filters

嗯,我很难理解动作和过滤器之间的区别。我确实在代码中使用动作,但我是一个新手,甚至连一点过滤器都不知道。我去过codex,以及NickTheGeek、BillErickson、GaryJones等的多个网站,但没有去过vein。如果你能用简单的话告诉我,并举例说明动作、过滤器和挂钩的基本内容和区别。非常感谢。