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

WPML环境下创建多语言独立页面Feed及OOP闭包报错解决

解决WPML多语言独立Feed创建中的闭包错误问题

你遇到的「Object of class Closure could not be converted to string」错误,根源在于add_feed函数的回调格式要求:当你用array($this, $callable)这种类方法回调形式时,第二个元素必须是字符串类型的方法名,但你传入了一个闭包对象,PHP尝试把闭包转成字符串时自然就报错了。

下面给你两种简洁可行的解决方案,适配你的OOP代码结构:

方案1:直接传递闭包作为回调(推荐,PHP 5.4+支持)

在类内部的闭包中,你可以通过use ($this, $lang)直接捕获当前类实例和语言参数,不需要用数组形式的回调:

private function createLanguageFeeds(){
    global $wp_rewrite; // 别忘了声明全局的$wp_rewrite变量
    $feedsAdded = false; // 标记是否需要刷新规则
    
    foreach($this->wpml_languages as $lang){
        $feedname = $this->feedname . '_' . $lang;
        
        if ( ! in_array( $feedname, $wp_rewrite->feeds ) ) {
            $wp_rewrite->feeds[] = $feedname;
            $feedsAdded = true;
        }
        
        // 直接传递闭包作为add_feed的回调
        add_feed( $feedname, function() use ($lang, $this) {
            $this->create_page_feed($lang);
        } );
    }
    
    // 只在添加新Feed后刷新一次规则,避免重复调用影响性能
    if ($feedsAdded) {
        flush_rewrite_rules( false );
    }
}

private function create_page_feed($lang){
    // 这里编写对应语言的页面Feed输出逻辑
    // 比如根据$lang筛选WPML对应的页面
}

方案2:绑定do_feed_{$feedname}钩子(更贴合WP钩子机制)

add_feed本质上会为每个Feed注册一个do_feed_{$feedname}的动作钩子,你可以直接绑定这个钩子,闭包在这里可以正常使用:

private function createLanguageFeeds(){
    global $wp_rewrite;
    $feedsAdded = false;
    
    foreach($this->wpml_languages as $lang){
        $feedname = $this->feedname . '_' . $lang;
        
        if ( ! in_array( $feedname, $wp_rewrite->feeds ) ) {
            $wp_rewrite->feeds[] = $feedname;
            $feedsAdded = true;
        }
        
        // 绑定对应Feed的动作钩子,闭包直接传递$lang参数
        add_action( "do_feed_{$feedname}", function() use ($lang, $this) {
            $this->create_page_feed($lang);
        } );
    }
    
    if ($feedsAdded) {
        flush_rewrite_rules( false );
    }
}

private function create_page_feed($lang){
    // 你的Feed输出逻辑
}

额外注意事项

  • 不要在循环中多次调用flush_rewrite_rules,这会严重影响性能,建议只在有新Feed添加时调用一次。
  • 确保你的PHP版本在5.4及以上(现在WordPress的最低要求已经满足这个条件),这样闭包才能正常捕获$this。
  • 在create_page_feed方法中,你可以利用WPML的函数(比如icl_object_id或者语言筛选逻辑)来输出对应语言的页面内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:19:09