Custom Post Type slug和WPML获取404错误

时间:2018-03-19 作者:Gregory

我确实有一个关于新wordpress开发的奇怪问题。

我在这个网站上有许多CPT和WPML(默认语言是“法语”)。

例如,我有一个自定义的帖子类型:“marche”(法语市场)。

我在里面添加了一个默认语言(法语)的市场(名为“Gordes”),我用信息填充它。

市场是正确的,可在以下位置访问:

-https://www.beprovence.be/marche/gordes.html

url正常,slug正常,一切正常。(默认语言)。

然后,我在WPML设置中激活翻译字符串,并定义EN&;“marche”的NL字符串。

然后我用荷兰语(NL)翻译市场,复制法语内容,问题就从这里开始了:

在back office上,生成的URL与默认语言中的URL相同(在FR中用slug代替NL和/NL/不显示)例如:

-https://www.beprovence.be/nl/marche/gordes.html

那一定是

-https://www.beprovence.be/nl/markt/gordes.html (这里没有404,页面正常)。

即使我在搜索框中搜索“gordes”,url也是相同的(法语),并转到404而不是NL版本。

最后一个bug,在我的语言选择器中,在这些CPT上,活动语言(NL)下的链接是相同的,显示法语slug。当我查看FR链接时,它仍然有/nl/代替/FR/

我已经在WPML论坛和google上阅读了数百篇帖子,但我仍然无法摆脱这些bug。(我在所有自定义帖子上都有相同的bug)。

如果需要,这里是我的CPT代码。

function marches_CPT() {

  // Post Type
  $labels = array(
    \'name\' => \'Marchés\',
    \'all_items\' => \'Tous les marchés\',
    \'singular_name\' => \'Marché\',
    \'add_new_item\' => \'Ajouter un camping\',
    \'edit_item\' => "Modifier le marché",
    \'menu_name\' => \'Be | Marchés\'
  );

  $args = array(
    \'labels\' => $labels,
    \'public\' => true,
    \'has_archive\' => true,
    \'capability_type\' => \'page\',
    //added rewrite for test purpose, with it or without, same problem
    \'rewrite\' => array(\'slug\' => \'marche\'),
    \'supports\' => array(\'title\', \'editor\',\'thumbnail\',\'custom-fields\'),
    \'menu_position\' => 12,
    \'menu_icon\' => \'dashicons-cart\',
  );

  register_post_type(\'marche\',$args);

}

add_action(\'init\', \'marches_CPT\', \'0\');
提前感谢您的宝贵帮助。

1 个回复
SO网友:chrisiwien

我的解决方案是安装WordPress(版本5.2.2),因为翻译只安装了WPML多语言CMS(版本4.2.7.1)。

The modules WPML String Translation (which is very performance-consuming) and WPML Translation Management are not required.

我正在使用这个WPML url结构:www.url。com/en/postname。

我的自定义帖子类型应该有德语的slug“produkte”,英语的“products”,捷克语的“produkty”。In this example i\'m using "produkte" as the custom post type slug of my source language, and "products" and "produkty" for the other languages. Replace this words with your slugs, add languages as you need.

首先,为自定义帖子定义的重写段分配一个变量,而不是一个固定的名称(是的,它可以…;-):

if( ICL_LANGUAGE_CODE == "de" ) $stt_product_slug = \'produkte\';
if( ICL_LANGUAGE_CODE == "en" ) $stt_product_slug = \'products\';
if( ICL_LANGUAGE_CODE == "cs" ) $stt_product_slug = \'produkty\';

  register_post_type( \'stt-products\',
    array( \'labels\' => array( \'name\' => \'Products\', \'singular_name\' => \'Product\' ),
        \'public\' => true,
        \'has_archive\' => true,
        \'supports\' => array(\'title\',\'custom-fields\',\'editor\',\'thumbnail\',\'revisions\',\'page-attributes\'),
        \'hierarchical\' => true,
        \'rewrite\' => array( \'slug\' => $stt_product_slug, \'with-front\' => false )
    ));
Note: 必须在“init”挂钩中调用自定义post类型注册

转到Wordpress管理/永久链接,单击“保存更改”,不做任何更改:flush_rewrite_rules() 调用一次,因此应在数据库表wp\\u options,option name“rewrite\\u rules”中生成源语言段塞名称(my case DE“produkte”)的重写规则。

进入wp\\u options表,将选项名称“rewrite\\u rules”、“option\\u value”的所有文本复制到文本编辑器中(例如记事本++)。数据库字段的值在编辑器中显示为一行。为便于编辑,请替换的所有条目

";s:
使用

";\\ns:
找出为“produkte”添加的重写规则。例如,一个入口对看起来像:
s:11:"produkte/?$"; s:32:"index.php?post_type=stt-products";
每一对都应转换为:
add_rewrite_rule( \'^produkte/?$\', \'index.php?post_type=stt-products\' );
创建一个包含所有格式正确的重写规则的列表。然后,立即将“produkte”替换为“products”。复制整个重写规则列表,将其粘贴在下面,并将“products”替换为“produkty”,等等。

然后,您应该准备几个块,如下所示:

add_rewrite_rule( \'^products/?$\', \'index.php?post_type=stt-products\' );
.
.
.
以及

add_rewrite_rule( \'^produkty/?$\', \'index.php?post_type=stt-products\' );
.
.
.

Copy and paste this blocks beneath you custom post type registration in the \'init\' hook. Go to Wordpress admin and press Permalinks/Save changes again (for writing the new rewrite rules in the database).

现在,翻译的自定义post类型slug应该可以工作了。

如果没有,请进入数据库中的wp\\u options表,并在选项\\u name rewrite\\u rules下检查是否添加了新的重写规则。Wordpress对正确的语法相当挑剔,如果规则格式不好,将拒绝规则,恕不另行通知

此外,您必须手动自定义语言切换,例如:

function stt_wpml_language_switch() {
    $languages = icl_get_languages(\'skip_missing=0&orderby=KEY&order=DIR\');
    if(!empty($languages)){
        echo \'<ul>\';
        foreach($languages as $l) {
            if( ICL_LANGUAGE_CODE == "de" ) {
                if( $l[\'code\'] == "en" ) $l[\'url\'] = str_replace( "produkte", "products", $l[\'url\'] );
                if( $l[\'code\'] == "cs" ) $l[\'url\'] = str_replace( "produkte", "produkty", $l[\'url\'] );
            }
            if( ICL_LANGUAGE_CODE == "en" ) {
                if( $l[\'code\'] == "de" ) $l[\'url\'] = str_replace( "products", "produkte", $l[\'url\'] );
                if( $l[\'code\'] == "cs" ) $l[\'url\'] = str_replace( "products", "produkty", $l[\'url\'] );
            }
            if( ICL_LANGUAGE_CODE == "cs" ) {
                if( $l[\'code\'] == "de" ) $l[\'url\'] = str_replace( "produkty", "produkte", $l[\'url\'] );
                if( $l[\'code\'] == "en" ) $l[\'url\'] = str_replace( "produkty", "products", $l[\'url\'] );
            }
            echo \'<li>\';
            if(!$l[\'active\']) echo \'<a href="\'.$l[\'url\'].\'" class="stt-languageswitch-link">\';
            if($l[\'active\']) echo \'<span class="wpml-ls-current-language">\' . icl_disp_language($l[\'native_name\']) . \'</span>\';
            if(!$l[\'active\']) echo icl_disp_language($l[\'native_name\']);
            if(!$l[\'active\']) echo \'</a>\';
            echo \'</li>\';
        }
        echo \'</ul>\';
    }
}
当然,所有翻译后的自定义post类型slug的特定语言呈现(例如header.php、footer.php等)都应该以这种方式手动进行改革。

另一方面,重写规则的设置似乎是正确的。

如果你对这个话题有更好的建议,请留下一张便条。

结束

相关推荐