WordPress LIKE查询未按预期返回数据,代码问题排查求助
问题排查与修复方案
核心错误点
- 错误使用
meta_query查询文章标题:post_title是WordPress posts数据表的原生内置字段,不属于自定义元字段(存储在post_meta表),你当前的写法会在post_meta表中查找键名为post_title的自定义字段,自然无法匹配到文章标题的内容。 - 缺少输入参数校验:直接读取
$_GET['search']未做存在性判断和内容过滤,容易触发PHP警告以及SQL注入风险。
修复代码
方案1:默认搜索(同时匹配标题+文章内容)
如果你的需求是搜索关键词匹配文章标题和内容,直接使用WP_Query原生的s参数即可:
elseif ( isset( $_GET['search'] ) && !empty( $_GET['search'] ) ) { $args = array( 'post_type' => 'head_to_toe_videos', 'post_status' => 'publish', 's' => sanitize_text_field( $_GET['search'] ), 'posts_per_page' => 12, ); }
方案2:仅匹配文章标题
如果需要搜索关键词仅匹配文章标题,不需要匹配内容,需要额外加查询过滤钩子,代码如下:
// 先在主题functions.php或者插件中添加标题匹配过滤函数 function wpse_search_only_title( $where, $wp_query ) { global $wpdb; if ( $wp_query->is_search && $wp_query->get( 'search_only_title' ) ) { $where .= " AND {$wpdb->posts}.post_title LIKE '%" . $wpdb->esc_like( $wp_query->get( 's' ) ) . "%'"; } return $where; } add_filter( 'posts_where', 'wpse_search_only_title', 10, 2 ); // 你的查询代码修改为: elseif ( isset( $_GET['search'] ) && !empty( $_GET['search'] ) ) { $args = array( 'post_type' => 'head_to_toe_videos', 'post_status' => 'publish', 's' => sanitize_text_field( $_GET['search'] ), 'search_only_title' => true, // 触发仅匹配标题的过滤规则 'posts_per_page' => 12, ); }
上述代码中sanitize_text_field是WordPress自带的文本过滤函数,用来过滤用户输入的非法内容,$wpdb->esc_like是用来转义搜索关键词中的SQL特殊字符,避免注入风险。
内容的提问来源于stack exchange,提问作者Vishu asodiya
相关产品推荐
相关产品推荐

