我正在使用 WordPress 构建一个网站,它更像是一个 CMS,而不是一个博客平台。我大量使用了自定义帖子类型和自定义分类法。最后但并非最不重要的一点是,我使用 WPML 插件使它成为多语言。
在 CPT 声明期间,我包装了字符串和 slug,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'),
)
)
);
正如你所看到的,我也包含了 slug 术语,这(对我来说)非常有意义。我想要实现的是,当用户访问意大利语的“标准”网站时,将通过 /camere/nome-camera/ 到达房间 CPT 页面,而英语用户将通过 /rooms/room-name/ 获得它。这适用于意大利语,并且 WPML 也可以正确翻译英语版本的 slug,所以如果我在意大利语网站上查看房间 CPT 并切换到英语版本,WordPress 会被带到 /rooms/,唯一的问题是它显示 404。
我查看了 WPML 网站,他们承认 slugs 翻译仍在进行中,并且可能会在插件的下一个版本中发布。好没问题。
然后我想要实现的是在 WPML 更新是插件时使用的 hack。我的想法是在我的 .htaccess 中有一些自定义重写规则,并对这些 CPT 页面进行 URL 重写。我认为我可以删除 slug 翻译,以便为两种语言提供一个 slug,然后有一个重写规则,当有人键入翻译的 slug 时,会得到“标准”,但至少内容是正确的,并且:a)用户不会注意到任何事情,因为浏览器不会重定向页面,而只会重写 URL,并且 b) WP 没有任何变化(或者它不会改变??)。
所以问题是:我怎样才能做到这一切?删除 slug 翻译很好,只是在 WPML 后端删除,但我对重写规则等不太满意,所以我正在寻找帮助我实现目标的人,并最终展示更好的方法来实现什么我需要(如果我的想法是否合理,自然会有反馈)。
对不起,如果我错过了什么。如果您需要更多信息,我会在这里给他们。