/**
  * Ajax handler for adding a term via Ajax.
  */
 public static function wpml_save_term()
 {
     if (!wpml_is_action_authenticated('wpml_save_term')) {
         wp_send_json_error('Wrong Nonce');
     }
     global $sitepress;
     $lang = filter_input(INPUT_POST, 'term_language_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
     $taxonomy = filter_input(INPUT_POST, 'taxonomy');
     $slug = filter_input(INPUT_POST, 'slug');
     $name = filter_input(INPUT_POST, 'name');
     $trid = filter_input(INPUT_POST, 'trid', FILTER_SANITIZE_NUMBER_INT);
     $description = filter_input(INPUT_POST, 'description');
     $new_term_object = false;
     if ($name !== "" && $taxonomy && $trid && $lang) {
         $args = array('taxonomy' => $taxonomy, 'lang_code' => $lang, 'term' => $name, 'trid' => $trid, 'overwrite' => true);
         if ($slug) {
             $args['slug'] = $slug;
         }
         if ($description) {
             $args['description'] = $description;
         }
         $res = WPML_Terms_Translations::create_new_term($args);
         if ($res && isset($res['term_taxonomy_id'])) {
             /* res holds the term taxonomy id, we return the whole term objects to the ajax call */
             $new_term_object = get_term_by('term_taxonomy_id', (int) $res['term_taxonomy_id'], $taxonomy);
             $lang_details = $sitepress->get_element_language_details($new_term_object->term_taxonomy_id, 'tax_' . $new_term_object->taxonomy);
             $new_term_object->trid = $lang_details->trid;
             $new_term_object->language_code = $lang_details->language_code;
             WPML_Terms_Translations::icl_save_term_translation_action($taxonomy, $res);
         }
     }
     wp_send_json_success($new_term_object);
 }
 public static function save_term_ajax($sitepress, $lang, $taxonomy, $slug, $name, $trid, $description)
 {
     $new_term_object = false;
     if ($name !== "" && $taxonomy && $trid && $lang) {
         $args = array('taxonomy' => $taxonomy, 'lang_code' => $lang, 'term' => $name, 'trid' => $trid, 'overwrite' => true);
         if ($slug) {
             $args['slug'] = $slug;
         }
         if ($description) {
             $args['description'] = $description;
         }
         $switch_lang = new WPML_Temporary_Switch_Language($sitepress, $lang);
         $res = WPML_Terms_Translations::create_new_term($args);
         $switch_lang->restore_lang();
         if ($res && isset($res['term_taxonomy_id'])) {
             /* res holds the term taxonomy id, we return the whole term objects to the ajax call */
             $switch_lang = new WPML_Temporary_Switch_Language($sitepress, $lang);
             $new_term_object = get_term_by('term_taxonomy_id', (int) $res['term_taxonomy_id'], $taxonomy);
             $switch_lang->restore_lang();
             $lang_details = $sitepress->get_element_language_details($new_term_object->term_taxonomy_id, 'tax_' . $new_term_object->taxonomy);
             $new_term_object->trid = $lang_details->trid;
             $new_term_object->language_code = $lang_details->language_code;
             WPML_Terms_Translations::icl_save_term_translation_action($taxonomy, $res);
         }
     }
     return $new_term_object;
 }
 /**
  * Ajax handler for adding a term via Ajax.
  */
 public static function wpml_save_term()
 {
     global $sitepress;
     $taxonomy = false;
     $lang = false;
     $name = false;
     $slug = false;
     $trid = false;
     $description = false;
     $sync = false;
     $nonce = filter_input(INPUT_POST, '_icl_nonce');
     if (!wp_verify_nonce($nonce, 'wpml_save_term_nonce')) {
         wp_send_json_error('Wrong Nonce');
     }
     if (isset($_POST['term_language_code'])) {
         $lang = $_POST['term_language_code'];
     }
     if (isset($_POST['taxonomy'])) {
         $taxonomy = $_POST['taxonomy'];
     }
     if (isset($_POST['slug'])) {
         $slug = $_POST['slug'];
     }
     if (isset($_POST['name'])) {
         $name = $_POST['name'];
     }
     if (isset($_POST['trid'])) {
         $trid = $_POST['trid'];
     }
     if (isset($_POST['description'])) {
         $description = $_POST['description'];
     }
     if (isset($_POST['force_hierarchical_sync'])) {
         $sync = $_POST['force_hierarchical_sync'];
     }
     $new_term_object = false;
     if ($name && $taxonomy && $trid && $lang) {
         $args = array('taxonomy' => $taxonomy, 'lang_code' => $lang, 'term' => $name, 'trid' => $trid, 'overwrite' => true);
         if ($slug) {
             $args['slug'] = $slug;
         }
         if ($description) {
             $args['description'] = $description;
         }
         $res = WPML_Terms_Translations::create_new_term($args);
         if ($res && isset($res['term_taxonomy_id'])) {
             /* res holds the term taxonomy id, we return the whole term objects to the ajax call */
             $new_term_object = get_term_by('term_taxonomy_id', (int) $res['term_taxonomy_id'], $taxonomy);
             $lang_details = $sitepress->get_element_language_details($new_term_object->term_taxonomy_id, 'tax_' . $new_term_object->taxonomy);
             $new_term_object->trid = $lang_details->trid;
             $new_term_object->language_code = $lang_details->language_code;
             WPML_Terms_Translations::icl_save_term_translation_action($taxonomy, $res);
             if ($sync) {
                 $tree = new WPML_Translation_Tree($taxonomy);
                 $tree->sync_tree($lang, $sync);
             }
         }
     }
     wp_send_json_success($new_term_object);
 }
 /**
  * Ajax handler for adding a term to a post.
  * todo: use the return of this for flat terms. Check its use for hierarchical ones.
  */
 public static function wpml_add_term_to_post()
 {
     $post_id = false;
     $taxonomy = false;
     $lang = false;
     $term_strings = false;
     if (isset($_POST['wpml_lang'])) {
         $lang = $_POST['wpml_lang'];
     }
     if (isset($_POST['wpml_taxonomy'])) {
         $taxonomy = $_POST['wpml_taxonomy'];
     }
     if (isset($_POST['wpml_post_id'])) {
         $post_id = $_POST['wpml_post_id'];
     }
     if (isset($_POST['wpml_terms'])) {
         $term_strings = $_POST['wpml_terms'];
     }
     $args = array('taxonomy' => $taxonomy, 'lang_code' => $lang);
     /*  Hierarchical terms might have a parent element */
     $hierarchical_flag = is_taxonomy_hierarchical($taxonomy);
     if ($hierarchical_flag) {
         if (isset($_POST['wpml_term_parent_id'])) {
             $parent_id = $_POST['wpml_term_parent_id'];
             if ($parent_id) {
                 $args['parent'] = $parent_id;
             }
         }
     }
     $result = array();
     foreach ((array) $term_strings as $term_string) {
         if (!$term_string) {
             continue;
         }
         $args['term'] = (string) $term_string;
         if ($post_id) {
             $res = WPML_Terms_Translations::create_term_on_post($post_id, $args);
         } else {
             $res = WPML_Terms_Translations::create_new_term($args);
         }
         if ($res) {
             $new_term_object = get_term_by('term_taxonomy_id', (int) $res, $taxonomy);
             if ($new_term_object) {
                 if ($hierarchical_flag) {
                     /* These are to be displayed as selected in the post edit screen */
                     $new_term_object->selected = true;
                     /* These are only created one at a time, so they have their special index in the result */
                     $result['new_h_term'] = $new_term_object;
                 } else {
                     $result[] = $new_term_object;
                 }
             }
         }
     }
     wp_send_json_success($result);
 }
 /**
  * Manages the creation of new taxonomy terms from metadata values
  *
  * @since 2.20
  *
  * @param	mixed 	string or array value returned by the rule
  * @param	string 	field name or taxonomy name
  * @param	integer post ID to be evaluated
  * @param	string 	category/scope to evaluate against: iptc_exif_standard_mapping, iptc_exif_taxonomy_mapping or iptc_exif_custom_mapping
  * @param	array 	attachment_metadata, default NULL
  *
  * @return	array	updated rule EXIF/Template value
  */
 public static function mla_mapping_new_text($new_text, $setting_key, $post_id, $category, $attachment_metadata)
 {
     global $sitepress;
     static $replicate = NULL, $current_language, $taxonomies, $other_languages;
     if ('iptc_exif_taxonomy_mapping' !== $category) {
         return $new_text;
     }
     if (is_null($replicate)) {
         $replicate = 'checked' == MLACore::mla_get_option('term_mapping_replication', false, false, MLA_WPML::$mla_language_option_definitions);
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $replicate = ' . var_export( $replicate, true ), 0 );
         //$term_utils = new WPML_Terms_Translations();
         $current_language = $sitepress->get_current_language();
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $current_language = ' . var_export( $current_language, true ), 0 );
         $taxonomies = $sitepress->get_translatable_taxonomies(true, 'attachment');
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $taxonomies = ' . var_export( $taxonomies, true ), 0 );
         $other_languages = $sitepress->get_active_languages();
         unset($other_languages[$current_language]);
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $other_languages = ' . var_export( $other_languages, true ), 0 );
     }
     if (!empty($new_text) && in_array($setting_key, $taxonomies)) {
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text mapping rule = ' . var_export( self::$current_mapping_rule, true ), 0 );
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $new_text = ' . var_export( $new_text, true ), 0 );
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $setting_key = ' . var_export( $setting_key, true ), 0 );
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $post_id = ' . var_export( $post_id, true ), 0 );
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $category = ' . var_export( $category, true ), 0 );
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $attachment_metadata = ' . var_export( $attachment_metadata, true ), 0 );
         $language_details = $sitepress->get_element_language_details($post_id, 'post_attachment');
         $item_language = $language_details->language_code;
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $language_details = ' . var_export( $language_details, true ), 0 );
         /*
          * Find the parent term and its translations
          */
         if (isset(self::$current_mapping_rule['parent'])) {
             if ($parent_term = absint(self::$current_mapping_rule['parent'])) {
                 $parent_term = self::_get_relevant_term('id', $parent_term, $setting_key);
             }
         } else {
             $parent_term = 0;
         }
         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $parent_term = ' . var_export( $parent_term, true ), 0 );
         $new_terms = array();
         foreach ($new_text as $new_name) {
             $relevant_term = self::_get_relevant_term('name', $new_name, $setting_key);
             //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $relevant_term = ' . var_export( $relevant_term, true ), 0 );
             if ($relevant_term) {
                 if (isset($relevant_term['translations'][$item_language])) {
                     $new_terms[] = absint($relevant_term['translations'][$item_language]->term_id);
                 }
             } else {
                 /*
                  * Always create the new term in the current language
                  */
                 if ($parent_term && isset($parent_term['translations'][$current_language])) {
                     $parent = $parent_term['translations'][$current_language]->term_id;
                 } else {
                     $parent = 0;
                 }
                 //error_log( __LINE__ . ' MLA_Polylang::mla_mapping_new_text $parent = ' . var_export( $parent, true ), 0 );
                 $args = array('taxonomy' => $setting_key, 'lang_code' => $current_language, 'term' => $new_name, 'parent' => $parent);
                 $res = WPML_Terms_Translations::create_new_term($args);
                 //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $res = ' . var_export( $res, true ), 0 );
                 /*
                  * Add translations in the other languages?
                  */
                 if ($replicate) {
                     $trid = $sitepress->get_element_trid($res['term_taxonomy_id'], 'tax_' . $setting_key);
                     //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $trid = ' . var_export( $trid, true ), 0 );
                     $original_term = get_term($res['term_id'], $setting_key, OBJECT, 'no');
                     //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $original_term = ' . var_export( $original_term, true ), 0 );
                     $args = array('trid' => $trid, 'source_language' => $current_language, 'term' => $new_name, 'original_id' => $res['term_id'], 'original_tax_id' => $res['term_taxonomy_id'], 'taxonomy' => $setting_key, 'update_translations' => true);
                     foreach ($other_languages as $language => $language_details) {
                         if ($parent_term && isset($parent_term['translations'][$language])) {
                             $parent = $parent_term['translations'][$language]->term_id;
                         } else {
                             $parent = 0;
                         }
                         //error_log( __LINE__ . ' MLA_Polylang::mla_mapping_new_text $parent = ' . var_export( $parent, true ), 0 );
                         $translated_slug = apply_filters('icl_duplicate_generic_string', $original_term->slug, $language, array('context' => 'taxonomy_slug', 'attribute' => $setting_key, 'key' => $original_term->term_id));
                         $translated_slug = WPML_Terms_Translations::term_unique_slug($translated_slug, $setting_key, $language);
                         //error_log( __LINE__ . ' MLA_Polylang::mla_mapping_new_text $translated_slug = ' . var_export( $translated_slug, true ), 0 );
                         $args['slug'] = $translated_slug;
                         $args['parent'] = $parent;
                         $args['lang_code'] = $language;
                         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $args = ' . var_export( $args, true ), 0 );
                         $res = WPML_Terms_Translations::create_new_term($args);
                         //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $res = ' . var_export( $res, true ), 0 );
                     }
                 }
                 // replicate
                 /*
                  * Reload the term with all of its new translations
                  */
                 $relevant_term = self::_get_relevant_term('name', $new_name, $setting_key, NULL, false, true);
                 //error_log( __LINE__ . ' MLA_WPML::mla_mapping_new_text $relevant_term = ' . var_export( $relevant_term, true ), 0 );
                 if (isset($relevant_term['translations'][$item_language])) {
                     $new_terms[] = absint($relevant_term['translations'][$item_language]->term_id);
                 }
             }
             // new term
         }
         // foreach new_name
         MLACore::mla_debug_add(__LINE__ . " MLA_WPML::mla_mapping_new_text( {$setting_key}, {$post_id} ) \$new_terms = " . var_export($new_terms, true), MLACore::MLA_DEBUG_CATEGORY_AJAX);
         return $new_terms;
     }
     // translated taxonomy
     return $new_text;
 }