You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:57:01