GIF89A;
Server : Microsoft-IIS/10.0 System : Windows NT HMW9050 6.2 build 9200 (Unknow Windows version Standard Edition) i586 User : fatorc ( 0) PHP Version : 5.3.28 Disable Function : escapeshellarg, escapeshellcmd, exec, passthru, proc_close, proc_open, shell_exec, system, dl, popen, php_check_syntax, php_strip_whitespace, symlink, link, openlog, apache_child_terminate Directory : e:/home/fatorc/Web/wp-content/plugins/types/library/toolset/types/embedded/includes/ |
Upload File : |
<?php /* * @since Types 1.2 * * All WPML specific functions should be moved here. * * Mind wpml_action parameter for field. * Values: * 0 nothing (ignore), 1 copy, 2 translate * * */ add_action( 'wpcf_after_init', 'wpcf_wpml_init' ); add_action( 'init', 'wpcf_wpml_warnings_init', PHP_INT_MAX ); // Only when WPML active if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); // Relationship filter get_children query add_filter( 'wpcf_relationship_get_children_query', 'wpcf_wpml_relationship_get_children_query', 10, 5 ); add_filter( 'types_fields', 'wpcf_wpml_fields_filter', 10, 3 ); add_filter( 'types_post_type', 'wpcf_wpml_post_types_translate', 10, 3 ); add_filter( 'types_taxonomy', 'wpcf_wpml_taxonomy_translate', 10, 3 ); /* * * Filter terms used when: * - Displaying Group form * - Filtering Group on post edit screen */ add_filter( 'wpcf_group_form_filter_terms', 'wpcf_wpml_group_form_filter_terms_filter' ); add_filter( 'wpcf_post_group_filter_settings', 'wpcf_wpml_post_group_filter_taxonomies', 10, 4 ); /* * Add untranslated IDs to form */ add_filter( 'wpcf_form_fields', 'wpcf_wpml_group_filter_add_missing_terms', 10, 2 ); // Sync add_action( 'wpcf_post_type_renamed', 'wpcf_wpml_post_type_renamed', 10, 2 ); add_action( 'wpcf_taxonomy_renamed', 'wpcf_wpml_taxonomy_renamed', 10, 2 ); // Relationship save child language add_action( 'wpcf_relationship_save_child', 'wpcf_wpml_relationship_save_child', 10, 2 ); // Dissallow WPML to delete fields in translated posts add_action( 'wpcf_postmeta_before_delete', 'wpcf_wpml_remove_delete_postmeta_hook_remove', 10, 2 ); add_action( 'wpcf_postmeta_after_delete', 'wpcf_wpml_remove_delete_postmeta_hook_add', 10, 2 ); add_action( 'wpcf_postmeta_before_delete_repetitive', 'wpcf_wpml_remove_delete_postmeta_hook_remove', 10, 2 ); add_action( 'wpcf_postmeta_after_delete_repetitive', 'wpcf_wpml_remove_delete_postmeta_hook_add', 10, 2 ); // Fix saving repetitive add_action( 'wpcf_postmeta_before_add_repetitive', 'wpcf_wpml_sync_postmeta_hook_remove', 10, 2 ); add_action( 'wpcf_postmeta_before_add_last_repetitive', 'wpcf_wpml_sync_postmeta_hook_add', 10, 2 ); add_action( 'wpcf_postmeta_after_add_repetitive', 'wpcf_wpml_sync_postmeta_hook_add', 10, 2 ); // Fix to set correct parent and children for duplicated posts add_action( 'icl_make_duplicate', 'wpcf_wpml_duplicated_post_relationships', 20, 4); } /** * Adds wpml_action property. * * @param type $fields * @return array */ function wpcf_wpml_fields_filter( $fields ) { foreach ( $fields as &$field ) { $field = wpcf_wpml_field_filter( $field ); } return $fields; } /** * Adds wpml_action property. * * @global type $iclTranslationManagement * @param type $field * @return array */ function wpcf_wpml_field_filter( $field ) { global $iclTranslationManagement; $actions = array( 'ignore' => 0, 'copy' => 1, 'translate' => 2, ); $action = isset( $field['wpml_action'] ) ? $field['wpml_action'] : null; // Always use TM settings if available if ( defined( 'WPML_TM_VERSION' ) && !empty( $iclTranslationManagement ) ) { if ( isset( $iclTranslationManagement->settings['custom_fields_translation'][$field['meta_key']] ) ) { $action = intval( $iclTranslationManagement->settings['custom_fields_translation'][$field['meta_key']] ); } } if ( is_null( $action ) || !is_numeric( $action ) ) { if ( isset( $actions[strval( $action )] ) ) { $action = intval( $actions[strval( $action )] ); } else if ( isset( $field['type'] ) ) { $action = wpcf_wpml_get_action_by_type( $field['type'] ); } } $field['wpml_action'] = intval( $action ); return $field; } /** * Returns WPML action by field type. * * @param type $type * @return type */ function wpcf_wpml_get_action_by_type( $type ) { return in_array( $type, array('date', 'skype', 'numeric', 'phone', 'image', 'file', 'email', 'url') ) ? 1 : 2; } function wpcf_wpml_init() { global $wpcf; // Init object $wpcf->wpml = new stdClass(); // Holds all processed terms in current form $wpcf->wpml->group_form_filter_taxonomies_filtered = array(); // Holds all translated terms if on language other than default $wpcf->wpml->group_form_filter_taxonomies_translated = array(); } /** * WPML translate call. * * @param string $name name of translated string * @param mixed $string value to translate, but process only strings * @param string $context context of translation * @return string translated string */ function wpcf_translate( $name, $string, $context = 'plugin Types' ) { /** * do not translate if $string is not a string or is empty */ if ( empty($string) || !is_string($string) ) { return $string; } /** * translate */ return apply_filters( 'wpml_translate_single_string', stripslashes( $string ), $context, $name ); } /** * Registers WPML translation string. * * @param type $context * @param type $name * @param type $value */ function wpcf_translate_register_string( $context, $name, $value, $allow_empty_value = false ) { if ( function_exists( 'icl_register_string' ) ) { icl_register_string( $context, $name, stripslashes( $value ), $allow_empty_value ); } } /** * Relationship filter get_children query. * * @param type $_query string for get_posts() * @param type $parent Parent * @param type $post_type Children post type * @param type $data Saved data * @param type $field Ordering field (optional) */ function wpcf_wpml_relationship_get_children_query( $query, $parent, $post_type, $data, $field = null ) { global $sitepress; // Check if children post type is translatable if ( !$sitepress->is_translated_post_type( $post_type ) ) { $query['lang'] = 'all'; } return $query; } /** * WPML editor filter * * @param type $cf_name * @return type */ function wpcf_icl_editor_cf_name_filter( $cf_name ) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $fields = wpcf_admin_fields_get_fields(); if ( empty( $fields ) ) { return $cf_name; } $cf_name = substr( $cf_name, 6 ); if ( strpos( $cf_name, WPCF_META_PREFIX ) == 0 ) { $cf_name = str_replace( WPCF_META_PREFIX, '', $cf_name ); } if ( isset( $fields[$cf_name]['name'] ) ) { $cf_name = wpcf_translate( 'field ' . $fields[$cf_name]['id'] . ' name', $fields[$cf_name]['name'] ); } return $cf_name; } /** * WPML editor filter * * @param type $cf_name * @param type $description * @return type */ function wpcf_icl_editor_cf_description_filter( $description, $cf_name ) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $fields = wpcf_admin_fields_get_fields(); if ( empty( $fields ) ) { return $description; } $cf_name = substr( $cf_name, 6 ); if ( strpos( $cf_name, WPCF_META_PREFIX ) == 0 ) { $cf_name = str_replace( WPCF_META_PREFIX, '', $cf_name ); } if ( isset( $fields[$cf_name]['description'] ) ) { $description = wpcf_translate( 'field ' . $fields[$cf_name]['id'] . ' description', $fields[$cf_name]['description'] ); } return $description; } /** * WPML editor filter * * @param type $cf_name * @param type $style * @return type */ function wpcf_icl_editor_cf_style_filter( $style, $cf_name ) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $fields = wpcf_admin_fields_get_fields(); if ( empty( $fields ) ) { return $style; } $cf_name = substr( $cf_name, 6 ); if ( strpos( $cf_name, WPCF_META_PREFIX ) == 0 ) { $cf_name = str_replace( WPCF_META_PREFIX, '', $cf_name ); } if ( isset( $fields[$cf_name]['type'] ) && $fields[$cf_name]['type'] == 'textarea' ) { $style = 1; } if ( isset( $fields[$cf_name]['type'] ) && $fields[$cf_name]['type'] == 'wysiwyg' ) { $style = 2; } return $style; } /** * Bulk translation. */ function wpcf_admin_bulk_string_translation() { if ( !function_exists( 'icl_register_string' ) ) { return false; } require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-types.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-taxonomies.php'; // Register groups $groups = wpcf_admin_fields_get_groups(); foreach ( $groups as $group_id => $group ) { $group_wpml = new Types_Wpml_Field_Group( Types_Field_Group_Post_Factory::load( $group['slug'] ) ); $group_wpml->register(); } // Register fields $fields = wpcf_admin_fields_get_fields(); foreach ( $fields as $field_id => $field ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' name', $field['name'] ); if ( isset( $field['description'] ) ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' description', $field['description'] ); } // For radios or select if ( !empty( $field['data']['options'] ) ) { foreach ( $field['data']['options'] as $name => $option ) { if ( $name == 'default' ) { continue; } if ( isset( $option['title'] ) ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title'] ); } if ( wpcf_wpml_field_is_translated( $field ) ) { if ( isset( $option['value'] ) ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value'] ); } } if ( isset( $option['display_value'] ) ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value'] ); } } } if ( $field['type'] == 'checkbox' && (isset( $field['set_value'] ) && $field['set_value'] != '1') ) { // we need to translate the check box value to store wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value'] ); } if ( $field['type'] == 'checkbox' && !empty( $field['display_value_selected'] ) ) { // we need to translate the check box value to store wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected'] ); } if ( $field['type'] == 'checkbox' && !empty( $field['display_value_not_selected'] ) ) { // we need to translate the check box value to store wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected'] ); } // Validation message if ( !empty( $field['data']['validate'] ) ) { foreach ( $field['data']['validate'] as $method => $validation ) { if ( !empty( $validation['message'] ) ) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages( $method ); if ( $validation['message'] != $default_message ) { wpcf_translate_register_string( 'plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message'] ); } } } } } // Register types $custom_types = get_option( WPCF_OPTION_NAME_CUSTOM_TYPES, array() ); foreach ( $custom_types as $post_type => $data ) { wpcf_custom_types_register_translation( $post_type, $data ); } // Register taxonomies $custom_taxonomies = get_option( WPCF_OPTION_NAME_CUSTOM_TAXONOMIES, array() ); foreach ( $custom_taxonomies as $taxonomy => $data ) { wpcf_custom_taxonimies_register_translation( $taxonomy, $data ); } } function wpcf_post_relationship_set_translated_children( $parent_post_id ) { // WPML check if it's translation of a child // Fix up the parent if it's the child of a related post and it doesn't yet have a parent if ( function_exists( 'icl_object_id' ) ) { $post = get_post( $parent_post_id ); global $sitepress; $ulanguage = $sitepress->get_language_for_element( $parent_post_id, 'post_' . $post->post_type ); remove_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); $original_post_id = icl_object_id( $parent_post_id, $post->post_type, false ); if ( !empty( $original_post_id ) ) { // it has a translation $original_post = get_post( $original_post_id ); if ( !empty( $original_post ) ) { // look for _wpcf_belongs_xxxx_id fields. $meta_key = '_wpcf_belongs_' . $original_post->post_type . '_id'; global $wpdb; $query = sprintf( 'SELECT post_id FROM %s WHERE meta_key= %%s AND meta_value= %%d', $wpdb->postmeta ); $original_children = $wpdb->get_col( $wpdb->prepare( $query, $meta_key, $original_post_id ) ); foreach ( $original_children as $child_id ) { $child_post = get_post( $child_id ); // set if the child is tranlated $translated_child_id = icl_object_id( $child_id, $child_post->post_type, false, $ulanguage ); if ( $translated_child_id ) { // Set the parent to be the translated parent update_post_meta( $translated_child_id, $meta_key, $parent_post_id ); } } } } add_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); } } function wpcf_post_relationship_set_translated_parent( $child_post_id ) { // WPML check if it's translation of a child // Fix up the parent if it's the child of a related post and it doesn't yet have a parent if ( function_exists( 'icl_object_id' ) ) { remove_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); $post = get_post( $child_post_id ); $original_post_id = icl_object_id( $child_post_id, $post->post_type, false ); if ( !empty( $original_post_id ) ) { // it has a translation $original_post = get_post( $original_post_id ); if ( !empty( $original_post ) ) { // look for _wpcf_belongs_xxxx_id fields. $metas = get_post_custom( $original_post->ID ); foreach ( $metas as $meta_key => $meta ) { if ( strpos( $meta_key, '_wpcf_belongs_' ) !== false ) { $meta_post = get_post( $meta[0] ); if ( !empty( $meta_post ) ) { global $sitepress; $ulanguage = $sitepress->get_language_for_element( $child_post_id, 'post_' . $post->post_type ); $meta_translated_id = icl_object_id( $meta_post->ID, $meta_post->post_type, false, $ulanguage ); if ( $meta_translated_id ) { // Set the parent to be the translated parent update_post_meta( $child_post_id, $meta_key, $meta_translated_id ); } } } } } } add_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); } } /** * Returns translated '_wpcf_belongs_XXX_id' if any. * * @global type $sitepress * @param type $value * @param type $object_id * @param type $meta_key * @param type $single * @return type */ function wpcf_wpml_relationship_meta_belongs_filter( $value, $object_id, $meta_key, $single ) { // WPML check if it's translation of a child // Only force if meta is not already set if ( empty( $value ) && function_exists( 'icl_object_id' ) && strpos( $meta_key, '_wpcf_belongs_' ) !== false ) { $post = get_post( $object_id ); $original_post_id = icl_object_id( $object_id, $post->post_type, false ); if ( !empty( $original_post_id ) ) { remove_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); $original_post_meta = get_post_meta( $original_post_id, $meta_key, true ); add_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); if ( !empty( $original_post_meta ) ) { $meta_post = get_post( $original_post_meta ); if ( !empty( $meta_post ) ) { global $sitepress; $ulanguage = $sitepress->get_language_for_element( $object_id, 'post_' . $post->post_type ); $meta_translated_id = icl_object_id( $meta_post->ID, $meta_post->post_type, false, $ulanguage ); if ( !empty( $meta_translated_id ) ) { if ($single) { $value = $meta_translated_id; } else { $value = array($meta_translated_id); } } } } } } return $value; } /** * Adjust translated IDs. * * @global type $sitepress * @param type $parent_post_id */ function wpcf_wpml_relationship_save_post_hook( $parent_post_id ){ // WPML check if it's translation of a child // Fix up the parent if it's the child of a related post and it doesn't yet have a parent if ( function_exists( 'icl_object_id' ) ) { remove_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); $post = get_post( $parent_post_id ); $original_post_id = icl_object_id( $parent_post_id, $post->post_type, false ); if ( !empty( $original_post_id ) ) { // it has a translation $original_post = get_post( $original_post_id ); if ( !empty( $original_post ) ) { // look for _wpcf_belongs_xxxx_id fields. $metas = get_post_custom( $original_post->ID ); foreach ( $metas as $meta_key => $meta ) { if ( strpos( $meta_key, '_wpcf_belongs_' ) !== false ) { $meta_post = get_post( $meta[0] ); $exists = get_post_meta( $parent_post_id, $meta_key, true ); if ( !empty( $meta_post ) && empty( $exists ) ) { global $sitepress; $ulanguage = $sitepress->get_language_for_element( $parent_post_id, 'post_' . $post->post_type ); $meta_translated_id = icl_object_id( $meta_post->ID, $meta_post->post_type, false, $ulanguage ); // Only force if meta is not already set if ( !empty( $meta_translated_id ) ) { update_post_meta( $parent_post_id, $meta_key, $meta_translated_id ); } } } } } } add_filter( 'get_post_metadata', 'wpcf_wpml_relationship_meta_belongs_filter', 10, 4 ); } } /** * Registers translation data. * * @param type $post_type * @param type $data */ function wpcf_custom_types_register_translation( $post_type, $data ) { if ( !function_exists( 'icl_register_string' ) ) { return $data; } if ( isset( $data['description'] ) ) { wpcf_translate_register_string( 'Types-CPT', $post_type . ' description', $data['description'] ); } wpcf_wpml_register_labels( $post_type, $data, 'post_type' ); } /** * Registers translation data. * * @param type $post_type * @param type $data */ function wpcf_custom_taxonimies_register_translation( $taxonomy, $data ) { if ( !function_exists( 'icl_register_string' ) ) { return $data; } if ( isset( $data['description'] ) ) { wpcf_translate_register_string( 'Types-TAX', $taxonomy . ' description', $data['description'] ); } wpcf_wpml_register_labels( $taxonomy, $data, 'taxonomy' ); } /** * Registers labels. * * @param type $prefix * @param type $data * @param type $context */ function wpcf_wpml_register_labels( $prefix, $data, $context = 'post' ) { foreach ( $data['labels'] as $label => $string ) { switch ( $context ) { case 'taxonomies': case 'taxonomy': case 'tax': $default = wpcf_custom_taxonomies_default(); if ( $label == 'name' || $label == 'singular_name' ) { wpcf_translate_register_string( 'Types-TAX', $prefix . ' ' . $label, $string ); continue; } if ( isset( $default['labels'][$label] ) && $string == $default['labels'][$label] ) { wpcf_translate_register_string( 'Types-TAX', $label, $string ); } else { wpcf_translate_register_string( 'Types-TAX', $prefix . ' ' . $label, $string ); } break; default: $default = wpcf_custom_types_default(); // Name and singular_name if ( $label == 'name' || $label == 'singular_name' ) { wpcf_translate_register_string( 'Types-CPT', $prefix . ' ' . $label, $string ); continue; } // Check others for defaults if ( isset( $default['labels'][$label] ) && $string == $default['labels'][$label] ) { // Register default translation wpcf_translate_register_string( 'Types-CPT', $label, $string ); } else { wpcf_translate_register_string( 'Types-CPT', $prefix . ' ' . $label, $string ); } break; } } } /** * Translates data. * * @param type $post_type * @param type $data */ function wpcf_wpml_post_types_translate( $data, $post_type ) { if ( !function_exists( 'icl_t' ) ) { return $data; } $default = wpcf_custom_types_default(); if ( !empty( $data['description'] ) ) { $data['description'] = wpcf_translate( $post_type . ' description', $data['description'], 'Types-CPT' ); } foreach ( $data['labels'] as $label => $string ) { if ( $label == 'name' || $label == 'singular_name' ) { $data['labels'][$label] = wpcf_translate( $post_type . ' ' . $label, $string, 'Types-CPT' ); continue; } if ( !isset( $default['labels'][$label] ) || $string !== $default['labels'][$label] ) { $data['labels'][$label] = wpcf_translate( $post_type . ' ' . $label, $string, 'Types-CPT' ); } else { $data['labels'][$label] = wpcf_translate( $label, $string, 'Types-CPT' ); } } return $data; } /** * Translates data. * * @param type $taxonomy * @param type $data */ function wpcf_wpml_taxonomy_translate( $data, $taxonomy ) { if ( !function_exists( 'icl_t' ) ) { return $data; } $default = wpcf_custom_taxonomies_default(); if ( !empty( $data['description'] ) ) { $data['description'] = wpcf_translate( $taxonomy . ' description', $data['description'], 'Types-TAX' ); } foreach ( $data['labels'] as $label => $string ) { if ( $label == 'name' || $label == 'singular_name' ) { $data['labels'][$label] = wpcf_translate( $taxonomy . ' ' . $label, $string, 'Types-TAX' ); continue; } if ( !isset( $default['labels'][$label] ) || $string !== $default['labels'][$label] ) { $data['labels'][$label] = wpcf_translate( $taxonomy . ' ' . $label, $string, 'Types-TAX' ); } else { $data['labels'][$label] = wpcf_translate( $label, $string, 'Types-TAX' ); } } return $data; } /** * Filters terms on Group form filter. * * Do not complicate this, just replace term ID * with corresponding original ID. * * @param array $terms array of terms objects. * @return array */ function wpcf_wpml_group_form_filter_terms_filter( $terms ) { global $sitepress, $wpdb, $wpcf; foreach ( $terms as $k => $term ) { // Mark it $wpcf->wpml->group_form_filter_taxonomies_filtered[$term->term_taxonomy_id] = $term->term_taxonomy_id; // Only on other language if ( $sitepress->get_default_language() != $sitepress->get_current_language() ) { // Get original term $original_term_id = icl_object_id( $term->term_id, $term->taxonomy, true, $sitepress->get_default_language() ); // Only if translation found if ( $term->term_id != $original_term_id ) { /* * * Note that WPML will return term_id. */ $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND t.term_id = %d LIMIT 1", $term->taxonomy, $original_term_id ) ); if ( !empty( $_term ) ) { // Mark it $wpcf->wpml->group_form_filter_taxonomies_translated[$term->term_taxonomy_id] = array( 'original_term_taxonomy_id' => $term->term_taxonomy_id, 'term_taxonomy_id' => $_term->term_taxonomy_id, 'term_id' => $_term->term_id, ); // Adjust Ids $term->term_taxonomy_id = $_term->term_taxonomy_id; $term->term_id = $_term->term_id; } else { $wpcf->debug->errors['wpml']['missing_original_term'][] = $term; } } $terms[$k] = $term; } } return $terms; } /** * Adjusts term_id in group filter in post edit screen. * * @global type $sitepress * @global object $wpdb * @param type $group * @return type */ function wpcf_wpml_post_group_filter_taxonomies( $group, $post, $context, $post_terms ) { global $sitepress, $wpdb; if (empty( $post->ID )) { return $group; } $post_language = $sitepress->get_language_for_element( $post->ID, 'post_' . $post->post_type ); // Only on other language if ( empty( $post_language ) || $sitepress->get_default_language() == $post_language ) { return $group; } if ( !empty( $group['_wp_types_group_terms'] ) ) { foreach ( $group['_wp_types_group_terms'] as $key => $term ) { // Skip 'all' setting if ( strval( $term ) === 'all' ) { continue; } // Get term $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.term_taxonomy_id = %d LIMIT 1", $term ) ); if ( !empty( $_term ) ) { // Get translated term $translated_term_id = icl_object_id( $_term->term_id, $_term->taxonomy, true, $post_language ); if ( $translated_term_id != $_term->term_id ) { $translated_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d LIMIT 1", $translated_term_id ) ); $group['_wp_types_group_terms'][$key] = $translated_term->term_taxonomy_id; } } } } return $group; } /** * Append missing terms from saved filter. * * If terms are added in another language and still valid, * append them as 'hidden' fields. That way we keep terms in sync if swithing * languages in admin area. * * @global type $wpcf * @param type $form * @param type $settings * @return string */ function wpcf_wpml_group_filter_add_missing_terms( $form, $settings ) { global $wpcf; $add_terms = array(); // Loop over saved settings and see if omitted from form if ( !empty( $settings['taxonomies'] ) ) { foreach ( $settings['taxonomies'] as $taxonomy => $terms ) { foreach ( $terms as $term_taxonomy_id => $term ) { // skip 'Uncategorized' because WPML handles each per language if ( $term_taxonomy_id == 1 ) { continue; } /* * Check if term is filtered out, but existing in saved option * and if it's not translated already. */ if ( !isset( $wpcf->wpml->group_form_filter_taxonomies_filtered[$term_taxonomy_id] ) ) { $_add = true; foreach ( $wpcf->wpml->group_form_filter_taxonomies_translated as $_translated_term ) { if ( $_translated_term['term_taxonomy_id'] == $term_taxonomy_id ) { $_add = false; } } if ( $_add ) { // Now check if it's still valid $term_ok = get_term_by( 'id', $term_taxonomy_id, $taxonomy ); // Add form extension to terms radios if ( !empty( $term_ok ) ) { $add_terms['wpml_add_terms_' . $term_taxonomy_id] = array( '#type' => 'hidden', '#name' => 'wpcf[group][taxonomies][' . $taxonomy . '][' . $term_taxonomy_id . ']', '#value' => $term_taxonomy_id, ); } } } } } } return $form + $add_terms; } /** * Sync when slug changed. * * @global type $sitepress * @global type $sitepress_settings * @param type $new_slug * @param type $old_slug */ function wpcf_wpml_post_type_renamed( $new_slug, $old_slug ) { global $sitepress, $sitepress_settings, $wpdb; if ( isset( $sitepress_settings['custom_posts_sync_option'][$old_slug] ) ) { $sitepress_settings['custom_posts_sync_option'][$new_slug] = $sitepress_settings['custom_posts_sync_option'][$old_slug]; unset( $sitepress_settings['custom_posts_sync_option'][$old_slug] ); $sitepress->save_settings( $sitepress_settings ); /* * Update slug in icl_strings table */ $wpdb->update( $wpdb->prefix . 'icl_strings', array( 'name' => 'URL slug: ' . $new_slug, 'value' => $new_slug, ), array( 'name' => 'URL slug: ' . $old_slug, 'context' => 'URL slugs - wpcf', ) ); } } /** * Sync when slug changed. * * @global type $sitepress * @global type $sitepress_settings * @param type $new_slug * @param type $old_slug */ function wpcf_wpml_taxonomy_renamed( $new_slug, $old_slug ) { global $sitepress, $sitepress_settings, $wpdb; if ( isset( $sitepress_settings['taxonomies_sync_option'][$old_slug] ) ) { $sitepress_settings['taxonomies_sync_option'][$new_slug] = $sitepress_settings['taxonomies_sync_option'][$old_slug]; unset( $sitepress_settings['taxonomies_sync_option'][$old_slug] ); $sitepress->save_settings( $sitepress_settings ); /* * Update term in WPML table as used in WPML * wpml/menu/troubleshooting.php * case 'link_taxonomy': */ $wpdb->update( $wpdb->prefix . 'icl_translations', array('element_type' => 'tax_' . $new_slug), array('element_type' => 'tax_' . $old_slug) ); } } /** * Relationship save child language. * * @global type $sitepress * @param type $child * @param type $parent */ function wpcf_wpml_relationship_save_child( $child, $parent ) { $lang_details = apply_filters('wpml_post_language_details', null, $parent->ID); if ( ! $lang_details ) { global $sitepress; //Here we still need to create an action, so we have to stick with this dependency for the time being $sitepress->set_element_language_details( $child->ID, 'post_' . $child->post_type, null, $lang_details->language_code ); } } /** * Checks if field is copied on post edit screen. * * @global type $sitepress * @param type $field * @param type $post * @return boolean */ function wpcf_wpml_field_is_copied( $field, $post = null ) { if ( defined( 'ICL_SITEPRESS_VERSION' ) && defined( 'WPML_TM_VERSION' ) && !defined( 'DOING_AJAX' ) ) { if ( !wpcf_wpml_post_is_original( $post ) ) { return wpcf_wpml_have_original( $post ) && wpcf_wpml_field_is_copy( $field ); } } return false; } /** * Checks if field is copied on profile edit screen. * * @global type $sitepress * @param type $field * @return boolean */ function wpcf_wpml_is_translated_profile_page( $field ) { if ( defined( 'ICL_SITEPRESS_VERSION' ) && defined( 'WPML_TM_VERSION' ) && !defined( 'DOING_AJAX' ) ) { global $sitepress; if ( $sitepress->get_default_language() !== $sitepress->get_current_language() ) { return wpcf_wpml_field_is_copy( $field ); } } return false; } /** * Checks if field is copied. * * @param type $field * @return type */ function wpcf_wpml_field_is_copy( $field ) { if ( !defined( 'WPML_TM_VERSION' ) ) return false; return isset( $field['wpml_action'] ) && intval( $field['wpml_action'] ) === 1; } /** * Checks if field is translated. * * @param type $field * @return type */ function wpcf_wpml_field_is_translated( $field ) { if ( !defined( 'WPML_TM_VERSION' ) ) return false; return isset( $field['wpml_action'] ) && intval( $field['wpml_action'] ) === 2; } /** * Checks if field is ignored. * * @param type $field * @return type */ function wpcf_wpml_field_is_ignored( $field ) { if ( !defined( 'WPML_TM_VERSION' ) ) return true; return !wpcf_wpml_field_is_copy( $field ) && !wpcf_wpml_field_is_translated( $field ); } /** * Determine if post is in original language. * * @global type $sitepress * @global type $pagenow * @param type $field * @param type $post * @return boolean */ function wpcf_wpml_post_is_original( $post = null ) { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { global $sitepress, $pagenow; // WPML There is no lang on new post if ( $pagenow == 'post-new.php' ) { $post_type = wpcf_admin_get_edited_post_type(); $current_lang = isset( $_GET['lang'] ) ? sanitize_text_field( $_GET['lang'] ) : $sitepress->get_current_language(); if ( in_array( $post_type, array_keys( $sitepress->get_translatable_documents() ) ) ) { return $sitepress->get_default_language() == $current_lang; } } else { if ( empty( $post->ID ) ) { $post = wpcf_admin_get_edited_post(); } if ( !empty( $post->ID ) ) { if ( in_array( $post->post_type, array_keys( $sitepress->get_translatable_documents() ) ) ) { $post_lang = $sitepress->get_element_language_details( $post->ID, 'post_' . $post->post_type ); // Suggestion from Black Studio // http://wp-types.com/forums/topic/major-bug-on-types-when-setting-fields-to-be-copied-wo-wpml-translated-posts/#post-146182 if ( isset( $post_lang->source_language_code ) ) { return $post_lang->source_language_code == null; // return $sitepress->get_default_language() == $post_lang->language_code; } } } } } return true; } function wpcf_wpml_have_original( $post = null ) { static $cache = array(); global $pagenow; $res = false; // WPML There is no lang on new post if ( $pagenow == 'post-new.php' ) { return isset( $_GET['trid'] ); } if ( empty( $post->ID ) ) { $post = wpcf_admin_get_edited_post(); } if ( !empty( $post->ID ) ) { $cache_key = $post->ID; if ( isset( $cache[$cache_key] ) ) { return $cache[$cache_key]; } global $wpdb, $sitepress; $post_lang = $sitepress->get_element_language_details( $post->ID, 'post_' . $post->post_type ); if ( isset( $post_lang->language_code ) ) { $sql = $wpdb->prepare( "SELECT trid FROM {$wpdb->prefix}icl_translations WHERE language_code = %s AND element_id = %d AND element_type = %s AND source_language_code IS NOT NULL", $post_lang->language_code, $post->ID, sprintf('post_%s', $post->post_type) ); $res = (bool) $wpdb->get_var( $sql ); } $cache[$cache_key] = $res; } return $res; } /** * Removes temporarily hook to avoid deleting custom fields from translated post. * * @global type $sitepress * @param type $post * @param type $field */ function wpcf_wpml_remove_delete_postmeta_hook_remove( $post, $field ) { if ( wpcf_wpml_field_is_translated( $field ) ) { global $sitepress; remove_action( 'delete_postmeta', array($sitepress, 'delete_post_meta') ); } } /** * Re-enables hook. * * @see wpcf_wpml_remove_delete_postmeta_hook_remove() * @global type $sitepress * @param type $post * @param type $field */ function wpcf_wpml_remove_delete_postmeta_hook_add( $post, $field ) { if ( wpcf_wpml_field_is_translated( $field ) ) { global $sitepress; add_action( 'delete_postmeta', array($sitepress, 'delete_post_meta') ); } } /** * Removes temporarily hook to fix asving repetitive fields. * * @global type $sitepress * @param type $post * @param type $field */ function wpcf_wpml_sync_postmeta_hook_remove( $post, $field ) { global $sitepress; remove_action( 'updated_post_meta', array($sitepress, 'update_post_meta'), 100, 4 ); remove_action( 'added_post_meta', array($sitepress, 'update_post_meta'), 100, 4 ); remove_action( 'updated_postmeta', array($sitepress, 'update_post_meta'), 100, 4 ); // ajax remove_action( 'added_postmeta', array($sitepress, 'update_post_meta'), 100, 4 ); // ajax } /** * Re-enables hook. * * @see wpcf_wpml_remove_delete_postmeta_hook_remove() * @global type $sitepress * @param type $post * @param type $field */ function wpcf_wpml_sync_postmeta_hook_add( $post, $field ) { global $sitepress; add_action( 'updated_post_meta', array($sitepress, 'update_post_meta'), 100, 4 ); add_action( 'added_post_meta', array($sitepress, 'update_post_meta'), 100, 4 ); add_action( 'updated_postmeta', array($sitepress, 'update_post_meta'), 100, 4 ); // ajax add_action( 'added_postmeta', array($sitepress, 'update_post_meta'), 100, 4 ); // ajax add_action( 'delete_postmeta', array($sitepress, 'delete_post_meta') ); // ajax } function wpcf_wpml_warnings_init() { if(!defined('WPML_ST_PATH') || !class_exists( 'ICL_AdminNotifier' )) return; /** * check is configuration done?! */ global $sitepress, $sitepress_settings; if ( function_exists('icl_get_setting') && icl_get_setting('st') ) { return; } /** * do that only when version of WPML is lower then 3.2 */ if ( defined('ICL_SITEPRESS_VERSION') && version_compare( ICL_SITEPRESS_VERSION, '3.2', '<' ) ) { if (isset($sitepress_settings[ 'st' ]) && $sitepress->get_default_language() != $sitepress_settings[ 'st' ][ 'strings_language' ] ) { wp_types_default_language_warning(); } elseif (isset($sitepress_settings[ 'st' ]) && $sitepress_settings[ 'st' ][ 'strings_language' ] != 'en' ) { wp_types_st_language_warning(); } else { ICL_AdminNotifier::removeMessage( 'wp_types_default_language_warning' ); ICL_AdminNotifier::removeMessage( 'wp_types_st_language_warning' ); } } } /** * Display all relevant WPML admin notices of the "wp-types" group. */ function wpcf_wpml_warning() { if(!defined('ICL_SITEPRESS_VERSION') || !defined('WPML_ST_PATH') || !class_exists( 'ICL_AdminNotifier' )) return; ICL_AdminNotifier::displayMessages('wp-types'); } /** * Handle notification messages for WPML String Translation when default language is != 'en' */ function wp_types_default_language_warning() { if ( class_exists( 'ICL_AdminNotifier' ) && defined( 'ICL_SITEPRESS_VERSION' ) ) { ICL_AdminNotifier::removeMessage( 'wp_types_st_language_warning' ); static $called = false; if ( !$called ) { global $sitepress; $languages = $sitepress->get_active_languages(); $translation_languages = array(); foreach ( $languages as $language ) { if ( $language[ 'code' ] != 'en' ) { $translation_languages[ ] = $language[ 'display_name' ]; } } $last_translation_language = $translation_languages[ count( $translation_languages ) - 1 ]; unset( $translation_languages[ count( $translation_languages ) - 1 ] ); $translation_languages_list = is_Array( $translation_languages ) ? implode( ', ', $translation_languages ) : $translation_languages; $message = 'Because your default language is not English, you need to enter all strings in English and translate them to %s and %s.'; $message .= ' '; $message .= '<strong><a href="%s" target="_blank">Read more</a></strong>'; $message = __( $message, 'Read more string-translation-default-language-not-english', 'wpml-string-translation' ); $message = sprintf( $message, $translation_languages_list, $last_translation_language, 'http://wpml.org/faq/string-translation-default-language-not-english/' ); $fallback_message = _( '<a href="%s" target="_blank">How to translate strings when default language is not English</a>' ); $fallback_message = sprintf( $fallback_message, 'http://wpml.org/faq/string-translation-default-language-not-english/' ); ICL_AdminNotifier::addMessage( 'wp_types_default_language_warning', $message, 'icl-admin-message icl-admin-message-information', true, $fallback_message, false, 'wp-types' ); $called = true; } } } /** * Handle notification messages for WPML String Translation when default language and ST language is != 'en' */ function wp_types_st_language_warning() { global $sitepress, $sitepress_settings; if ( class_exists( 'ICL_AdminNotifier' ) && defined( 'ICL_SITEPRESS_VERSION' ) ) { ICL_AdminNotifier::removeMessage( 'wp_types_default_language_warning' ); static $called = false; if ( !$called && isset($sitepress_settings[ 'st' ])) { $st_language_code = $sitepress_settings[ 'st' ][ 'strings_language' ]; $st_language = $sitepress->get_display_language_name($st_language_code, $sitepress->get_admin_language()); $st_page_url = admin_url('admin.php?page='.WPML_ST_FOLDER.'/menu/string-translation.php'); $message = 'The strings language in your site is set to %s instead of English. '; $message .= 'This means that all English texts that are hard-coded in PHP will appear when displaying content in %s.'; $message .= ' '; $message .= '<strong><a href="%s" target="_blank">Read more</a> | '; $message .= '<a href="%s#icl_st_sw_form">Change strings language</a></strong>'; $message = __( $message, 'wpml-string-translation' ); $message = sprintf( $message, $st_language, $st_language, 'http://wpml.org/faq/string-translation-default-language-not-english/', $st_page_url ); $fallback_message = _( '<a href="%s" target="_blank">How to translate strings when default language is not English</a>' ); $fallback_message = sprintf( $fallback_message, 'http://wpml.org/faq/string-translation-default-language-not-english/' ); ICL_AdminNotifier::addMessage( 'wp_types_st_language_warning', $message, 'icl-admin-message icl-admin-message-warning', true, $fallback_message, false, 'wp-types' ); $called = true; } } } // Fix to set correct parent and children for duplicated posts function wpcf_wpml_duplicated_post_relationships( $original_post_id, $lang, $postarr, $duplicate_post_id ) { require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; wpcf_post_relationship_set_translated_parent( $duplicate_post_id ); wpcf_post_relationship_set_translated_children( $duplicate_post_id ); }