WordPress自定义文章类型XML生成冗余link标签问题解决
原因分析
WPML(sitepress-multilingual-cms)自动在XML的product节点中添加标签,是插件默认的多语言SEO优化机制——它会为每个关联了多语言翻译的文章生成对应语言版本的链接,目的是帮助搜索引擎识别内容的多语言变体,提升多语言站点的索引效率。
这个逻辑通常通过rss2_item动作钩子或者专门的XML内容过滤钩子实现,只要站点启用了WPML的多语言功能,且自定义文章类型“product”被设置为可翻译,插件就会自动触发该注入行为。
去除方法
以下是几种可行的解决方案,根据你的XML生成场景选择:
1. 全局禁用WPML的XML链接注入
如果不需要所有文章类型的XML中都包含多语言链接,可以直接移除WPML对应的动作钩子。将以下代码添加到主题的functions.php文件中:
// 移除WPML在RSS/XML中添加的翻译链接 remove_action('rss2_item', 'wpml_add_link_to_translated_post'); // 针对atom格式XML,可同时移除对应钩子 remove_action('atom_entry', 'wpml_add_link_to_translated_post');
2. 仅针对product自定义文章类型禁用
如果只想保留其他文章类型的多语言XML链接,仅对product类型做限制,可以用条件判断结合钩子调整:
add_action('init', function() { // 先移除全局动作 remove_action('rss2_item', 'wpml_add_link_to_translated_post'); // 重新添加动作,仅对非product类型执行WPML的链接注入 add_action('rss2_item', function() { global $post; if ($post->post_type !== 'product') { wpml_add_link_to_translated_post(); } }); });
3. 自定义XML生成函数中手动过滤
如果是你自己编写的XML生成代码(而非WordPress默认RSS feed),可以在获取post数据时过滤掉WPML的翻译链接数据:
// 过滤WPML的翻译信息,阻止product类型生成多语言链接 add_filter('wpml_post_translations', function($translations, $post_id) { $post = get_post($post_id); if ($post && $post->post_type === 'product') { return []; // 返回空数组,中断翻译链接生成逻辑 } return $translations; }, 10, 2);
注意事项
- 不同版本的WPML可能使用的钩子名略有差异,如果上述代码无效,可以查看WPML插件源码,搜索
wpml_add_link_to_translated_post或translated_post相关的动作/过滤器。 - 修改主题文件前建议先备份,或者使用自定义插件来添加这些代码,避免主题更新时丢失修改。
内容的提问来源于stack exchange,提问作者George Fragkos
相关产品推荐
相关产品推荐

