优化一下 WPJAM「搜索优化」插件的「只搜索文章标题」功能,代码更简洁,效率更高!
今天写代码的时候,翻到 wp_query
class,发现在 6.2 版本的时候增加了 「search_columns
」参数和 「post_search_columns」
filter,可以指定 WordPress 搜索 posts 表的哪些字段,我将相关代码贴上来,并且加上相关注释,方便大家查看:
// 默认搜索文章标题,摘要和内容
$default_search_columns = array( 'post_title', 'post_excerpt', 'post_content' );
// 如果传递了 search_columns,则使用传递的参数
$search_columns = ! empty( $q['search_columns'] ) ? $q['search_columns'] : $default_search_columns;
if ( ! is_array( $search_columns ) ) {
$search_columns = array( $search_columns );
}
// 可以通过 post_search_columns filter 最后修改一下搜索的字段
$search_columns = (array) apply_filters( 'post_search_columns', $search_columns, $q['s'], $this );
// 最后确保搜索的字段,只能是文章标题/摘要/内容之中的,空则退回使用默认
$search_columns = array_intersect( $search_columns, $default_search_columns );
if ( empty( $search_columns ) ) {
$search_columns = $default_search_columns;
}
我们 WPJAM 的「搜索优化」插件,刚好有个「只搜索文章标题,不搜索文章内容和摘要」功能,我之前是比较复杂的正则替换,把搜索摘要和内容的语句替换成空字符:
add_filter('posts_where', function($where, $wp_query){
if($wp_query->is_search() && !is_admin()){
$placeholder = preg_quote($GLOBALS['wpdb']->placeholder_escape());
return preg_replace('/OR \('.$GLOBALS['wpdb']->posts.'\.(post_content|post_excerpt) LIKE \''.$placeholder.'(.*?)'.$placeholder.'\'\)/', '', $where);
}
}, 10, 2);
现在发现有「post_search_columns」
filter,那就非常简单:
add_filter('post_search_columns', fn()=> 'post_title')
好了,「搜索优化」插件「只搜索文章标题」功能现在就这么简单实现,这样首先代码简单很多,并且效率也会高很多。
嘻嘻,😁 写代码最开心的就是这样,找到新的办法,把旧的效率低或者不好的实现替换过来。😄
最后只需要简单更新一下 「搜索优化」插件就能使用该功能了,「搜索优化」插件是 WordPress 果酱知识星球福利插件,加入「WordPress果酱」知识星球(长按下图二维码)即可下载。
