项目中提炼出来的一些WPML实用函数

本站所有文章均为博主人工写作,绝无AI辅助成分,请放心参阅。

最近的几个项目都开始用WPML,一边做一边查询官方文档和论坛,提炼出一些实用函数,记录在此。

获得当前页面的language Code

1
echo ICL_LANGUAGE_CODE;

这个变量直接输出当前页面语言编码,比如默认的英语就是“en”,法语就是“fr”。
需要知道,国际标准语言代码中,简体中文和繁体中文分别是zh-hans和zh-hant,WPML遵循此标准。建议不要在WPML内自定义language code,这将降低WPML和其他插件的兼容可能,增加踩坑概率。

获取指定页面ID和language code修正后的ID

WPML的保存机制是为每个语言单独生成一篇文章,因此要调用特定语言的文章,只要知道它对应其他任何一个语种的一篇文章的ID就可以用这个函数输出:

1
icl_object_id(ID, type, return_original_if_missing,language_code);

icl_object_id的官方文档:http://wpml.org/documentation/support/creating-multilingual-wordpress-themes/language-dependent-ids/

获取指定页面的permalink

由于受到language code的影响,WordPress默认的permalink可能会给出404错误,这是一个解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
function get_permalink_current_language( $post_id ){
	$language = ICL_LANGUAGE_CODE;
	$lang_post_id = icl_object_id( $post_id , 'hotel', true, $language );
	$url = "";
	if($lang_post_id != 0) {
		$url = get_permalink( $lang_post_id );
	}else {
		//如果找不到就返回对应当前语言的首页
		global $sitepress;
		$url = $sitepress->language_url( $language );
	}
	return $url;
}

2021年1月4日更新一个新的方法:

1
echo apply_filters( 'wpml_permalink', $ori_url, 'zh-hant' ) ;

$ori_url为转换前的URL,此方法可以转换任何URL的语言,不过需要注意的是,如果页面的slug也被翻译了,就需要用这个代码:

1
echo apply_filters( 'wpml_permalink', $ori_url, 'zh-hant', true ) ;

通过文章ID查询对应的语言

这个函数利用$wpdb查询出任何一篇文章所对应的language code,很实用!

1
2
3
4
5
6
function get_langcode_post_id($post_id){
	global $wpdb;
	$query = $wpdb->prepare('SELECT language_code FROM ' . $wpdb->prefix . 'icl_translations WHERE element_id="%d"', $post_id);
	$query_exec = $wpdb->get_row($query);
	return $query_exec->language_code;
}

有了以上函数,就能正确的实现带language code的伪静态了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
add_filter('post_type_link', 'custom_hotel_link', 1, 3);
function custom_hotel_link( $link, $post = 0 ){
	if ( $post->post_type == 'hotel' ){//以hotel文章类型为例
		return home_url( 'hotels/' . $post->ID .'.html?lang='.get_langcode_post_id($post->ID) );
	}else {
		return $link;
	}
}
add_action( 'init', 'custom_hotel_rewrites_init' );
function custom_hotel_rewrites_init(){
	add_rewrite_rule(
		'hotels/([0-9]+)?.html$',
		'index.php?post_type=hotel&p=$matches[1]',
		'top' );
}

进行非当前语言的查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
global $sitepress;
//存储当前语言到变量$current_lang
$current_lang = $sitepress->get_current_language();
//切换语言到英语
$sitepress->switch_lang("en");
 
$myposts = get_posts( array( 
	'numberposts'=>9999,
	'post_type' => 'hotel', 
	'orderby' => 'title',
	'order' => 'ASC',
	'suppress_filters' => 0
) );
foreach( $myposts as $post ) {
	......
}
wp_reset_postdata();
 
//切换回当前页面语言
$sitepress->switch_lang($current_lang);

更多使用函数还在整理中,随时更新…

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1030.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

2 关于 “项目中提炼出来的一些WPML实用函数” 的评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注