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);
代码说明
- pre_get_posts动作:先指定搜索的文章类型为
specialist和page,避免WordPress默认只搜索普通文章(post类型)。 - posts_where过滤器:直接修改SQL查询的WHERE子句,添加我们需要的OR逻辑条件,确保搜索结果要么是
specialist类型的内容,要么是父ID为49888的page类型内容。 - 两个钩子都做了条件判断,只在前台主搜索查询中生效,不会影响后台或其他页面的查询逻辑。
内容的提问来源于stack exchange,提问作者Dark Wizard
相关产品推荐
相关产品推荐

