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

WordPress:如何在pre_get_posts中用OR组合查询条件?

WordPress搜索实现OR组合条件的解决方案

你遇到的问题是因为$query->set()设置的参数最终会被转换成AND逻辑的SQL条件,而且后设置的参数会覆盖之前的,所以没法直接用它实现OR组合。要达成post_type = 'specialist' OR (post_parent = '49888' AND post_type = 'page')的搜索条件,需要通过修改SQL查询的WHERE子句来实现,具体代码如下:

实现代码

// 确保搜索范围包含目标文章类型
add_action('pre_get_posts', function($query) {
    if (!is_admin() && $query->is_main_query() && $query->is_search()) {
        $query->set('post_type', array('specialist', 'page'));
    }
});

// 修改WHERE子句添加OR组合条件
add_filter('posts_where', function($where, $query) {
    global $wpdb;

    if (!is_admin() && $query->is_main_query() && $query->is_search()) {
        // 构建自定义OR条件
        $custom_condition = "({$wpdb->posts}.post_type = 'specialist') OR ({$wpdb->posts}.post_type = 'page' AND {$wpdb->posts}.post_parent = '49888')";
        
        // 将自定义条件整合到原有WHERE语句中
        if (strpos($where, 'WHERE 1=1') !== false) {
            $where = str_replace('WHERE 1=1', "WHERE 1=1 AND ($custom_condition)", $where);
        } else {
            $where = "WHERE ($custom_condition)";
        }
    }

    return $where;
}, 10, 2);

代码说明

  1. pre_get_posts动作:先指定搜索的文章类型为specialist和page,避免WordPress默认只搜索普通文章(post类型)。
  2. posts_where过滤器:直接修改SQL查询的WHERE子句,添加我们需要的OR逻辑条件,确保搜索结果要么是specialist类型的内容,要么是父ID为49888的page类型内容。
  3. 两个钩子都做了条件判断,只在前台主搜索查询中生效,不会影响后台或其他页面的查询逻辑。

内容的提问来源于stack exchange,提问作者Dark Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:14