gpt4 book ai didi

wordpress - 如何根据语言重写自定义帖子类型 slug?

转载 作者:行者123 更新时间:2023-12-04 15:46:23 27 4
gpt4 key购买 nike

我正在使用 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 更新是插件时使用的一种技巧。我的想法是在我的 .htaccess 中有一些自定义的重写规则,并对这些 CPT 页面进行 URL 重写。我认为我可以删除 slug 翻译,以便为两种语言都使用一个 slug,然后有一个重写规则,当有人输入翻译的 slug 时会得到“标准”一个,但至少内容是正确的,并且:a)用户不会注意到任何事情,因为浏览器不会重定向页面而只是重写 URL,并且 b) WP 没有任何变化(或者它没有变化??)。

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

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

最佳答案

基本上,我认为运行 flush_rewrite_rules()在每个页面加载时,您都可以按照预期的方式本地化页面 slug,但这是一个非常糟糕的解决方案,因为它还会写入 .htaccess每个页面加载的文件都会极大地减慢速度,并且一旦有多个用户访问该站点,可能会产生非常奇怪的结果。看着documentation看来你可以提供false作为第一个参数,它禁用了 .htaccess 的写入,但这仍然不是一个好的解决方案,因为文档还说明了以下内容:

Important: Flushing the rewrite rules is an expensive operation, there are tutorials and examples that suggest executing it on the 'init' hook. This is bad practice. Instead you should flush rewrite rules on the activation hook of a plugin, or when you know that the rewrite rules need to be changed ( e.g. the addition of a new taxonomy or post type in your code ).



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

一个好的起点可能是查看 /wp-includes/rewrite.php并查看是否有可能通过过滤器覆盖给定帖子类型的永久链接,并根据用户语言设置返回一个 slug。另一种选择可能是尝试为每种语言添加第二个永久链接,以便自定义帖子类型中的每个帖子都可以在 register_post_type 中指定的永久链接中使用。以及通过您在别处指定的固定链接。您可以使用 WP_Rewrite 来做到这一点。 ,或者添加一些 mod_rewrite给你的指令.htaccess。在后一种情况下,这样的事情可能会奏效:
$data = 'Rewrit­eRule ^/localized-type-name/(.*)$ /type-name/$1 [R,NC,L]';
// 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
insert_with_markers( ABSPATH . '/.htaccess', 'NAME OF YOUR MARKER', $data );
$wp_rewrite->flush_rules();

更新 :您可能想查看 this thread .

关于wordpress - 如何根据语言重写自定义帖子类型 slug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13117058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com