许多主题通常基于 ID 显示特别的文章、页面和分类。 例如首页中的‘专题’文章部分,或者突出强调的分类。
在一些情况下,这些 ID 被硬编码至主题的 PHP 和其他文件中,用户在主题的设置屏幕中选择它们。
要正确显示,主题需要按语言选择 ID。 在 WPML 中,文章、页面、分类和标签的 ID 随着语言的变化而变化,因此主题需要使用活动语言的正确 ID。
WPML 随附一个具有以下功能的 API 函数:
icl_object_id(ID, type, return_original_if_missing)
- ID – 文章、页面、标签或分类的 ID
- type – ‘post’、’page’、’tag’ 或 ‘category’
- return_original_if_missing – true 如果翻译缺失,WPML 则返回原始语言元素的 ID,或 false 如果翻译缺失,WPML 则返回 NULL。
ID 参数可以是任何语言的对象的 ID。 此函数要做的是寻找该对象的翻译组,然后寻找活动语言中对应对象的 ID。
用法示例
icl_object_id(3, 'category', false)
返回作为分类 3 的翻译的分类 ID。如果翻译缺失,则返回 NULL。
如何在主题中使用
如果您在编写需要与 WPML 一起使用的主题,但您也想让它能够独立于 WPML 正确运行,那么您应当通过 function_exists() 调用加入这些调用。 例如,您可以在 functions.php 文件中创建此函数:
function lang_category_id($id){ if(function_exists('icl_object_id')) { return icl_object_id($id,'category',true); } else { return $id; } }
此函数将返回已翻译分类的 ID(如果翻译存在)或原始分类的 ID(如果翻译缺失)。 如果没有安装 WPML,则总是返回原始分类的 WPML。
翻译 ID 的数组
很多时候您需要转换对象 ID 的整个数组(最常见的是分类 ID)。 为此,您可以使用以下函数:
function lang_object_ids($ids_array, $type) { if(function_exists('icl_object_id')) { $res = array(); foreach ($ids_array as $id) { $xlat = icl_object_id($id,$type,false); if(!is_null($xlat)) $res[] = $xlat; } return $res; } else { return $ids_array; } }
此函数也将对象类型接受为一个变量。
例如,要获得分类 1、3 和 6 的分类 ID 的数组,我们将调用:
lang_object_ids(array(1,3,6),'category')