最近的几个项目都开始用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,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
小伙伴们围观一下,用得起正版WPML的有钱人
我用不起正版WPML,打算把网站改成多站点+多语言切换模式。