: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/* @todo: [WPML 3.3] check if needed in 3.3 */
/* This file includes a set of functions that can be used by WP plugins developers to make their plugins interact with WPML */
define('WPML_API_SUCCESS' , 0);
define('WPML_API_ERROR' , 99);
define('WPML_API_INVALID_LANGUAGE_CODE' , 1);
define('WPML_API_INVALID_TRID' , 2);
define('WPML_API_LANGUAGE_CODE_EXISTS' , 3);
define('WPML_API_CONTENT_NOT_FOUND' , 4);
define('WPML_API_TRANSLATION_NOT_FOUND' , 5);
define('WPML_API_INVALID_CONTENT_TYPE' , 6);
define('WPML_API_CONTENT_EXISTS' , 7);
define('WPML_API_FUNCTION_ALREADY_DECLARED', 8);
define('WPML_API_CONTENT_TRANSLATION_DISABLED', 9);
define('WPML_API_GET_CONTENT_ERROR' , 0);
define('WPML_API_MAGIC_NUMBER', 6);
define('WPML_API_ASIAN_LANGUAGES', 'zh-hans|zh-hant|ja|ko');
define('WPML_API_COST_PER_WORD', 0.09);
function _wpml_api_allowed_content_type($content_type){
return !isset($reserved_types[$content_type]) && preg_match('#([a-z0-9_\-])#i', $content_type);
* Add translatable content to the WPML translations table
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param bool|string $language_code Content language code. (defaults to current language)
* @param bool|int $trid Content trid - if a translation in a different language already exists.
function wpml_add_translatable_content($content_type, $content_id, $language_code = false, $trid = false){
global $sitepress, $wpdb;
if(!_wpml_api_allowed_content_type($content_type)){
return WPML_API_INVALID_CONTENT_TYPE;
if($language_code && !$sitepress->get_language_details($language_code)){
return WPML_API_INVALID_LANGUAGE_CODE;
$trid_type = $wpdb->get_var( $wpdb->prepare(" SELECT element_type
FROM {$wpdb->prefix}icl_translations
WHERE trid = %d ", $trid) );
if(!$trid_type || $trid_type != $content_type){
return WPML_API_INVALID_TRID;
if($wpdb->get_var( $wpdb->prepare(" SELECT translation_id
FROM {$wpdb->prefix}icl_translations
AND element_id=%d", $content_type, $content_id))){
return WPML_API_CONTENT_EXISTS;
$t = $sitepress->set_element_language_details($content_id, $content_type, $trid, $language_code);
* Update translatable content in the WPML translations table
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param string $language_code Content language code.
function wpml_update_translatable_content($content_type, $content_id, $language_code){
if(!_wpml_api_allowed_content_type($content_type)){
return WPML_API_INVALID_CONTENT_TYPE;
if(!$sitepress->get_language_details($language_code)){
return WPML_API_INVALID_LANGUAGE_CODE;
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_CONTENT_NOT_FOUND;
$translations = $sitepress->get_element_translations($trid);
if(isset($translations[$language_code]) && !$translations[$language_code]->element_id != $content_id){
return WPML_API_LANGUAGE_CODE_EXISTS;
$t = $sitepress->set_element_language_details($content_id, $content_type, $trid, $language_code);
* Update translatable content in the WPML translations table
* @deprecated deprecated since 3.2
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param bool|string $language_code Content language code. (when ommitted - delete all translations associated with the respective content)
function wpml_delete_translatable_content($content_type, $content_id, $language_code = false){
if(!_wpml_api_allowed_content_type($content_type)){
return WPML_API_INVALID_CONTENT_TYPE;
if($language_code && !$sitepress->get_language_details($language_code)){
return WPML_API_INVALID_LANGUAGE_CODE;
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_CONTENT_NOT_FOUND;
$translations = $sitepress->get_element_translations($trid);
if(!isset($translations[$language_code])){
return WPML_API_TRANSLATION_NOT_FOUND;
$sitepress->delete_element_translation($trid, $content_type, $language_code);
* Get trid value for a specific piece of content
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @return int trid or 0 for error
function wpml_get_content_trid($content_type, $content_id){
if(!_wpml_api_allowed_content_type($content_type)){
return WPML_API_GET_CONTENT_ERROR; //WPML_API_INVALID_CONTENT_TYPE;
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_GET_CONTENT_ERROR;
* Detects the current language and returns the language relevant content id. optionally it can return the original id if a translation is not found
* See also wpml_object_id_filter() in \template-functions.php
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param bool $return_original return the original id when translation not found.
* @return int trid or 0 for error
function wpml_get_content($content_type, $content_id, $return_original = true){
global $sitepress, $wpdb;
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_GET_CONTENT_ERROR;
if($content_type=='category' || $content_type=='post_tag' || $content_type=='tag'){
$content_id = $wpdb->get_var($wpdb->prepare(" SELECT term_taxonomy_id
FROM {$wpdb->term_taxonomy}
$content_id, $content_type));
if($content_type=='post_tag'){
$icl_element_type = 'tax_post_tag';
}elseif($content_type=='category'){
$icl_element_type = 'tax_category';
}elseif($content_type=='page'){
$icl_element_type = 'post';
$icl_element_type = $content_type;
$trid = $sitepress->get_element_trid($content_id, $icl_element_type);
$translations = $sitepress->get_element_translations($trid, $icl_element_type);
if(isset($translations[ICL_LANGUAGE_CODE]->element_id)){
$ret_element_id = $translations[ICL_LANGUAGE_CODE]->element_id;
if($content_type=='category' || $content_type=='post_tag'){
$ret_element_id = $wpdb->get_var($wpdb->prepare(" SELECT t.term_id
FROM {$wpdb->term_taxonomy} tx
ON t.term_id = tx.term_id
WHERE tx.term_taxonomy_id = %d
AND tx.taxonomy=%s", $ret_element_id, $content_type));
$ret_element_id = $return_original ? $content_id : null;
* Get translations for a certain piece of content
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param bool $skip_missing
* @internal param bool $return_original return the original id when translation not found.
* @return array|int translations or error code
function wpml_get_content_translations($content_type, $content_id, $skip_missing = true){
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_TRANSLATION_NOT_FOUND;
$translations = $sitepress->get_element_translations($trid, $content_type, $skip_missing);
foreach($translations as $k=>$v){
$tr[$k] = $v->element_id;
* Returns a certain translation for a piece of content
* @param string $content_type Content type.
* @param int $content_id Content ID.
* @param bool $language_code
* @return int|array error code or array('lang'=>element_id)
function wpml_get_content_translation($content_type, $content_id, $language_code){
$trid = $sitepress->get_element_trid($content_id, $content_type);
return WPML_API_CONTENT_NOT_FOUND;
$translations = $sitepress->get_element_translations($trid, $content_type, true);
if(!isset($translations[$language_code])){
return WPML_API_TRANSLATION_NOT_FOUND;
return array($language_code => $translations[$language_code]->element_id);
* Returns the list of active languages
* See also wpml_get_active_languages_filter() in \template-functions.php
function wpml_get_active_languages(){
$langs = $sitepress->get_active_languages();
* Get contents of a specific type
* @param string $content_type Content type.
* @param bool $language_code
function wpml_get_contents($content_type, $language_code = false){
global $sitepress, $wpdb;
if($language_code && !$sitepress->get_language_details($language_code)){
return WPML_API_INVALID_LANGUAGE_CODE;
$language_code = $sitepress->get_current_language();
$contents = $wpdb->get_col( $wpdb->prepare("SELECT element_id
FROM {$wpdb->prefix}icl_translations
WHERE element_type = %s AND language_code = %s",
$content_type, $language_code ) );
* Returns the number of the words that will be sent to translation and a cost estimate
* @param bool|string $language - should be specified when the language is one of zh-hans|zh-hant|ja|ko
* @return array (count, cost)
function wpml_get_word_count($string, $language = false){
$asian_languages = explode('|', WPML_API_ASIAN_LANGUAGES);
if($language && in_array($language, $asian_languages)){
$count = ceil(strlen($string)/WPML_API_MAGIC_NUMBER);
}elseif(is_string($string)){
$words = preg_split( '/[\s\/]+/', $string, 0, PREG_SPLIT_NO_EMPTY );
$count = count( $words );
$cost = $count * WPML_API_COST_PER_WORD;
$ret = array('count'=>$count, 'cost'=>$cost);
* Check user is translator
* @param string $from_language Language to translate from
* @param string $to_language Language to translate into
* @return bool (true if translator)
function wpml_check_user_is_translator($from_language, $to_language) {
if($current_user_id = get_current_user_id()){
$translation_languages = $wpdb->get_row($wpdb->prepare("SELECT meta_value
$wpdb->prefix . 'language_pairs'));
if($translation_languages){
foreach (unserialize($translation_languages->meta_value) as $key => $language) {
if ($key == $from_language) {
$is_translator = array_key_exists($to_language, $language);
* Check user is translator
* @param int $post_id Post ID
* @param bool|string $current_language (optional) current language
* @internal param int $form_id Form ID
* @return bool (true if translator)
function wpml_generate_controls($post_id, $cred_form_id , $current_language = false) {
global $sitepress,$sitepress_settings;
$current_language = $sitepress->get_default_language();
if($current_language != $sitepress->get_language_for_element($post_id, 'post_' . get_post_type($post_id)))
$current_language = $sitepress->get_language_for_element($post_id, 'post_' . get_post_type($post_id));
$trid = $sitepress->get_element_trid($post_id,'post_' . get_post_type($post_id));
$translations = $sitepress->get_element_translations($trid, 'post_' . get_post_type($post_id));
foreach ($sitepress->get_active_languages() as $active_language) {
if ($current_language == $active_language['code'] || !wpml_check_user_is_translator($current_language, $active_language['code']))
if (array_key_exists($active_language['code'], $translations)) {
$controls[$active_language['code']]['action'] = 'edit';
$post_url = get_permalink($translations[$active_language['code']]->element_id);
if(false===strpos($post_url,'?') || (false===strpos($post_url,'?') && $sitepress_settings['language_negotiation_type'] != '3')){
$controls[$active_language['code']]['url'] = $post_url.'?action=edit_translation&cred-edit-form='.$cred_form_id; //CRED edit form ID
$controls[$active_language['code']]['url'] = $post_url.'&action=edit_translation&cred-edit-form='.$cred_form_id; //CRED edit form ID
$controls[$active_language['code']]['action'] = 'create';
$post_url = get_permalink($post_id);
if(false===strpos($post_url,'?') || (false===strpos($post_url,'?') && $sitepress_settings['language_negotiation_type'] != '3')){
$controls[$active_language['code']]['url'] = get_permalink($post_id).'?action=create_translation&trid='.$trid.'&to_lang='.$active_language['code'].'&source_lang='.$current_language.'&cred-edit-form='.$cred_form_id; //CRED new form ID
$controls[$active_language['code']]['url'] = get_permalink($post_id).'&action=create_translation&trid='.$trid.'&to_lang='.$active_language['code'].'&source_lang='.$current_language.'&cred-edit-form='.$cred_form_id; //CRED new form ID