wpml_helper = new WPML_Helper( $wpdb );
parent::__construct( $wpdb );
$this->locale_utils = new WPML_Locale( $wpdb, $this, $locale );
$sitepress_settings = get_option( 'icl_sitepress_settings' );
$this->settings = &$sitepress_settings;
$this->post_translation = &$wpml_post_translations;
$this->term_translation = &$wpml_term_translations;
//@since 3.1
if(is_admin() && !$this->get_setting('icl_capabilities_verified')) {
add_action( 'plugins_loaded', 'wpml_enable_capabilities' );
}
if ( null === $pagenow && is_multisite() ) {
include WPML_PLUGIN_PATH . '/inc/hacks/vars-php-multisite.php';
}
if ( $this->settings ) {
$this->verify_settings();
}
if ( isset( $_GET['page'], $_GET['debug_action'] ) && WPML_PLUGIN_FOLDER . '/menu/troubleshooting.php' === $_GET['page'] ) {
ob_start();
}
if ( isset( $_REQUEST[ 'icl_ajx_action' ] ) ) {
add_action( 'init', array( $this, 'ajax_setup' ), 15 );
}
// Process post requests
if ( !empty( $_POST ) ) {
add_action( 'init', array( $this, 'process_forms' ) );
}
$this->initialize_cache( );
$flags_factory = new WPML_Flags_Factory( $wpdb );
$this->flags = $flags_factory->create();
add_action( 'plugins_loaded', array( $this, 'plugin_localization' ), - PHP_INT_MAX );
add_action( 'plugins_loaded', array( $this, 'init' ), 1 );
add_action( 'wp_loaded', array( $this, 'maybe_set_this_lang' ) );
add_action( 'switch_blog', array( $this, 'init_settings' ), 10, 1 );
// Administration menus
add_action( 'admin_menu', array( $this, 'administration_menu' ) );
if ( $this->get_setting('existing_content_language_verified') && ( $this->get_setting('setup_complete') || ( !empty($_GET[ 'page' ]) && $this->get_setting('setup_wizard_step') > 1 && $_GET[ 'page' ] == WPML_PLUGIN_FOLDER . '/menu/languages.php' ) ) ) {
// Post/page language box
add_filter( 'comment_feed_join', array( $this, 'comment_feed_join' ) );
add_filter( 'comments_clauses', array( $this, 'comments_clauses' ), 10, 2 );
// Allow us to filter the Query vars before the posts query is being built and executed
add_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
if ( $pagenow === 'edit.php' ) {
add_action( 'quick_edit_custom_box', array( 'WPML_Terms_Translations', 'quick_edit_terms_removal' ), 10, 2 );
}
add_filter( 'get_pages', array( $this, 'exclude_other_language_pages2' ), 10, 2 );
add_filter( 'wp_dropdown_pages', array( $this, 'wp_dropdown_pages' ) );
add_filter( 'get_comment_link', array( $this, 'get_comment_link_filter' ) );
$this->set_term_filters_and_hooks();
add_action( 'parse_query', array( $this, 'parse_query' ) );
// AJAX Actions for the post edit screen
add_action( 'wp_ajax_wpml_save_term', array( 'WPML_Post_Edit_Ajax', 'wpml_save_term_action' ) );
add_action( 'wp_ajax_wpml_switch_post_language', array( 'WPML_Post_Edit_Ajax', 'wpml_switch_post_language' ) );
add_action( 'wp_ajax_wpml_get_default_lang', array( 'WPML_Post_Edit_Ajax', 'wpml_get_default_lang' ) );
//AJAX Actions for the taxonomy translation screen
add_action( 'wp_ajax_wpml_get_terms_and_labels_for_taxonomy_table', array( 'WPML_Taxonomy_Translation_Table_Display', 'wpml_get_terms_and_labels_for_taxonomy_table' ) );
// Ajax Action for the updating of term names on the troubleshooting page
add_action( 'wp_ajax_wpml_update_term_names_troubleshoot', array( 'WPML_Troubleshooting_Terms_Menu', 'wpml_update_term_names_troubleshoot' ) );
add_action( 'wp_ajax_wpml_generate_term_slug', array( $this->get_term_actions_helper(), 'generate_unique_term_slug_ajax_handler' ) );
// short circuit get default category
add_filter( 'pre_option_default_category', array( $this, 'pre_option_default_category' ) );
add_filter( 'update_option_default_category', array( $this, 'update_option_default_category' ), 1, 2 );
// front end js
add_action( 'admin_enqueue_scripts', array( $this, 'front_end_js' ) );
add_action( 'wp_head', array( $this, 'rtl_fix' ) );
add_action( 'admin_print_styles', array( $this, 'rtl_fix' ) );
add_action( 'restrict_manage_posts', array( $this, 'restrict_manage_posts' ) );
// feeds links
add_filter( 'feed_link', array( $this, 'feed_link' ) );
// commenting links
add_filter( 'post_comments_feed_link', array( $this, 'post_comments_feed_link' ) );
add_filter( 'trackback_url', array( $this, 'trackback_url' ) );
add_filter( 'user_trailingslashit', array( $this, 'user_trailingslashit' ), 1, 2 );
add_filter( 'pre_option_home', array( $this, 'pre_option_home' ) );
if ( !is_admin() ) {
add_filter( 'attachment_link', array( $this, 'attachment_link_filter' ), 10, 2 );
}
// Filter custom type archive link (since WP 3.1)
add_filter( 'post_type_archive_link', array( $this, 'post_type_archive_link_filter' ), 10, 2 );
add_filter( 'author_link', array( $this, 'author_link' ) );
// language negotiation
add_action( 'query_vars', array( $this, 'query_vars' ) );
add_filter( 'language_attributes', array( $this, 'language_attributes' ) );
add_filter( 'locale', array( $this, 'locale_filter' ), 10, 1 );
add_filter( 'pre_option_page_on_front', array( $this, 'pre_option_page_on_front' ) );
add_filter( 'pre_option_page_for_posts', array( $this, 'pre_option_page_for_posts' ) );
add_filter( 'pre_option_sticky_posts', array( $this, 'option_sticky_posts' ), 10, 2 );
add_filter( 'trashed_post', array( $this, 'fix_trashed_front_or_posts_page_settings' ) );
add_filter( 'delete_post', array( $this, 'fix_trashed_front_or_posts_page_settings' ) );
add_action( 'wp', array( $this, 'set_wp_query' ) );
add_action( 'personal_options_update', array( $this, 'save_user_options' ) );
add_action( 'edit_user_profile_update', array( $this, 'save_user_options' ) );
if ( !is_admin() ) {
add_action( 'wp_head', array( $this, 'meta_generator_tag' ) );
}
if ( $this->is_setup_complete() ) {
$icl_nav_menu = new WPML_Nav_Menu( $this, $wpdb, $wpml_post_translations, $wpml_term_translations );
$icl_nav_menu->init_hooks();
}
add_action( 'wp_login', array( $this, 'reset_admin_language_cookie' ) );
$this->handle_head_hreflang();
/**
* add extra debug information
*/
add_filter( 'icl_get_extra_debug_info', array( $this, 'add_extra_debug_info' ) );
} //end if the initial language is set - existing_content_language_verified
add_filter( 'core_version_check_locale', array( $this, 'wp_upgrade_locale' ) );
if ( $pagenow === 'post.php' && isset( $_REQUEST['action'], $_GET['post'] ) && $_REQUEST['action'] === 'edit' ) {
add_action( 'init', '_icl_trash_restore_prompt' );
}
add_action( 'admin_enqueue_scripts', array( $this, 'js_load' ), 2 ); // enqueue scripts - higher priority
add_action( 'wp_enqueue_scripts', array( $this, 'js_load' ), 2 ); // enqueue scripts - higher priority
add_filter('url_to_postid', array($this, 'url_to_postid'));
//cron job to update WPML config index file from CDN
$xml_config_log_factory = new WPML_XML_Config_Log_Factory();
$log = $xml_config_log_factory->create_log();
if ( $this->is_setup_complete() ) {
$xml_config_log_notice = $xml_config_log_factory->create_notice();
$xml_config_log_notice->add_hooks();
}
$wpml_config_update_integrator = new WPML_Config_Update_Integrator( $log );
$wpml_config_update_integrator->add_hooks();
add_action('core_upgrade_preamble', array($this, 'update_index_screen'));
add_filter('get_search_form', array($this, 'get_search_form_filter'));
$this->api_hooks();
add_action('wpml_loaded', array($this, 'load_dependencies'), 10000);
do_action('wpml_after_startup');
}
/**
* @since 3.2
*/
public function api_hooks() {
/**
* @deprecated in favour of lowercased namespaces
*/
add_filter( 'WPML_get_setting', array( $this, 'filter_get_setting' ), 10, 2 );
/**
* @deprecated in favour of lowercased namespaces
*/
add_filter( 'WPML_get_current_language', array( $this, 'get_current_language' ), 10, 0 );
/**
* @deprecated in favour of lowercased namespaces
*/
add_filter( 'WPML_get_user_admin_language', array( $this, 'get_user_admin_language_filter' ), 10, 2 );
/**
* @deprecated in favour of lowercased namespaces
*/
add_filter( 'WPML_is_admin_action_from_referer', array( $this, 'check_if_admin_action_from_referer' ), 10, 0 );
/**
* @deprecated in favour of lowercased namespaces
*/
add_filter( 'WPML_current_user', array( $this, 'get_current_user' ), 10, 0 );
add_filter( 'wpml_get_setting', array( $this, 'filter_get_setting' ), 10, 2 );
add_action( 'wpml_set_setting', array( $this, 'action_set_setting' ), 10, 3 );
add_filter( 'wpml_get_language_cookie', array( $this, 'get_language_cookie' ), 10, 0 );
add_filter( 'wpml_current_language', array( $this, 'get_current_language' ), 10, 0 );
add_filter( 'wpml_get_user_admin_language', array( $this, 'get_user_admin_language_filter' ), 10, 2 );
add_filter( 'wpml_is_admin_action_from_referer', array( $this, 'check_if_admin_action_from_referer' ), 10, 0 );
add_filter( 'wpml_current_user', array( $this, 'get_current_user' ), 10, 0 );
add_filter( 'wpml_new_post_source_id', array ( $this, 'get_new_post_source_id'), 10, 1);
/**
* @use \SitePress::get_translatable_documents_filter
*/
add_filter( 'wpml_translatable_documents', array( $this, 'get_translatable_documents_filter' ), 10, 2 );
add_filter( 'wpml_is_translated_post_type', array( $this, 'is_translated_post_type_filter' ), 10, 2 );
add_filter( 'wpml_is_display_as_translated_post_type', array( $this, 'is_display_as_translated_post_type_filter' ), 10, 2 );
add_filter( 'wpml_is_translated_taxonomy', array( $this, 'is_translated_taxonomy_filter' ), 10, 2 );
/**
* @deprecated it has a wrong hook tag
* @since 3.2
*/
add_filter( 'wpml_get_element_translations_filter', array( $this, 'get_element_translations_filter' ), 10, 6 );
/**
* @deprecated it has a wrong hook tag
* @since 3.2
*/
add_filter( 'wpml_get_element_translations', array( $this, 'get_element_translations_filter' ), 10, 6 );
add_filter( 'wpml_is_original_content', array( $this, 'is_original_content_filter'), 10, 3 );
add_filter( 'wpml_original_element_id', array( $this, 'get_original_element_id_filter'), 10, 3 );
add_filter( 'wpml_element_trid', array( $this, 'get_element_trid_filter'), 10, 3 );
add_filter( 'wpml_is_rtl', array( $this, 'is_rtl' ) );
add_filter( 'wpml_home_url', 'wpml_get_home_url_filter', 10 );
add_filter( 'wpml_active_languages', 'wpml_get_active_languages_filter', 10, 2 );
add_filter( 'wpml_display_language_names', 'wpml_display_language_names_filter', 10, 5 );
add_filter( 'wpml_display_single_language_name', array($this, 'get_display_single_language_name_filter'), 10, 2 );
add_filter( 'wpml_element_link', 'wpml_link_to_element_filter', 10, 7 );
add_filter( 'wpml_object_id', 'wpml_object_id_filter', 10, 4 );
add_filter( 'wpml_translated_language_name', 'wpml_translated_language_name_filter', 10, 3 );
add_filter( 'wpml_default_language', 'wpml_get_default_language_filter', 10, 1);
add_filter( 'wpml_post_language_details', 'wpml_get_language_information', 10, 2 );
add_action( 'wpml_add_language_form_field', 'wpml_add_language_form_field_action' );
add_shortcode( 'wpml_language_form_field', 'wpml_language_form_field_shortcode' );
add_filter( 'wpml_element_translation_type', 'wpml_get_element_translation_type_filter', 10, 3 );
add_filter( 'wpml_element_has_translations', 'wpml_element_has_translations_filter', 10, 3 );
add_filter( 'wpml_content_translations', 'wpml_get_content_translations_filter', 10, 3 );
add_filter( 'wpml_master_post_from_duplicate', 'wpml_get_master_post_from_duplicate_filter' );
add_filter( 'wpml_post_duplicates', 'wpml_get_post_duplicates_filter' );
add_filter( 'wpml_element_type', 'wpml_element_type_filter' );
add_filter( 'wpml_setting', 'wpml_get_setting_filter', 10, 3 );
add_filter( 'wpml_sub_setting', 'wpml_get_sub_setting_filter', 10, 4 );
add_filter( 'wpml_language_is_active', 'wpml_language_is_active_filter', 10, 2 );
add_action( 'wpml_admin_make_post_duplicates', 'wpml_admin_make_post_duplicates_action', 10, 1 );
/**
* @deprecated This actions will be removed in future releases.
*/
add_action( 'wpml_make_post_duplicates', 'wpml_make_post_duplicates_action', 10, 1 );
add_filter( 'wpml_element_language_details', 'wpml_element_language_details_filter', 10, 2 );
add_action( 'wpml_set_element_language_details', array($this, 'set_element_language_details_action'), 10, 1 );
add_filter( 'wpml_element_language_code', 'wpml_element_language_code_filter', 10, 2 );
add_filter( 'wpml_elements_without_translations', 'wpml_elements_without_translations_filter', 10, 2 );
add_action( 'wpml_switch_language', 'wpml_switch_language_action', 10, 1 );
}
function init() {
do_action('wpml_before_init');
$this->locale_utils->init();
$this->maybe_set_this_lang();
if ( function_exists( 'w3tc_add_action' ) ) {
w3tc_add_action( 'w3tc_object_cache_key', 'w3tc_translate_cache_key_filter' );
}
$this->get_user_preferences();
$this->set_admin_language();
// default value for theme_localization_type OR
// reset theme_localization_type if string translation was on (theme_localization_type was set to 2) and then it was deactivated
global $sitepress_settings;
$theme_localization_type = new WPML_Theme_Localization_Type( $this );
if ( ! isset( $this->settings['theme_localization_type'] ) || ( $theme_localization_type->is_st_type() && ! defined( 'WPML_ST_VERSION' ) && ! defined( 'WPML_DOING_UPGRADE' ) ) ) {
$sitepress_settings['theme_localization_type_previous'] = $sitepress_settings['theme_localization_type'];
$this->settings['theme_localization_type'] = $sitepress_settings['theme_localization_type'] = WPML_Theme_Localization_Type::USE_MO_FILES;
} else if ( defined( 'WPML_ST_VERSION' ) && isset( $sitepress_settings['theme_localization_type_previous'] ) ) {
$this->settings['theme_localization_type'] = $sitepress_settings['theme_localization_type'] = $sitepress_settings['theme_localization_type_previous'];
unset( $sitepress_settings['theme_localization_type_previous'] );
}
$theme_localization_type->add_hooks();
//Run only if existing content language has been verified, and is front-end or settings are not corrupted
if ( $this->get_setting( 'existing_content_language_verified' ) ) {
add_action( 'wpml_verify_post_translations', array(
$this,
'verify_post_translations_action'
), 10, 1 );
if ( 2 === (int) $this->get_setting( 'language_negotiation_type' ) ) {
add_filter( 'allowed_redirect_hosts', array( $this, 'allowed_redirect_hosts' ) );
}
$this->move_current_language_to_the_top();
add_filter( 'mod_rewrite_rules', array( $this, 'rewrite_rules_filter' ), 10, 1 );
if (
is_admin() && $this->get_setting( 'setup_complete' )
&& ! $this->get_wp_api()->is_translation_queue_page() && ! $this->get_wp_api()->is_string_translation_page()
) {
// Admin language switcher goes to the WP admin bar
if ( apply_filters( 'wpml_show_admin_language_switcher', true ) ) {
add_action( 'wp_before_admin_bar_render', array( $this, 'admin_language_switcher' ) );
} else {
$this->set_this_lang( 'all' );
}
}
if ( defined( 'DISQUS_VERSION' ) && ! is_admin() ) {
include WPML_PLUGIN_PATH . '/modules/disqus.php';
}
}
if ( $this->is_rtl() ) {
$GLOBALS[ 'text_direction' ] = 'rtl';
}
if ( ! wpml_is_ajax() && is_admin() && ! $this->get_setting( 'dont_show_help_admin_notice' ) ) {
WPML_Troubleshooting_Terms_Menu::display_terms_with_suffix_admin_notice();
if ( !$this->get_setting( 'setup_wizard_step' )
&& strpos( filter_input( INPUT_GET, 'page', FILTER_SANITIZE_URL ), 'menu/languages.php' ) === false
&& current_user_can( 'manage_options' )
) {
add_action( 'admin_notices', array( $this, 'help_admin_notice' ) );
}
}
$short_v = implode( '.', array_slice( explode( '.', ICL_SITEPRESS_VERSION ), 0, 3 ) );
if ( is_admin() && ( ! isset( $this->settings['hide_upgrade_notice'] ) || $this->get_setting( 'hide_upgrade_notice' ) !== $short_v ) ) {
add_action( 'admin_notices', array( $this, 'upgrade_notice' ) );
}
require WPML_PLUGIN_PATH . '/inc/template-constants.php';
if ( defined( 'WPML_LOAD_API_SUPPORT' ) ) {
require WPML_PLUGIN_PATH . '/inc/wpml-api.php';
}
add_action( 'wp_footer', array( $this, 'display_wpml_footer' ), 20 );
if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
add_action( 'xmlrpc_call', array( $this, 'xmlrpc_call_actions' ) );
add_filter( 'xmlrpc_methods', array( $this, 'xmlrpc_methods' ) );
}
global $pagenow;
// set language to default and remove language switcher when in Taxonomy Translation page
// If the page uses AJAX and the language must be forced to default, please use the
// if ( $pagenow == 'admin-ajax.php' )above
if ( is_admin()
&& ( $this->is_taxonomy_related_page()
|| $this->is_saving_taxonomy_labels() )
) {
$this->switch_to_admin_language();
add_action( 'init', array( $this, 'remove_admin_language_switcher' ) );
}
/* Posts and new inline created terms, can only be saved in an active language.
* Also the content of the post-new.php should always be filtered for one specific
* active language, so to display the correct taxonomy terms for selection.
*/
if ( $pagenow === 'post-new.php' ) {
if ( ! $this->is_active_language( $this->get_current_language() ) ) {
$this->switch_to_admin_language();
}
}
//Code to run when reactivating the plugin
$recently_activated = $this->get_setting('just_reactivated');
if($recently_activated) {
add_action( 'init', array( $this, 'rebuild_language_information' ), 1000 );
}
if ( is_admin() ) {
$mo_file_search = new WPML_MO_File_Search( $this );
add_action('after_switch_theme', array($mo_file_search, 'reload_theme_dirs'));
}
do_action('wpml_after_init');
do_action('wpml_loaded', $this);
if ( isset( $_GET['page'] )
&& WPML_PLUGIN_FOLDER . '/menu/taxonomy-translation.php' === $_GET['page']
&& is_admin()
) {
$this->taxonomy_translation = new WPML_Taxonomy_Translation( '', array(), new WPML_UI_Screen_Options_Factory( $this ) );
}
if ( WPML_LANGUAGE_NEGOTIATION_TYPE_DOMAIN === (int) $this->get_setting( 'language_negotiation_type' )
&& $this->get_setting( 'language_per_domain_sso_enabled', false )
) {
$sso = new WPML_Language_Per_Domain_SSO( $this );
$sso->init_hooks();
}
}
/**
* Sets the current language in \SitePress::$this_lang, redirects if
* frontend requests point to incomplete or incorrect urls, un-sets the
* $_GET['lang'] and $_GET['admin_bar'] values so that upload.php is able to
* enqueue 'media-grid' correctly without url parameters breaking its
* functionality.
*/
public function maybe_set_this_lang() {
/** @var WPML_Request $wpml_request_handler */
global $wpml_request_handler, $pagenow, $wpml_language_resolution, $mode;
if ( ! defined( 'WP_ADMIN' ) && isset( $_SERVER['HTTP_HOST'] ) && did_action( 'init' ) ) {
require_once WPML_PLUGIN_PATH . '/inc/request-handling/redirection/wpml-frontend-redirection.php';
/** @var WPML_Frontend_Request $wpml_request_handler */
$redirect_helper = _wpml_get_redirect_helper();
$redirection = new WPML_Frontend_Redirection( $this,
$wpml_request_handler, $redirect_helper,
$wpml_language_resolution );
$this->set_this_lang( $redirection->maybe_redirect() );
} else {
$this->set_this_lang( $wpml_request_handler->get_requested_lang() );
}
$wpml_request_handler->set_language_cookie( $this->this_lang );
if ( $pagenow === 'upload.php' && isset( $mode ) && 'grid' === $mode ) {
$_GET['lang'] = null;
$_GET['admin_bar'] = null;
}
}
function load_dependencies() {
do_action( 'wpml_load_dependencies' );
}
/**
* Sets up all term/taxonomy actions for use outside Translations Management or the Post Edit screen
*/
function set_term_filters_and_hooks(){
// The delete filter only ensures the synchronizing of delete actions between translations of a term.
add_action( 'delete_term', array( $this, 'delete_term' ), 1, 3 );
add_action( 'set_object_terms', array( 'WPML_Terms_Translations', 'set_object_terms_action' ), 10, 6 );
add_action( 'created_term_translation', array( 'WPML_Terms_Translations', 'sync_ttid_action' ), 10, 3 );
// filters terms by language for the term/tag-box autoselect
if ( ( isset( $_GET['action'] ) && 'ajax-tag-search' === $_GET['action'] ) || ( isset( $_POST['action'] ) && 'get-tagcloud' === $_POST['action'] ) ) {
add_filter( 'get_terms', array( 'WPML_Terms_Translations', 'get_terms_filter' ), 10, 2 );
}
add_filter( 'terms_clauses', array( $this, 'terms_clauses' ), 10, 4 );
add_action( 'create_term', array( $this, 'create_term' ), 1, 3 );
add_action( 'edit_term', array( $this, 'create_term' ), 1, 3 );
add_filter( 'get_terms_args', array( $this, 'get_terms_args_filter' ), 10, 2 );
add_filter( 'get_edit_term_link', array( $this, 'get_edit_term_link' ), 1, 4 );
add_action( 'deleted_term_relationships', array( $this, 'deleted_term_relationships' ), 10, 2 );
add_action('wp_ajax_icl_repair_broken_type_and_language_assignments', 'icl_repair_broken_type_and_language_assignments');
// adjust queried categories and tags ids according to the language
if ( (bool) $this->get_setting('auto_adjust_ids' ) ) {
add_action( 'wp_list_pages_excludes', array( $this, 'adjust_wp_list_pages_excludes' ) );
if ( ! $this->get_wp_api()->is_admin()
|| $this->get_wp_api()->constant( 'DOING_AJAX' )
) {
add_filter( 'get_term', array( $this, 'get_term_adjust_id' ), 1, 1 );
add_filter( 'category_link', array( $this, 'category_link_adjust_id' ), 1, 2 );
add_filter( 'get_pages', array( $this, 'get_pages_adjust_ids' ), 1, 2 );
}
}
add_action( 'clean_term_cache', array( $this, 'clear_elements_cache' ), 10, 2 );
}
function remove_admin_language_switcher() {
remove_action( 'wp_before_admin_bar_render', array( $this, 'admin_language_switcher' ) );
}
function rebuild_language_information() {
$this->set_setting('just_reactivated', 0);
$this->save_settings();
/** @var TranslationManagement $iclTranslationManagement */
global $iclTranslationManagement;
if ( $iclTranslationManagement ) {
$iclTranslationManagement->add_missing_language_information();
}
}
function setup()
{
$setup_complete = $this->get_setting('setup_complete');
if(!$setup_complete) {
$this->set_setting('setup_complete', false);
}
return $setup_complete;
}
public function user_lang_by_authcookie() {
global $current_user;
if ( !isset( $current_user ) ) {
$username = '';
if ( function_exists ( 'wp_parse_auth_cookie' ) ) {
$cookie_data = wp_parse_auth_cookie ();
$username = isset( $cookie_data[ 'username' ] ) ? $cookie_data[ 'username' ] : null;
}
$user_obj = new WP_User( null, $username );
} else {
$user_obj = $current_user;
}
$user_id = isset( $user_obj->ID ) ? $user_obj->ID : 0;
$user_lang = $this->get_user_admin_language ( $user_id );
$user_lang = $user_lang ? $user_lang : $this->get_current_language ();
return $user_lang;
}
function get_current_user() {
global $current_user;
return $current_user !== null ? $current_user : new WP_User();
}
function ajax_setup()
{
require WPML_PLUGIN_PATH . '/ajax.php';
}
function check_if_admin_action_from_referer() {
$referer = isset( $_SERVER[ 'HTTP_REFERER' ] ) ? $_SERVER[ 'HTTP_REFERER' ] : '';
return strpos ( $referer, strtolower ( admin_url () ) ) === 0;
}
/**
* Check translation mangement column screen option.
*
* @param string $post_type Current post type.
*
* @return bool
*/
public function show_management_column_content( $post_type ) {
$custom_columns = new WPML_Custom_Columns( $this );
return $custom_columns->show_management_column_content( $post_type );
}
function initialize_cache() {
require_once WPML_PLUGIN_PATH . '/inc/cache.php';
}
/**
* @return icl_cache
*/
function get_translations_cache() {
if ( ! isset( $this->icl_translations_cache ) ) {
$this->icl_translations_cache = new icl_cache();
}
return $this->icl_translations_cache;
}
/**
* @return icl_cache
*/
function get_language_name_cache() {
if ( ! isset( $this->icl_language_name_cache ) ) {
$this->icl_language_name_cache = new icl_cache( 'language_name', true );
}
return $this->icl_language_name_cache;
}
public function set_admin_language( $admin_language = false ) {
$default_language = $this->get_default_language ();
$this->admin_language = $admin_language ? $admin_language : $this->user_lang_by_authcookie ();
$lang_codes = array_keys ( $this->get_languages () );
if ( (bool) $this->admin_language === true && ! in_array( $this->admin_language, $lang_codes, true ) ) {
delete_user_meta ( $this->get_current_user ()->ID, 'icl_admin_language' );
}
if ( empty( $this->settings[ 'admin_default_language' ] ) || !in_array (
$this->settings[ 'admin_default_language' ], array_merge( $lang_codes, array( '_default_' ) ), true
)
) {
$this->settings[ 'admin_default_language' ] = '_default_';
$this->save_settings ();
}
if ( !$this->admin_language ) {
$this->admin_language = $this->settings[ 'admin_default_language' ];
}
if ( $this->admin_language === '_default_' && $default_language ) {
$this->admin_language = $default_language;
}
}
function get_admin_language() {
$current_user = $this->get_current_user();
if (
( ! empty( $current_user->ID ) && $this->get_wp_api()->get_user_meta( $current_user->ID,
'icl_admin_language_for_edit',
true ) && $this->is_post_edit_screen() )
|| $this->is_wpml_switch_language_triggered()
) {
$admin_language = $this->get_current_language();
} else {
$admin_language = $this->user_lang_by_authcookie();
}
return $admin_language;
}
public function is_wpml_switch_language_triggered() {
return isset( $GLOBALS['icl_language_switched'] ) ? true : false ;
}
/**
* @return bool
*/
function is_post_edit_screen() {
global $pagenow;
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
return $pagenow === 'post-new.php' || ( $pagenow === 'post.php' && ( 0 === strcmp( $action, 'edit' ) ) );
}
function get_user_admin_language_filter( $value, $user_id ) {
return $this->get_user_admin_language( $user_id );
}
function get_user_admin_language( $user_id, $reload = false ) {
$user_admin_language = new WPML_User_Admin_Language( $this );
return $user_admin_language->get( $user_id, $reload );
}
/**
* @todo rename this method, has it has nothing to do with the menus
*/
function administration_menu() {
if ( ! $this->is_setup_complete() ) {
$this->check_and_display_missing_records_notice();
}
}
private function check_and_display_missing_records_notice() {
if ( ! $this->is_troubleshooting_page() && ! SitePress_Setup::languages_table_is_complete() ) {
$troubleshooting_url = admin_url( 'admin.php?page=' . WPML_PLUGIN_FOLDER . '/menu/troubleshooting.php' );
$troubleshooting_link = ''
. __( 'Troubleshooting', 'sitepress' )
. '';
$message = '';
$message .= __( 'WPML is missing some records in the languages tables and it cannot fully work until this issue is fixed.',
'sitepress' );
$message .= '
';
$message .= sprintf( __( 'Please go to the %s page and click on "%s" to fix this problem.',
'sitepress' ),
$troubleshooting_link,
__( 'Clear language information and repopulate languages',
'sitepress' ) );
$message .= '
';
$message .= '
';
$message .= __( 'This warning will disappear once this issue is fixed.', 'sitepress' );
ICL_AdminNotifier::removeMessage( 'setup-incomplete' );
ICL_AdminNotifier::addMessage( 'setup-incomplete', $message, 'error', false, false, false, 'setup', true );
ICL_AdminNotifier::displayMessages( 'setup' );
}
}
function taxonomy_translation_page() {
$this->taxonomy_translation->render();
}
/**
* @param int|string $blog_id
*/
function init_settings( $blog_id ) {
$blog_id = (int) $blog_id;
if ( ! isset( $this->loaded_blog_id ) || $this->loaded_blog_id != $blog_id ) {
$this->loaded_blog_id = $blog_id;
$this->settings = get_option( 'icl_sitepress_settings' );
$default_lang_code = isset( $this->settings[ 'default_language' ] ) ? $this->settings[ 'default_language' ] : false;
load_wpml_url_converter( $this->settings, false, $default_lang_code );
}
}
/**
* @param array|null $settings
*/
function save_settings( $settings = null ) {
if ( null !== $settings ) {
foreach ( $settings as $k => $v ) {
if ( is_array( $v ) ) {
foreach ( $v as $k2 => $v2 ) {
$this->settings[ $k ][ $k2 ] = $v2;
}
} else {
$this->settings[ $k ] = $v;
}
}
}
if ( ! empty( $this->settings ) ) {
update_option( 'icl_sitepress_settings', $this->settings );
}
do_action( 'icl_save_settings', $settings );
}
/**
* @since 3.1
*/
function get_settings() {
return $this->settings;
}
function filter_get_setting($value, $key) {
return $this->get_setting($key, $value);
}
/**
* @param string $key
* @param mixed|bool $default
*
* @since 3.1
*
* @return bool|mixed
*/
function get_setting( $key, $default = false ) {
return wpml_get_setting_filter( $default, $key );
}
function action_set_setting($key, $value, $save_now) {
$this->set_setting($key, $value, $save_now);
}
/**
* @param string $key
* @param mixed $value
* @param bool $save_now Immediately update the settings record in the DB
*
* @since 3.1
*
* @return bool Always True. If `$save_now === true`, it returns the result of `update_option`
*/
function set_setting($key, $value, $save_now = false) {
return icl_set_setting($key, $value, $save_now);
}
function get_user_preferences() {
if ( ! isset( $this->user_preferences ) || ! $this->user_preferences ) {
$this->user_preferences = get_user_meta( $this->get_current_user()->ID, '_icl_preferences', true );
}
if ( (is_array( $this->user_preferences) && $this->user_preferences == array(0 => false)) || !$this->user_preferences ) {
$this->user_preferences = array();
}
if ( ! is_array( $this->user_preferences ) ) {
$this->user_preferences = (array) $this->user_preferences;
}
return $this->user_preferences;
}
function set_user_preferences($value) {
$this->user_preferences = $value;
}
function save_user_preferences()
{
update_user_meta( $this->get_current_user()->ID, '_icl_preferences', $this->user_preferences );
}
function get_option( $option_name )
{
return isset( $this->settings[ $option_name ] ) ? $this->settings[ $option_name ] : null;
}
function verify_settings() {
$verify_settings = new WPML_Verify_SitePress_Settings( $this->get_wp_api() );
list( $this->settings, $update_settings ) = $verify_settings->verify( $this->settings );
if ( $update_settings ) {
$this->save_settings();
}
}
/**
* @param bool $refresh
* @param bool $major_first
* @param string $order_by
*
* @return array
*/
function get_active_languages( $refresh = false, $major_first = false, $order_by = 'english_name' ) {
/** @var WPML_Request $wpml_request_handler */
global $wpml_request_handler;
$in_language = defined( 'WP_ADMIN' ) && $this->admin_language ? $this->admin_language : null;
$in_language = $in_language === null ? $this->get_current_language() : $in_language;
$in_language = $in_language ? $in_language : $this->get_default_language();
$active_languages = $this->get_languages( $in_language, true, $refresh, $major_first, $order_by );
$active_languages = isset( $active_languages[ $in_language ] ) ? $active_languages : $this->get_languages( $in_language, true, true, $major_first, $order_by );
$active_languages = $active_languages ? $active_languages : array();
$this->active_languages = $wpml_request_handler->show_hidden() ? $active_languages : array_diff_key( $active_languages, array_fill_keys( $this->get_setting( 'hidden_languages', array() ), 1 ) );
return $this->active_languages;
}
/**
* Returns an input array of languages, that are in the form of associative arrays,
* ordered by the user-chosen language order
*
* @param array[] $languages
*
* @return array[]
*/
function order_languages( $languages ) {
$ordered_languages = array();
if ( isset( $this->settings[ 'languages_order' ] ) && is_array( $this->settings[ 'languages_order' ] ) ) {
foreach ( $this->settings[ 'languages_order' ] as $code ) {
if ( isset( $languages[ $code ] ) ) {
$ordered_languages[ $code ] = $languages[ $code ];
unset( $languages[ $code ] );
}
}
} else {
// initial save
$iclsettings[ 'languages_order' ] = array_keys( $languages );
$this->save_settings( $iclsettings );
}
if ( ! empty( $languages ) ) {
foreach ( $languages as $code => $lang ) {
$ordered_languages[ $code ] = $lang;
}
}
return $ordered_languages;
}
/**
* @param $lang_code
* Checks if a given language code belongs to a currently active language.
* @return bool
*/
function is_active_language( $lang_code ) {
$result = false;
$active_languages = $this->get_active_languages();
foreach ( $active_languages as $lang ) {
if ( $lang_code == $lang[ 'code' ] ) {
$result = true;
break;
}
}
return $result;
}
public function get_languages( $lang = false, $active_only = false, $refresh = false, $major_first = false, $order_by = 'english_name') {
$res = false;
if ( !$lang ) {
$lang = $this->get_default_language();
}
if ( $active_only && ! $refresh ) {
$res = $this->get_language_name_cache()->get( 'in_language_' . $lang . '_' . $major_first . '_' . $order_by );
}
if ( ! $res && ! $active_only && ! $refresh ) {
$res = $this->get_language_name_cache()->get( 'all_language_' . $lang . '_' . $major_first . '_' . $order_by );
}
if ( ! $res ) {
$setup_instance = wpml_get_setup_instance();
$res = $setup_instance->refresh_active_lang_cache( $lang, $active_only, $major_first, $order_by );
}
return $res;
}
function get_language_details( $code ) {
if ( $this->get_wp_api()->is_admin() ) {
$dcode = $this->admin_language;
} else {
$dcode = $code;
}
$details = $this->get_language_name_cache()->get( 'language_details_' . $code . $dcode );
if ( !$details ) {
$language_details = $this->get_languages( $dcode );
$details = isset( $language_details[ $code ] ) ? $language_details[ $code ] : false;
}
return $details;
}
function get_language_code( $english_name ) {
$query = $this->wpdb->prepare( " SELECT code FROM {$this->wpdb->prefix}icl_languages WHERE english_name = %s LIMIT 1", $english_name );
$code = $this->wpdb->get_var( $query );
return $code;
}
function get_language_code_from_locale( $locale ) {
$query = $this->wpdb->prepare( " SELECT code FROM {$this->wpdb->prefix}icl_languages WHERE default_locale = %s LIMIT 1", $locale );
$code = $this->wpdb->get_var( $query );
return $code;
}
function get_locale_from_language_code( $code ) {
$query = $this->wpdb->prepare( " SELECT default_locale FROM {$this->wpdb->prefix}icl_languages WHERE code = %s LIMIT 1", $code );
$locale = $this->wpdb->get_var( $query );
return $locale;
}
function get_default_language() {
return isset( $this->settings[ 'default_language' ] ) ? $this->settings[ 'default_language' ] : false;
}
private function is_valid_language( $language ) {
$active_languages = $this->active_languages;
if ( ! $active_languages ) {
$active_languages = $this->get_languages();
}
return isset( $active_languages[ $language ] ) || ( 'all' === $language && $this->get_wp_api()->is_admin() );
}
private function set_this_lang( $new_value ) {
if ( $this->is_valid_language( $new_value ) ) {
$this->this_lang = $new_value;
}
}
function get_current_language() {
/**
* @var WPML_Request $wpml_request_handler
* @var WPML_Language_Resolution $wpml_language_resolution
*/
global $wpml_request_handler, $wpml_language_resolution;
if ( ! $this->this_lang ) {
$this->set_this_lang( $wpml_request_handler->get_requested_lang() );
}
if ( ! $this->this_lang ) {
$this->set_this_lang( $this->get_default_language() );
}
return $wpml_language_resolution->current_lang_filter( $this->this_lang, $wpml_request_handler );
}
/**
* Switches whole site to the given language or back to the current language
* that was set when first calling this function.
*
* @param null|string $code language code to switch into, will revert to
* initial language if null is given
* @param bool|string $cookie_lang optionally also switch the cookie language
* to the value given
*/
public function switch_lang( $code = null, $cookie_lang = false ) {
/**
* @var WPML_Request $wpml_request_handler
* @var WPML_Language_Resolution $wpml_language_resolution
*/
global $wpml_language_resolution, $wpml_request_handler;
$this->original_language = $this->original_language === null
? $this->get_current_language() : $this->original_language;
if ( is_null( $code ) ) {
$this->set_this_lang( $this->original_language );
if ( ! empty( $this->original_language_cookie ) ) {
$wpml_request_handler->set_language_cookie( $this->original_language_cookie );
$this->original_language_cookie = false;
}
} else {
if ( $code === 'all' || in_array( $code, $wpml_language_resolution->get_active_language_codes(), true ) ) {
$this->set_this_lang( $code );
}
if ( $cookie_lang ) {
$this->original_language_cookie = $wpml_request_handler->get_cookie_lang();
$wpml_request_handler->set_language_cookie( $code );
}
}
if ( $code ) {
$GLOBALS['icl_language_switched'] = true;
} else {
unset( $GLOBALS['icl_language_switched'] );
}
do_action( 'wpml_language_has_switched', $code, $cookie_lang, $this->original_language );
}
function set_default_language( $code ) {
$previous_default = $this->get_setting('default_language');
$this->set_setting( 'default_language', $code);
$this->set_setting('admin_default_language', $code);
$this->save_settings();
do_action('icl_after_set_default_language',$code, $previous_default);
// change WP locale
$locale = $this->get_locale( $code );
if ( $locale ) {
update_option( 'WPLANG', $locale );
}
$user_language = new WPML_User_Language( $this );
$user_language->sync_default_admin_user_languages();
return $code !== 'en' && ! file_exists( WP_LANG_DIR . '/' . $locale . '.mo' ) ? 1 : true;
}
/**
* Hooked to `init`
*/
function js_load() {
global $pagenow, $wpdb, $wpml_post_translations, $wpml_term_translations;
$page = filter_input( INPUT_GET, 'page' );
$page = $page !== null ? basename( $_GET['page'] ) : null;
$page_basename = $page === null ? false : preg_replace( '/[^\w-]/',
'',
str_replace( '.php', '', $page ) );
$this->scripts_handler = new WPML_Admin_Scripts_Setup( $wpdb,
$this,
$wpml_post_translations,
$wpml_term_translations,
$page_basename );
$this->scripts_handler->register_styles();
$this->scripts_handler->register_scripts();
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
$this->scripts_handler->add_admin_hooks();
if ( isset( $_SERVER[ 'SCRIPT_NAME' ] ) && ( strpos( $_SERVER[ 'SCRIPT_NAME' ], 'post-new.php' ) || strpos( $_SERVER[ 'SCRIPT_NAME' ], 'post.php' ) ) ) {
wp_register_script( 'sitepress-post-edit-tags', ICL_PLUGIN_URL . '/res/js/post-edit-terms.js', array( 'jquery' ) );
$post_edit_messages = array(
'switch_language_title' => __( 'You are about to change the language of {post_name}.', 'sitepress' ),
'switch_language_alert' => __( 'All categories and tags will be translated if possible.', 'sitepress' ),
'connection_loss_alert' => __( 'The following terms do not have a translation in the chosen language and will be disconnected from this post:', 'sitepress' ),
'loading' => __( 'Loading Language Data for {post_name}', 'sitepress' ),
'switch_language_message' => __( 'Please make sure that you\'ve saved all the changes. We will have to reload the page.', 'sitepress' ),
'switch_language_confirm' => __( 'Do you want to continue?', 'sitepress' ),
'_nonce' => wp_create_nonce( 'wpml_switch_post_lang_nonce' ),
'empty_post_title' => __( '(No title for this post yet)', 'sitepress' ),
'ok_button_label' => __( 'OK', 'sitepress' ),
'cancel_button_label' => __( 'Cancel', 'sitepress' ),
);
wp_localize_script( 'sitepress-post-edit-tags', 'icl_post_edit_messages', $post_edit_messages );
wp_enqueue_script( 'sitepress-post-edit-tags' );
}
if ( isset( $_SERVER[ 'SCRIPT_NAME' ] ) && strpos( $_SERVER[ 'SCRIPT_NAME' ], 'edit.php' ) ) {
wp_register_script( 'sitepress-post-list-quickedit', ICL_PLUGIN_URL . '/res/js/post-list-quickedit.js', array( 'jquery') );
wp_enqueue_script( 'sitepress-post-list-quickedit' );
}
wp_enqueue_script( 'sitepress-scripts', ICL_PLUGIN_URL . '/res/js/scripts.js', array( 'jquery' ), ICL_SITEPRESS_VERSION );
if ( isset( $page_basename ) && file_exists( WPML_PLUGIN_PATH . '/res/js/' . $page_basename . '.js' ) ) {
$dependencies = array();
$localization = false;
$color_picker_handler = 'wp-color-picker';
switch ( $page_basename ) {
case 'languages':
$dependencies[ ] = $color_picker_handler;
$dependencies[ ] = 'sitepress-scripts';
$dependencies[ ] = 'wpml-domain-validation';
$dependencies[ ] = 'jquery-ui-dialog';
break;
case 'troubleshooting':
$dependencies [ ] = 'jquery-ui-dialog';
$localization = array(
'object_name' => 'troubleshooting_strings',
'strings' => array(
'success_1' => __( "Post type and source language assignment have been fixed for ", 'sitepress' ),
'success_2' => __( " elements", 'sitepress' ),
'no_problems' => __( "No errors were found in the assignment of post types." ),
'suffixesRemoved' => __( "Language suffixes were removed from the selected terms." ),
'done' => __( 'Done', 'sitepress' ),
'termNamesNonce' => wp_create_nonce('update_term_names_nonce'),
'cacheClearNonce' => wp_create_nonce('cache_clear'),
'syncPostsTaxNonce' => wp_create_nonce( WPML_Troubleshoot_Action::SYNC_POSTS_TAXONOMIES_SLUG ),
)
);
wp_enqueue_style("wp-jquery-ui-dialog");
break;
case 'menus-sync':
$localization = array(
'object_name' => 'menus_sync',
'strings' => array(
'text1' => esc_html__( "Your menu includes custom items, which you need to translate using WPML's String Translation.", 'sitepress' ),
'text2' => esc_html__( '1. Translate these strings: ', 'sitepress' ),
'text3' => esc_html__( "2. When you're done translating, return here and run the menu synchronization again. This will use the strings that you translated to update the menus.", 'sitepress' ),
)
);
break;
}
$handle = 'sitepress-' . $page_basename;
wp_register_script( $handle, ICL_PLUGIN_URL . '/res/js/' . $page_basename . '.js', $dependencies, ICL_SITEPRESS_VERSION );
if ( $localization ) {
wp_localize_script( $handle, $localization[ 'object_name' ], $localization[ 'strings' ] );
}
if(in_array($color_picker_handler, $dependencies)) {
wp_enqueue_style( $color_picker_handler );
}
wp_enqueue_script( $handle );
}
if ( $pagenow == 'edit.php' ) {
add_action( 'admin_enqueue_scripts', array( $this, 'language_filter' ) );
}
wp_enqueue_style( 'wpml-select-2', ICL_PLUGIN_URL . '/lib/select2/select2.css' );
}
}
/**
* @todo: Rename the function to backend_js because it's now used only on admin.
*/
function front_end_js()
{
if ( defined( 'ICL_DONT_LOAD_LANGUAGES_JS' ) && ICL_DONT_LOAD_LANGUAGES_JS ) {
return;
}
wp_register_script( 'sitepress', ICL_PLUGIN_URL . '/res/js/sitepress.js', false );
wp_enqueue_script( 'sitepress' );
$vars = array(
'current_language' => $this->this_lang,
'icl_home' => $this->language_url(),
'ajax_url' => $this->convert_url( admin_url('admin-ajax.php'), $this->this_lang ),
'url_type' => $this->settings['language_negotiation_type']
);
wp_localize_script( 'sitepress', 'icl_vars', $vars );
}
function rtl_fix()
{
global $wp_styles;
if ( !empty( $wp_styles ) && $this->is_rtl() ) {
$wp_styles->text_direction = 'rtl';
}
}
function process_forms() {
if ( wp_verify_nonce(
(string)filter_input( INPUT_POST, 'icl_initial_languagenonce', FILTER_SANITIZE_STRING ),
'icl_initial_language'
) ) {
$setup_instance = wpml_get_setup_instance ();
$first_lang = filter_input ( INPUT_POST, 'icl_initial_language_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$this->admin_language = $first_lang;
$setup_instance->finish_step1($first_lang);
} elseif ( wp_verify_nonce(
(string)filter_input( INPUT_POST, 'icl_site_description_wizardnounce', FILTER_SANITIZE_STRING ),
'icl_site_description_wizard'
) ) {
if ( isset( $_POST[ 'icl_content_trans_setup_back_2' ] ) ) {
// back button.
$this->settings[ 'content_translation_languages_setup' ] = 0;
$this->settings[ 'content_translation_setup_wizard_step' ] = 1;
$this->save_settings();
} elseif ( isset( $_POST[ 'icl_content_trans_setup_next_2' ] ) || isset( $_POST[ 'icl_content_trans_setup_next_2_enter' ] ) ) {
// next button.
$description = $_POST[ 'icl_description' ];
if ( $description == "" ) {
$_POST[ 'icl_form_errors' ] = __( 'Please provide a short description of the website so that translators know what background is required from them.', 'sitepress' );
} else {
$this->settings[ 'icl_site_description' ] = $description;
$this->settings[ 'content_translation_setup_wizard_step' ] = 3;
$this->save_settings();
}
}
}
}
function post_edit_language_options() {
/** @var TranslationManagement $iclTranslationManagement */
global $post, $iclTranslationManagement, $post_new_file, $post_type_object, $pagenow;
if ( null === $post || ! $this->get_setting( 'setup_complete', false ) ) {
return;
}
$is_preview = ( isset( $_POST['wp-preview'] ) && $_POST['wp-preview'] === 'dopreview' ) || is_preview();
$is_attachment = in_array( $pagenow, array( 'upload.php', 'media-upload.php' ), true )
|| ( isset( $post ) && 'attachment' === $post->post_type ) || is_attachment();
if ( $is_attachment || $is_preview ) {
return;
}
if ( current_user_can( 'manage_options' ) ) {
add_meta_box( 'icl_div_config', __( 'Multilingual Content Setup', 'sitepress' ), array( $this, 'meta_box_config' ), $post->post_type, 'normal', 'low' );
}
if ( filter_input(INPUT_POST, 'icl_action' ) === 'icl_mcs_inline' ) {
$custom_post_type = filter_input(INPUT_POST, 'custom_post');
$translate = (int)filter_input(INPUT_POST, 'translate');
$iclsettings[ 'custom_posts_sync_option' ][ $custom_post_type ] = $translate;
if ( $translate ) {
$this->verify_post_translations( $custom_post_type );
}
$custom_taxs_off = (array)filter_input(INPUT_POST, 'custom_taxs_off', FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
$custom_taxs_on = (array)filter_input(INPUT_POST, 'custom_taxs_on', FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
$tax_sync_options = array_merge(array_fill_keys($custom_taxs_on, 1), array_fill_keys($custom_taxs_off, 0));
foreach ( $tax_sync_options as $key => $setting ) {
$iclsettings[ 'taxonomies_sync_option' ][ $key ] = $setting;
if($setting){
$this->verify_taxonomy_translations( $key );
}
}
$cf_names = (array)filter_input(INPUT_POST, 'cfnames', FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
$cf_vals = (array)filter_input(INPUT_POST, 'cfvals', FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
if ( in_array( 1, $cf_vals, true ) ) {
global $wpml_post_translations;
$original_post_id = $wpml_post_translations->get_original_element ( $post->ID, true );
$translations = array_diff($wpml_post_translations->get_element_translations ( $original_post_id ), array($original_post_id));
}
foreach ( $cf_names as $k => $v ) {
$custom_field_name = base64_decode ( $v );
$cf_translation_state = isset( $cf_vals[ $k ] ) ? (int) $cf_vals[ $k ] : 0;
$iclTranslationManagement->settings[ 'custom_fields_translation' ][ $custom_field_name ] = $cf_translation_state;
$iclTranslationManagement->save_settings();
/**
* Fires after update of custom fields synchronisation preferences on the post edit screen
*/
do_action('wpml_single_custom_field_sync_option_updated', array($custom_field_name => $cf_translation_state) );
// sync the custom fields for the current post
if ( 1 === $cf_translation_state ) {
/**
* @var int[] $translations
* @var int $original_post_id
*/
foreach ( $translations as $translated_id ) {
$this->sync_custom_field($original_post_id, $translated_id, $custom_field_name);
}
}
}
if ( !empty( $iclsettings ) ) {
$this->save_settings( $iclsettings );
}
}
$post_types = array_keys( $this->get_translatable_documents() );
if ( in_array( $post->post_type, $post_types, true ) ) {
add_meta_box( 'icl_div', __( 'Language', 'sitepress' ), array( $this, 'meta_box' ), $post->post_type, 'side', 'high' );
}
//Fix the "Add new" button adding the language argument, so to create new content in the same language
if ( isset( $post_new_file, $post_type_object ) && $this->is_translated_post_type( $post_type_object->name ) ) {
$post_language = $this->get_language_for_element($post->ID, 'post_' . $post_type_object->name);
$post_new_file = add_query_arg(array('lang' => $post_language), $post_new_file);
}
}
function set_element_language_details_action( $args ) {
$element_id = $args[ 'element_id' ];
$element_type = isset( $args[ 'element_type' ] ) ? $args[ 'element_type' ] : 'post_post';
$trid = $args[ 'trid' ];
$language_code = $args[ 'language_code' ];
$source_language_code = isset( $args[ 'source_language_code' ] ) ? $args[ 'source_language_code' ] : null;
$check_duplicates = isset( $args[ 'check_duplicates' ] ) ? $args[ 'check_duplicates' ] : true;
$result = $this->set_element_language_details( $element_id, $element_type, $trid, $language_code, $source_language_code, $check_duplicates );
$args[ 'result' ] = $result;
}
/**
* @param int $el_id the element's ID (for terms we use the `term_taxonomy_id`)
* @param string $el_type
* @param int $trid
* @param string $language_code
* @param null|string $src_language_code
* @param bool $check_duplicates
*
* @return bool|int|null|string
*/
public function set_element_language_details(
$el_id,
$el_type = 'post_post',
$trid,
$language_code,
$src_language_code = null,
$check_duplicates = true
) {
if ( ! $this->language_setter ) {
$this->language_setter = new WPML_Set_Language( $this,
$this->wpdb,
$this->post_translation,
$this->term_translation );
}
return $this->language_setter->set(
$el_id,
$el_type,
$trid,
$language_code,
$src_language_code,
$check_duplicates
);
}
function delete_element_translation( $trid, $element_type, $language_code = false ) {
$result = false;
if ( $trid !== false && is_numeric( $trid ) && $element_type !== false && is_string( $trid ) ) {
$delete_where = array( 'trid' => $trid, 'element_type' => $element_type );
$delete_formats = array( '%d', '%s' );
if ( $language_code ) {
$delete_where[ 'language_code' ] = $language_code;
$delete_formats[ ] = '%s';
}
$context = explode( '_', $element_type );
$update_args = array(
'trid' => $trid,
'element_type' => $element_type,
'context' => $context[0]
);
do_action( 'wpml_translation_update', array_merge( $update_args, array( 'type' => 'before_delete' ) ) );
$result = $this->wpdb->delete( $this->wpdb->prefix . 'icl_translations', $delete_where, $delete_formats );
do_action( 'wpml_translation_update', array_merge( $update_args, array( 'type' => 'after_delete' ) ) );
$this->get_translations_cache()->clear();
}
return $result;
}
function get_element_language_details( $el_id, $el_type = 'post_post' ) {
$details = false;
if ( $el_id ) {
if ( strpos( $el_type, 'post_' ) === 0 ) {
$details = $this->post_translation->get_element_language_details( $el_id, OBJECT );
}
if ( strpos( $el_type, 'tax_' ) === 0 ) {
$details = $this->term_translation->get_element_language_details( $el_id, OBJECT );
}
if ( ! $details ) {
$cache_key = $el_id . ':' . $el_type;
$cache_group = 'element_language_details';
$cached_details = wp_cache_get( $cache_key, $cache_group );
if ( $cached_details ) {
return $cached_details;
}
if ( $this->get_translations_cache()->has_key( $el_id . $el_type ) ) {
return $this->get_translations_cache()->get( $el_id . $el_type );
}
$details_query = "
SELECT trid, language_code, source_language_code
FROM {$this->wpdb->prefix}icl_translations
WHERE element_id=%d AND element_type=%s
";
$details_prepare = $this->wpdb->prepare( $details_query, array( $el_id, $el_type ) );
$details = $this->wpdb->get_row( $details_prepare );
$this->get_translations_cache()->set( $el_id . $el_type, $details );
wp_cache_add( $cache_key, $details, $cache_group );
}
}
return $details;
}
public function sync_custom_field( $post_id_from, $post_id_to, $meta_key ) {
$sync_custom_fields = new WPML_Sync_Custom_Fields(
$this->wpdb,
new WPML_Translation_Element_Factory( $this ),
array( $meta_key )
);
$sync_custom_fields->sync_custom_field( $post_id_from, $post_id_to, $meta_key );
}
function copy_custom_fields( $post_id_from, $post_id_to ) {
$custom_fields_to_copy = $this->get_custom_fields_translation_settings( WPML_COPY_CUSTOM_FIELD );
foreach ( $custom_fields_to_copy as $meta_key ) {
$meta_from = get_post_meta( $post_id_from, $meta_key );
$meta_to = get_post_meta( $post_id_to, $meta_key );
if ( $meta_from || $meta_to ) {
$this->sync_custom_field( $post_id_from, $post_id_to, $meta_key );
}
}
}
public function get_custom_fields_translation_settings( $mode ) {
$custom_fields_for_mode = array();
if ( isset( $this->settings['translation-management']['custom_fields_translation'] ) ) {
foreach ( $this->settings['translation-management']['custom_fields_translation'] as $meta_key => $option ) {
if ( $option == $mode ) {
$custom_fields_for_mode[] = $meta_key;
}
}
}
return $custom_fields_for_mode;
}
/**
*This method does nothing and is only there as a placeholder for backward compatibility with old Types versions!
*
* @deprecated Since WPML 3.1.9
*
* @param $meta_id
* @param $object_id
* @param $meta_key
* @param $_meta_value
*/
function update_post_meta( $meta_id, $object_id, $meta_key, $_meta_value ) {
return;
}
/**
*This method does nothing and is only there as a placeholder for backward compatibility with old Types versions!
*
* @deprecated Since WPML 3.1.9
*
* @param $meta_id
*/
function delete_post_meta( $meta_id ) {
return;
}
/* Custom fields synchronization - END */
function get_element_translations_filter( $value, $trid, $el_type = 'post_post', $skip_empty = false, $all_statuses = false, $skip_cache = false ) {
return $this->get_element_translations( $trid, $el_type, $skip_empty, $all_statuses, $skip_cache );
}
public function get_original_element_id_filter($empty, $element_id, $element_type = 'post_post') {
$original_element_id = $this->get_original_element_id($element_id, $element_type);
return $original_element_id;
}
public function get_element_trid_filter($empty, $element_id, $element_type = 'post_post') {
$trid = $this->get_element_trid($element_id, $element_type);
return $trid;
}
function is_original_content_filter($default = false, $element_id, $element_type = 'post_post') {
$is_original_content = $default;
$trid = $this->get_element_trid($element_id, $element_type);
$translations = $this->get_element_translations($trid, $element_type);
if($translations) {
foreach($translations as $language_code => $translation) {
if($translation->element_id == $element_id) {
$is_original_content = $translation->original;
break;
}
}
}
return $is_original_content;
}
/**
* @param int $trid
* @param string $el_type Use comment, post, page, {custom post time name}, nav_menu, nav_menu_item, category, post_tag, etc. (prefixed with 'post_', 'tax_', or nothing for 'comment')
* @param bool $skip_empty
* @param bool $all_statuses
* @param bool $skip_cache
* @param bool $skip_recursions
*
* @return array|bool|mixed
*/
function get_element_translations( $trid, $el_type = 'post_post', $skip_empty = false, $all_statuses = false, $skip_cache = false, $skip_recursions = false ) {
$wpml_translations = new WPML_Translations( $this );
$wpml_translations->skip_empty = $skip_empty;
$wpml_translations->all_statuses = $all_statuses;
$wpml_translations->skip_cache = $skip_cache;
$wpml_translations->skip_recursions = $skip_recursions;
return $wpml_translations->get_translations( $trid, $el_type );
}
function clear_elements_cache( $ids, $taxonomy ) {
$cache = new WPML_WP_Cache( WPML_ELEMENT_TRANSLATIONS_CACHE_GROUP );
$cache->flush_group_cache();
}
static function get_original_element_id( $element_id, $element_type = 'post_post', $skip_empty = false, $all_statuses = false, $skip_cache = false ) {
global $sitepress;
$original_element_id = false;
$trid = $sitepress->get_element_trid( $element_id, $element_type );
if ( $trid ) {
$original_element = $sitepress->get_original_element_translation( $trid, $element_type, $skip_empty, $all_statuses, $skip_cache );
if ( $original_element ) {
$original_element_id = $original_element->element_id;
}
}
return $original_element_id;
}
public function get_original_element_translation( $trid, $element_type, $skip_empty = false, $all_statuses = false, $skip_cache = false ) {
$cache_key_args = array_filter( array( $trid, $element_type, $skip_empty, $all_statuses ) );
$cache_key = md5( wp_json_encode( $cache_key_args ) );
$cache_group = 'original_element';
$original_element = null;
if ( ! $skip_cache ) {
$original_element = wp_cache_get( $cache_key, $cache_group );
}
if ( $original_element ) {
return $original_element;
}
$element_translations = $this->get_element_translations( $trid, $element_type, $skip_empty, $all_statuses, $skip_cache );
$original_element = null;
foreach ( $element_translations as $element_translation ) {
if ( $element_translation->original ) {
$original_element = $element_translation;
break;
}
}
if ( $original_element ) {
wp_cache_set( $cache_key, $original_element, $cache_group );
}
return $original_element;
}
/**
* @param int $element_id Use term_taxonomy_id for taxonomies, post_id for posts
* @param string $el_type Use comment, post, page, {custom post time name}, nav_menu, nav_menu_item, category, post_tag, etc. (prefixed with 'post_', 'tax_', or nothing for 'comment')
*
* @return bool|mixed|null|string
*/
function get_element_trid( $element_id, $el_type = 'post_post' ) {
if ( strpos ( $el_type, 'tax_' ) === 0 ) {
/** @var WPML_Term_Translation $wpml_term_translations */
global $wpml_term_translations;
return $wpml_term_translations->get_element_trid ( $element_id );
} elseif ( strpos ( $el_type, 'post_' ) === 0 ) {
global $wpml_post_translations;
return $wpml_post_translations->get_element_trid ( $element_id );
} else {
$cache_key = $element_id . ':' . $el_type;
$cache_group = 'element_trid';
$temp_trid = wp_cache_get( $cache_key, $cache_group );
if ( (bool) $temp_trid === true ) {
return $temp_trid;
}
$trid_prepared = $this->wpdb->prepare(
"SELECT trid FROM {$this->wpdb->prefix}icl_translations WHERE element_id=%d AND element_type=%s",
array( $element_id, $el_type )
);
$trid = $this->wpdb->get_var( $trid_prepared );
if ( $trid ) {
wp_cache_add( $cache_key, $trid, $cache_group );
}
}
return $trid;
}
/**
* @param int $trid
*
* @return int|bool
*/
static function get_original_element_id_by_trid( $trid ) {
global $wpdb;
if ( (bool) $trid === true ) {
$original_element_id_prepared = $wpdb->prepare( "SELECT element_id
FROM {$wpdb->prefix}icl_translations
WHERE trid=%d
AND source_language_code IS NULL
LIMIT 1",
$trid );
$element_id = $wpdb->get_var( $original_element_id_prepared );
} else {
$element_id = false;
}
return $element_id;
}
static function get_source_language_by_trid( $trid ) {
global $wpdb;
$source_language = null;
if ( (bool) $trid === true ) {
$cache = new WPML_WP_Cache( 'get_source_language_by_trid' );
$found = false;
$source_language = $cache->get( $trid, $found );
if ( ! $found ) {
$source_language_prepared = $wpdb->prepare( "
SELECT language_code
FROM {$wpdb->prefix}icl_translations
WHERE trid=%d
AND source_language_code IS NULL
LIMIT 1",
$trid );
$source_language = $wpdb->get_var( $source_language_prepared );
$cache->set( $trid, $source_language );
}
}
return $source_language;
}
public function get_element_translations_object( $element_type ) {
global $wpml_post_translations, $wpml_term_translations, $wpml_cache_factory;
$element_translations = null;
if ( strpos ( $element_type, 'tax_' ) === 0 ) {
$element_translations = $wpml_term_translations;
} elseif ( strpos ( $element_type, 'post_' ) === 0 ) {
$element_translations = $wpml_post_translations;
} else {
$element_translations = new WPML_Element_Type_Translation( $this->wpdb, $wpml_cache_factory, $element_type );
}
return $element_translations;
}
/**
* @param int $element_id Use term_taxonomy_id for taxonomies, post_id for posts
* @param string $element_type Use comment, post, page, {custom post time name}, nav_menu, nav_menu_item, category,
* post_tag, etc. (prefixed with 'post_', 'tax_', or nothing for 'comment')
*
* @return null|string
*/
function get_language_for_element( $element_id, $element_type = 'post_post' ) {
$translation_object = $this->get_element_translations_object( $element_type );
return $translation_object->get_element_lang_code( $element_id );
}
/**
* @param string $el_type Use comment, post, page, {custom post time name}, nav_menu, nav_menu_item, category, post_tag, etc. (prefixed with 'post_', 'tax_', or nothing for 'comment')
* @param string $target_lang Target language code
* @param string $source_lang Source language code
*
* @return array
*/
function get_elements_without_translations( $el_type, $target_lang, $source_lang ) {
$sql = $this->wpdb->prepare(
"SELECT trid
FROM {$this->wpdb->prefix}icl_translations
WHERE language_code = %s
AND element_type = %s",
$target_lang,
$el_type
);
$trids_for_target = $this->wpdb->get_col( $sql );
if ( sizeof( $trids_for_target ) > 0 ) {
$trids_for_target = wpml_prepare_in( $trids_for_target, '%d' );
$not_trids = 'AND trid NOT IN (' . $trids_for_target . ')';
} else {
$not_trids = '';
}
$join = $where = '';
// exclude trashed posts
if ( 0 === strpos( $el_type, 'post_' ) ) {
$join .= " JOIN {$this->wpdb->posts} ON {$this->wpdb->posts}.ID = {$this->wpdb->prefix}icl_translations.element_id";
$where .= " AND {$this->wpdb->posts}.post_status <> 'trash' AND {$this->wpdb->posts}.post_status <> 'auto-draft'";
}
// Now get all the elements that are in the source language that
// are not already translated into the target language.
$sql = $this->wpdb->prepare(
"SELECT element_id
FROM
{$this->wpdb->prefix}icl_translations
{$join}
WHERE language_code = %s
{$not_trids}
AND element_type= %s
{$where}
",
$source_lang,
$el_type
);
return $this->wpdb->get_col( $sql );
}
/**
* @param string $selected_language
* @param string $default_language
* @param string $post_type
*
* @used_by SitePress:meta_box
*
* @return array
*/
function get_posts_without_translations( $selected_language, $default_language, $post_type = 'post_post' ) {
$untranslated_ids = $this->get_elements_without_translations( $post_type, $selected_language, $default_language );
$untranslated = array();
foreach ( $untranslated_ids as $id ) {
$untranslated[ $id ] = $this->wpdb->get_var(
$this->wpdb->prepare( "SELECT post_title FROM {$this->wpdb->prefix}posts WHERE ID = %d", $id )
);
}
return $untranslated;
}
public function get_orphan_translations( $trid, $post_type = 'post', $source_language ) {
$results = array();
$translations = $this->get_element_translations( $trid, 'post_' . $post_type );
if ( count( $translations ) === 1 ) {
$sql = " SELECT trid, ";
$language_codes = array_keys( $this->get_active_languages() );
$sql_languages = array();
$sql_languages_having = array();
foreach ( $language_codes as $language_code ) {
$sql_languages[] = "SUM(CASE language_code WHEN '" . esc_sql( $language_code ) . "' THEN 1 ELSE 0 END) AS `" . esc_sql( $language_code ) . '`';
if ( $language_code == $source_language ) {
$sql_languages_having[] = '`' . esc_sql( $language_code ) . '`= 0';
}
}
$sql .= implode( ',', $sql_languages );
$sql .= " FROM {$this->wpdb->prefix}icl_translations WHERE element_type = %s ";
$sql .= 'GROUP BY trid ';
$sql .= 'HAVING ' . implode( ' AND ', $sql_languages_having );
$sql .= " ORDER BY trid;";
$sql_prepared = $this->wpdb->prepare( $sql, array( 'post_' . $post_type ) );
$trid_results = $this->wpdb->get_results( $sql_prepared, 'ARRAY_A' );
$trid_list = array_column( $trid_results, 'trid' );
if ( $trid_list ) {
$sql = "SELECT trid AS value, CONCAT('[', t.language_code, '] ', (CASE p.post_title WHEN '' THEN CONCAT(LEFT(p.post_content, 30), '...') ELSE p.post_title END)) AS label
FROM {$this->wpdb->posts} p
INNER JOIN {$this->wpdb->prefix}icl_translations t
ON p.ID = t.element_id
WHERE t.element_type = %s
AND t.language_code <> %s
AND t.trid IN (" . wpml_prepare_in( $trid_list, '%d' ) . ") ";
$sql_prepared = $this->wpdb->prepare( $sql, array( 'post_' . $post_type, $source_language ) );
$results = $this->wpdb->get_results( $sql_prepared );
}
}
return $results;
}
/**
* @param WP_Post $post
*/
function meta_box( $post ) {
$post_edit_metabox = new WPML_Meta_Boxes_Post_Edit_HTML( $this, $this->post_translation );
$post_edit_metabox->render_languages( $post );
do_action( 'wpml_post_edit_languages', $post );
}
function meta_box_config( $post ) {
/** @var TranslationManagement $iclTranslationManagement */
global $iclTranslationManagement,$wp_taxonomies, $wp_post_types, $sitepress_settings;
if ( ! $this->settings[ 'setup_complete' ] ) {
return;
}
$translation_modes = new WPML_Translation_Modes();
echo '
labels->name ?> |
add_query_arg(array('show_system_fields' => !$settings_factory->show_system_fields)), 'text' => $settings_factory->show_system_fields ? __('Hide system fields', 'sitepress') : __('Show system fields', 'sitepress'), ); ?>
render(); $custom_keys = $settings_menu->is_rendered(); } if ( !empty( $custom_taxonomies ) || !empty( $custom_keys ) ) { echo '' . __( 'Note: Custom taxonomies and custom fields are shared across different post types.', 'sitepress' ) . ''; } } echo ''; if ( $cp_editable || !empty( $custom_taxonomies ) || !empty( $custom_keys ) ) { echo '(settings[ 'show_translations_flag' ] )): ?>style="display:none;">settings[ 'show_translations_flag' ] )): ?>style="display:none;">)
' . $n[ 'message' ] . '
'; echo '