许多主题通常基于 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')