WordPress多站点下$wpdb->prefix失效及Relevanssi索引配置求助
我拿到了Relevanssi官方支持提供的索引过滤代码,原本单站点下是可用的,但放到多站点环境后完全失效;我自己尝试适配了多站点版本,但同样出现问题——Relevanssi会跳过所有文章,根本不执行索引。我对这类WordPress数据库查询不太熟悉,想请大家帮忙检查我适配的多站点查询是否正确,或者有没有其他需要调整的地方。
官方提供的原代码(单站点曾可用,多站点下失效)
add_filter( 'relevanssi_indexing_restriction', 'rlv_restrict_indexing' ); function rlv_restrict_indexing( $restriction ) { $restriction = "AND post_type IN ('post', 'page') AND post_status = 'publish'"; return $restriction; }
我尝试适配的多站点版本(目前失效,索引全跳过)
add_filter( 'relevanssi_indexing_restriction', 'rlv_multisite_restrict_indexing' ); function rlv_multisite_restrict_indexing( $restriction ) { global $wpdb; $blog_id = get_current_blog_id(); $restriction = "AND {$wpdb->posts}.post_type IN ('post', 'page') AND {$wpdb->posts}.post_status = 'publish' AND {$wpdb->posts}.blog_id = {$blog_id}"; return $restriction; }
问题根源分析
这里的核心问题是你误解了relevanssi_indexing_restriction过滤器的工作方式:
这个过滤器不是让你完全替换查询条件,而是在Relevanssi已经生成的基础查询条件上追加你的自定义规则。如果你直接用$restriction = "..."覆盖原内容,会丢失Relevanssi内置的核心过滤逻辑——比如多站点环境下默认的blog_id过滤、排除私密/ trash内容的条件,甚至可能破坏SQL语句的结构(比如缺少WHERE开头的衔接),导致查询返回空结果,自然就没有文章被索引。
另外,多站点环境下Relevanssi默认已经会自动过滤当前站点的内容(通过wp_posts表的blog_id字段),所以你手动加AND {$wpdb->posts}.blog_id = {$blog_id}其实是重复操作,反而可能因为语法问题出错。
修正后的多站点适配代码
方案1:推荐——在原有条件上追加自定义规则(最安全)
这种方式保留Relevanssi的所有内置过滤逻辑,只追加你需要的限制:
add_filter( 'relevanssi_indexing_restriction', 'rlv_multisite_restrict_indexing' ); function rlv_multisite_restrict_indexing( $restriction ) { // 用 .= 追加条件,而不是替换原$restriction $restriction .= " AND post_type IN ('post', 'page') AND post_status = 'publish'"; return $restriction; }
方案2:完全自定义查询(仅当你明确知道自己在做什么时使用)
如果你确实需要完全控制查询条件,必须保留多站点的核心过滤(blog_id匹配),并且确保SQL语句结构正确:
add_filter( 'relevanssi_indexing_restriction', 'rlv_multisite_restrict_indexing' ); function rlv_multisite_restrict_indexing( $restriction ) { global $wpdb; $blog_id = (int) get_current_blog_id(); // 强制转成整数,避免SQL注入风险 // 注意开头用WHERE,因为Relevanssi会把这个条件拼接到主查询中 $restriction = "WHERE {$wpdb->posts}.blog_id = {$blog_id} AND post_type IN ('post', 'page') AND post_status = 'publish'"; return $restriction; }
额外调试建议
如果还是有问题,可以在函数里添加日志输出,查看最终生成的SQL条件是否符合预期:
add_filter( 'relevanssi_indexing_restriction', 'rlv_multisite_restrict_indexing' ); function rlv_multisite_restrict_indexing( $restriction ) { $restriction .= " AND post_type IN ('post', 'page') AND post_status = 'publish'"; // 输出到debug.log,需要先开启WP_DEBUG error_log( 'Relevanssi索引限制条件:' . $restriction ); return $restriction; }
开启WP_DEBUG后,你可以在wp-content/debug.log里查看生成的SQL片段,检查是否有语法错误或者条件不符合预期的情况。
内容的提问来源于stack exchange,提问作者blackhill24

