我的解决方案是安装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等)都应该以这种方式手动进行改革。
另一方面,重写规则的设置似乎是正确的。
如果你对这个话题有更好的建议,请留下一张便条。