如何根据语言重写自定义帖子类型的标签?

ale*_*hux 6 wordpress translation url-rewriting http-status-code-404 custom-post-type

我正在使用WordPress建立网站,使用它的方式更像是CMS,然后是博客平台。我充分利用了自定义帖子类型和自定义分类法。最后但并非最不重要的一点是,我使用WPML插件将其设为多语言。

在CPT声明期间,我包装了字符串和子段,gettext以便在WPML中准备翻译。

CPT声明的示例如下:

register_post_type('rooms',
    array(
        'label' => __('Rooms','valletta'),
        'description' => __('','valletta'),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'capability_type' => 'post',
        'hierarchical' => true,
        'rewrite' => array('slug' => __('rooms','valletta')),
        'query_var' => true,
        'exclude_from_search' => false,
        'menu_position' => 25,
        'supports' => array('title','editor','excerpt','custom-fields','comments',),
        'taxonomies' => array('features','typology',),
        'labels' => array (
            'name' => __('Rooms','valletta'),
            'singular_name' => __('room','valletta'),
            'menu_name' => __('Rooms','valletta'),
            'add_new' => __('Add room','valletta'),
            'add_new_item' => __('Add New room','valletta'),
            'edit' => __('Edit','valletta'),
            'edit_item' => __('Edit room','valletta'),
            'new_item' => __('New room','valletta'),
            'view' => __('View room','valletta'),
            'view_item' => __('View room','valletta'),
            'search_items' => __('Search Rooms','valletta'),
            'not_found' => __('No Rooms Found','valletta'),
            'not_found_in_trash' => __('No Rooms Found in Trash','valletta'),
            'parent' => __('Parent room','valletta'),
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

如您所见,我也包装了“笨拙”一词,这(对我而言)完全合理。我想达到的目的是,当用户访问意大利语的“标准”网站时,它将通过/ camere / nome-camera /到达会议室CPT页面,而英语用户则可以通过/ rooms / room-name /获得。这适用于意大利语,并且WPML也可以正确翻译英语版本的子弹,因此如果我在意大利语网站上查看会议室CPT并切换到英语版本,则WordPress被带到/ rooms /,这是唯一的问题显示404。

我检查了WPML网站,他们承认slug的翻译仍在进行中,并且该功能可能会在插件的下一版本中发布。好没关系。

我要实现的目标是在WPML更新插件时使用一个hack。我的想法是在.htaccess中包含一些自定义重写规则,并对这些CPT页面进行URL重写。我以为可以删除段塞翻译,以便对两种语言都拥有一个段塞,然后制定一条重写规则,即当有人键入翻译后的段塞时,它会获得“标准”符号,但至少内容正确,并且:用户不会注意到任何东西,因为浏览器不会重定向页面,而只是重写URL,并且b)WP没有任何改变(或者确实没有改变?)。

所以问题是:我该怎么做?删除slug翻译很好,只需在WPML后端上删除即可,但是我对重写规则等不太满意,因此我正在寻找可以帮助我实现目标的人,并最终展示一种更好的方法来实现目标我需要(如果我的想法有意义,自然会得到反馈)。

对不起,如果我错过了什么。如果您需要更多信息,我在这里给他们。

Sim*_*mon 1

基本上,我认为flush_rewrite_rules()在每个页面加载上运行都会让您按照您想要的方式本地化页面slug,但是这是一个非常糟糕的解决方案,因为它还会在.htaccess每个页面加载上写入文件,这会极大地减慢速度并可能真正给出一旦有多个用户访问该网站,就会出现奇怪的结果。查看文档,您似乎可以提供false第一个参数,这会禁用 .htaccess 的写入,但这仍然不是一个好的解决方案,因为文档还说明了以下内容:

\n\n
\n

重要提示:刷新重写规则是一项昂贵的操作,有教程和示例建议在“init”挂钩上执行它。这是不好的做法。相反,您应该在插件的激活挂钩上刷新重写规则,或者当您知道需要更改重写规则时(例如在代码中添加新的分类法或帖子类型)。

\n
\n\n

每次我自己遇到这个问题时,我最终都会使用适用于两种语言的永久链接结构,但这也不是一个很好的解决方案。

\n\n

一个好的起点可能是检查/wp-includes/rewrite.php并查看是否可以通过过滤器覆盖给定帖子类型的永久链接,并根据用户的语言设置返回一个 slug。另一种选择可能是尝试为每种语言添加第二个永久链接,以便自定义帖子类型中的每个帖子都可以在 中指定的永久链接register_post_type以及通过您在其他地方指定的永久链接访问。您可以使用WP_Rewrite或通过mod_rewrite向 .htaccess 添加一些指令来完成此操作。在后一种情况下,类似这样的事情可能会起作用:

\n\n
$data = \'Rewrit\xc2\xadeRule ^/localized-type-name/(.*)$ /type-name/$1 [R,NC,L]\';\n// You might want to do a little more work on the actual rewrite rule, it\'s very much from the top of my head so it might not even work\ninsert_with_markers( ABSPATH . \'/.htaccess\', \'NAME OF YOUR MARKER\', $data );\n$wp_rewrite->flush_rules();\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:您可能想查看此线程

\n