如何根据语言重写自定义帖子类型sl



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

在CPT声明期间,我在gettext中包裹了字符串和sl,以便将它们在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 Translation仍然是一项正在进行的工作,并且是一个功能,它将在下一版本的插件中发布。好的,很好。

当时我要实现的目标是使用WPML更新是插件时要使用的黑客攻击。我的想法是在我的.htaccess中有一些自定义重写规则,并重写这些CPT页面。我认为我可以删除slug翻译以使两种语言都有一个slug,然后具有重写规则,即当某人键入翻译时,slug会得到"标准"一个,但至少内容是正确的,并且:a)用户不会注意到任何内容,因为浏览器不会重定向页面,而只需重写URL,并且B)WP没有任何更改(或它可以?)。

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

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

基本上,我认为在每个页面上运行flush_rewrite_rules()都会让您以您打算的方式本地化页面slug,但是这是一个非常差的解决方案,因为它也将编写.htaccess文件在每个页面上,一旦有多个用户访问该网站,就可以极大地减慢事情的速度,并可能给出奇怪的结果。查看文档,您可以将false作为第一个参数提供,该参数禁用.htaccess的写作,但这仍然不是一个好的解决方案,因为该文档还指出以下内容:

重要:冲洗重写规则是一个昂贵的操作, 是建议在"初始化"上执行它的教程和示例 钩。这是不好的做法。相反,您应该对 插件的激活钩,或者当您知道重写 规则需要更改(例如,增加新的分类法或职位 输入您的代码)。

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

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

$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();

更新:您可能需要检查此线程。

这是可能的。

由于您使用了WPML插件,因此PHP常数I ICL_LANGUAGE_CODE给出了当前的语言。然后,在注册邮政类型的帖子时间中使用以下代码:

 $args = array (
    'labels'            => array (
        'name'              => _x( 'Destination','post type general name',TT_CPT_DOMAIN ),
        'singular_name'     => _x( 'Destination','post type singular name',TT_CPT_DOMAIN ),
        'add_new'           => _x( 'Add Destination','post type general name',TT_CPT_DOMAIN ),
        'edit_item'         => __( 'Edit Destination',TT_CPT_DOMAIN ),
        'not_found_in_trash' => __( 'No Destination found in Trash',TT_CPT_DOMAIN ),
        'taxonomies'        => __('post_tag','category'),
        'parent_item_colon' => '',
        'menu_name'         => __( 'Destination',TT_CPT_DOMAIN ) 
    ),
    'has_archive'       => true,
    'hierarchical'      => true,
    'menu_position'     => 3,
    'supports'          => array ('title'),
    'menu_icon'         => TT_CPT_PLUGIN_URL. 'images/News.png',  
    'rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),
    'menu_icon'              => TT_CPT_PLUGIN_URL . '/cpts/images/icon_news.png'        
);

注意线

rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),

如果您自己处理语言或使用任何其他插件,则可以使用类似的逻辑。祝你好运!

最新更新