get_var( "SHOW TABLES LIKE '{$wpdb->prefix}icl_translation_status'" );
if ( $table_exists ) {
$icl_job_count_query = "SELECT COUNT(*)
FROM {$wpdb->prefix}icl_translation_status
WHERE translation_service = 'icanlocalize'";
$icl_job_count = $wpdb->get_var( $icl_job_count_query );
}
return $icl_job_count;
}
/**
* @param string $key
* @param mixed|false $default
*
* @return bool|mixed
* @since 3.1
* @deprecated 3.2 use 'wpml_setting' filter instead
*/
function icl_get_setting( $key, $default = false ) {
global $sitepress_settings;
$sitepress_settings = isset($sitepress_settings) ? $sitepress_settings : get_option('icl_sitepress_settings');
return isset( $sitepress_settings[ $key ] ) ? $sitepress_settings[ $key ] : $default;
}
/**
* Get a WPML setting value
* If the Main SitePress Class cannot be access to the function will read the setting from the database
* Will return false if the requested key is not set or
* the default value passed in the function's second parameter
*
* @param mixed|false $default Required. The value to return if the settings key does not exist.
* (typically it's false, but you may want to use something else)
* @param string $key The settings name key to return the value of
* @param mixed $deprecated Deprecated param.
*
* @todo [WPML 3.3] Remove deprecated argument
*
* @return mixed The value of the requested setting, or $default
* @since 3.2
* @use \SitePress::api_hooks
*/
function wpml_get_setting_filter( $default, $key, $deprecated = null ) {
$default = $deprecated !== null && !$default ? $deprecated : $default;
return icl_get_setting($key, $default);
}
/**
* @param string $key
* @param string $sub_key
* @param mixed|false $default
*
* @return bool|mixed
* @since 3.1
* @deprecated 3.2 use 'wpml_sub_setting' filter instead
*/
function icl_get_sub_setting( $key, $sub_key, $default = false ) {
$parent = icl_get_setting( $key, array() );
return isset( $parent[ $sub_key ] ) ? $parent[ $sub_key ] : $default;
}
/**
* Get a WPML sub setting value
* @uses \wpml_get_setting_filter
*
* @param mixed|false $default Required. The value to return if the settings key does not exist.
* (typically it's false, but you may want to use something else)
* @param string $key The settings name key the sub key belongs to
* @param string $sub_key The sub key to return the value of
* @param mixed $deprecated Deprecated param
*
* @todo [WPML 3.3] Remove deprecated argument
*
* @return mixed The value of the requested setting, or $default
* @since 3.2
* @use \SitePress::api_hooks
*/
function wpml_get_sub_setting_filter( $default, $key, $sub_key, $deprecated = null ) {
$default = $deprecated !== null && !$default ? $deprecated : $default;
$parent = wpml_get_setting_filter( $key, array() );
return isset( $parent[ $sub_key ] ) ? $parent[ $sub_key ] : $default;
}
/**
* @param string $key
* @param mixed $value
* @param bool $save_now Must call icl_save_settings() to permanently store the value
*/
function icl_set_setting( $key, $value, $save_now = false ) {
global $sitepress_settings;
$sitepress_settings[ $key ] = $value;
if ( $save_now === true ) {
//We need to save settings anyway, in this case
update_option( 'icl_sitepress_settings', $sitepress_settings );
do_action( 'icl_save_settings', $sitepress_settings );
}
}
function icl_save_settings() {
global $sitepress;
$sitepress->save_settings();
}
function icl_get_settings() {
global $sitepress;
return isset( $sitepress ) ? $sitepress->get_settings() : false;
}
/**
* Add settings link to plugin page.
*
* @param $links
* @param $file
*
* @return array
*/
function icl_plugin_action_links( $links, $file ) {
$this_plugin = basename( ICL_PLUGIN_PATH ) . '/sitepress.php';
if ( $file == $this_plugin ) {
$links[ ] = '' . __( 'Configure', 'sitepress' ) . '';
}
return $links;
}
if ( defined( 'ICL_DEBUG_MODE' ) && ICL_DEBUG_MODE ) {
add_action( 'admin_notices', '_icl_deprecated_icl_debug_mode' );
}
function _icl_deprecated_icl_debug_mode() {
echo '
ICL_DEBUG_MODE no longer supported. Please use WP_DEBUG instead.
';
}
if ( ! function_exists( 'icl_js_escape' ) ) {
function icl_js_escape( $str ) {
$str = esc_js( $str );
$str = htmlspecialchars_decode( $str );
return $str;
}
}
function _icl_tax_has_objects_recursive( $id, $term_id = - 1, $rec = 0 ) {
// based on the case where two categories were one the parent of another
// eliminating the chance of infinite loops by letting this function calling itself too many times
// 100 is the default limit in most of teh php configuration
//
// this limit this function to work only with categories nested up to 60 levels
// should enough for most cases
if ( $rec > 60 ) {
return false;
}
global $wpdb;
if ( $term_id === - 1 ) {
$term_id = $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $id ) );
}
$children = $wpdb->get_results( $wpdb->prepare( "
SELECT term_taxonomy_id, term_id, count FROM {$wpdb->term_taxonomy} WHERE parent = %d
", $term_id ) );
$count = 0;
foreach ( $children as $ch ) {
$count += $ch->count;
}
if ( $count ) {
return true;
} else {
foreach ( $children as $ch ) {
if ( _icl_tax_has_objects_recursive( $ch->term_taxonomy_id, $ch->term_id, $rec + 1 ) ) {
return true;
}
}
}
return false;
}
function _icl_trash_restore_prompt() {
if ( isset( $_GET[ 'lang' ] ) ) {
$post = get_post( intval( $_GET[ 'post' ] ) );
if ( isset( $post->post_status ) && $post->post_status == 'trash' ) {
$post_type_object = get_post_type_object( $post->post_type );
$ret = '';
$ret .= sprintf( __( 'This translation is currently in the trash. You need to either delete it permanently or restore it in order to continue.' ), get_delete_post_link( $post->ID, '', true ), wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link
. '&action=untrash', $post->ID ) ),
'untrash-post_'
. $post->ID ) );
$ret .= '
';
wp_die( $ret );
}
}
}
function icl_pop_info( $message, $icon = 'info', $args = array() ) {
switch ( $icon ) {
case 'info':
$icon = ICL_PLUGIN_URL . '/res/img/info.png';
break;
case 'question':
$icon = ICL_PLUGIN_URL . '/res/img/question1.png';
break;
}
$defaults = array(
'icon_size' => 16,
'but_style' => array()
);
extract( $defaults );
extract( $args, EXTR_OVERWRITE );
/** @var $but_style array */
/** @var $icon_size string */
$close_icon = ICL_PLUGIN_URL . '/res/img/ico-close.png';
?>
post_type;
if ( $post->post_status == 'auto-draft' || $post->post_type == 'revision' ) {
return;
}
global $sitepress;
$iclTranslationManagement = wpml_load_core_tm();
if ( $sitepress->is_translated_post_type( $post_type ) ) {
$iclTranslationManagement->make_duplicates_all( $master_post_id );
}
}
/**
* Build duplicated posts from a master post only in case of the duplicate not being present at the time.
*
* @param string $master_post_id The ID of the post to duplicate from. Master post doesn't need to be in the default language.
*
* @uses SitePress
* @since unknown
* @deprecated 3.2 use 'wpml_make_post_duplicates' action instead
*/
function icl_makes_duplicates_public( $master_post_id ) {
wpml_make_post_duplicates_action( $master_post_id );
}
/**
* Build duplicated posts from a master post only in case of the duplicate not being present at the time.
*
* @param int $master_post_id The ID of the post to duplicate from.
* Master post doesn't need to be in the default language.
*
* @uses SitePress
* @since 3.2
* @use \SitePress::api_hooks
*/
function wpml_make_post_duplicates_action( $master_post_id ) {
global $sitepress;
$master_post = get_post( $master_post_id );
if ( $master_post->post_status == 'auto-draft' || $master_post->post_type == 'revision' ) {
return;
}
$active_langs = $sitepress->get_active_languages();
foreach ( $active_langs as $lang_to => $one ) {
$trid = $sitepress->get_element_trid( $master_post->ID, 'post_' . $master_post->post_type );
$lang_from = $sitepress->get_source_language_by_trid( $trid );
if ( $lang_from == $lang_to ) {
continue;
}
$post_array[ 'post_author' ] = $master_post->post_author;
$post_array[ 'post_date' ] = $master_post->post_date;
$post_array[ 'post_date_gmt' ] = $master_post->post_date_gmt;
$post_array[ 'post_content' ] = addslashes_gpc( apply_filters( 'icl_duplicate_generic_string', $master_post->post_content, $lang_to, array( 'context' => 'post', 'attribute' => 'content', 'key' => $master_post->ID ) ) );
$post_array[ 'post_title' ] = addslashes_gpc( apply_filters( 'icl_duplicate_generic_string', $master_post->post_title, $lang_to, array( 'context' => 'post', 'attribute' => 'title', 'key' => $master_post->ID ) ) );
$post_array[ 'post_excerpt' ] = addslashes_gpc( apply_filters( 'icl_duplicate_generic_string', $master_post->post_excerpt, $lang_to, array( 'context' => 'post', 'attribute' => 'excerpt', 'key' => $master_post->ID ) ) );
$post_array[ 'post_status' ] = $master_post->post_status;
//TODO [WPML 3.3.] wp_insert_post() does accept 'post_category': even though is not part of the WP_Post object, it deals with it. But as far as I know $master_post doesn't have this property, when set with get_post(), so probably we need to fix that, shouldn't we?
$post_array[ 'post_category' ] = $master_post->post_category;
$post_array[ 'comment_status' ] = $master_post->comment_status;
$post_array[ 'ping_status' ] = $master_post->ping_status;
$post_array[ 'post_name' ] = $master_post->post_name;
$post_array[ 'menu_order' ] = $master_post->menu_order;
$post_array[ 'post_type' ] = $master_post->post_type;
$post_array[ 'post_mime_type' ] = $master_post->post_mime_type;
if ( $master_post->post_parent ) {
$parent = icl_object_id( $master_post->post_parent, $master_post->post_type, false, $lang_to );
$post_array[ 'post_parent' ] = $parent;
}
$id = wp_insert_post( $post_array );
$sitepress->set_element_language_details( $id, 'post_' . $post_array[ 'post_type' ], $trid, $lang_to, $lang_from, false );
}
}
/**
* Wrapper function for deprecated like_escape() and recommended wpdb::esc_like()
* @global wpdb $wpdb
*
* @param string $text
*
* @return string
*/
function wpml_like_escape( $text ) {
global $wpdb;
if ( method_exists( $wpdb, 'esc_like' ) ) {
return $wpdb->esc_like( $text );
}
/** @noinspection PhpDeprecationInspection */
return like_escape( $text );
}
function icl_do_not_promote() {
return defined( 'ICL_DONT_PROMOTE' ) && ICL_DONT_PROMOTE;
}
/**
* @param $time
*
* @return string
*/
function icl_convert_to_user_time( $time ) {
//offset between server time and user time in seconds
$time_offset = get_option( 'gmt_offset' ) * 3600;
$local_time = __( 'Last Update Time could not be determined', 'sitepress' );
try {
//unix time stamp in server time
$creation_time = strtotime( $time );
//creating dates before 2014 are impossible
if ( $creation_time !== false ) {
$local_time = date( 'Y-m-d H:i:s', $creation_time + $time_offset );
}
} catch ( Exception $e ) {
//Ignoring the exception, as we already set the default value in $local_time
}
return $local_time;
}
/**
* Check if given language is activated
* @global sitepress $sitepress
*
* @param string $language 2 letters language code
*
* @return boolean
* @since unknown
* @deprecated 3.2 use 'wpml_language_is_active' filter instead
*/
function icl_is_language_active( $language ) {
global $sitepress;
$active_languages = $sitepress->get_active_languages();
return isset( $active_languages[ $language ] );
}
/**
* Checks if given language is enabled
* @global sitepress $sitepress
*
* @param mixed $empty_value This is normally the value the filter will be modifying.
* We are not filtering anything here therefore the NULL value
* This for the filter function to actually receive the full argument list:
* apply_filters('wpml_language_is_active', '', $language_code);
* @param string $language_code The language code to check Accepts a 2-letter language code
*
* @return boolean
* @since 3.2
* @use \SitePress::api_hooks
*/
function wpml_language_is_active_filter( $empty_value, $language_code ) {
global $sitepress;
return $sitepress->is_active_language( $language_code );
}
/**
* @param string $url url either with or without schema
* Removes the subdirectory in which WordPress is installed from a url.
* If WordPress is not installed in a subdirectory, then the input is returned unaltered.
*
* @return string the url input without the blog's subdirectory. Potentially existing schemata on the input are kept intact.
*/
function wpml_strip_subdir_from_url( $url ) {
/** @var WPML_URL_Converter $wpml_url_converter */
global $wpml_url_converter;
$subdir = parse_url( $wpml_url_converter->get_abs_home(), PHP_URL_PATH );
$subdir_slugs = array_values( array_filter( explode( '/', $subdir ) ) );
$url_path_expl = explode( '/', preg_replace( '#^(http|https)://#', '', $url ) );
array_shift( $url_path_expl );
$url_slugs = array_values( array_filter( $url_path_expl ) );
$url_slugs_before = $url_slugs;
$url_slugs = array_diff_assoc( $url_slugs, $subdir_slugs );
$url = str_replace( '/' . join( '/', $url_slugs_before ), '/' . join( '/', $url_slugs ), $url );
return untrailingslashit( $url );
}
/**
* Changes array of items into string of items, separated by comma and sql-escaped
* @see https://coderwall.com/p/zepnaw
* @global wpdb $wpdb
*
* @param mixed|array $items item(s) to be joined into string
* @param string $format %s or %d
*
* @return string Items separated by comma and sql-escaped
*/
function wpml_prepare_in( $items, $format = '%s' ) {
global $wpdb;
$items = (array) $items;
$how_many = count( $items );
if ( $how_many > 0 ) {
$placeholders = array_fill( 0, $how_many, $format );
$prepared_format = implode( ",", $placeholders );
$prepared_in = $wpdb->prepare( $prepared_format, $items );
} else {
$prepared_in = "";
}
return $prepared_in;
}
function is_not_installing_plugins() {
$checked = isset( $_REQUEST[ 'checked' ] ) ? (array) $_REQUEST[ 'checked' ] : array();
if ( ! isset( $_REQUEST[ 'action' ] ) ) {
return true;
} elseif ( $_REQUEST[ 'action' ] != 'activate' && $_REQUEST[ 'action' ] != 'activate-selected' ) {
return true;
} elseif ( ( ! isset( $_REQUEST[ 'plugin' ] ) || $_REQUEST[ 'plugin' ] != basename( ICL_PLUGIN_PATH ) . '/' . basename( __FILE__ ) ) && ! in_array( ICL_PLUGIN_FOLDER . '/' . basename( __FILE__ ), $checked ) ) {
return true;
} elseif ( in_array( ICL_PLUGIN_FOLDER . '/' . basename( __FILE__ ), $checked ) && ! isset( $sitepress ) ) {
return true;
}
return false;
}
function wpml_mb_strtolower( $string ) {
if ( function_exists( 'mb_strtolower' ) ) {
return mb_strtolower( $string );
}
return strtolower( $string );
}
function wpml_mb_strpos( $haystack, $needle, $offset = 0 ) {
if ( function_exists( 'mb_strpos' ) ) {
return mb_strpos( $haystack, $needle, $offset );
}
return strpos( $haystack, $needle, $offset );
}
function wpml_set_plugin_as_inactive() {
global $icl_plugin_inactive;
if ( ! defined( 'ICL_PLUGIN_INACTIVE' ) ) {
define( 'ICL_PLUGIN_INACTIVE', true );
}
$icl_plugin_inactive = true;
}
function wpml_version_is( $version_to_check, $comparison = '==' ) {
return version_compare( ICL_SITEPRESS_VERSION, $version_to_check, $comparison ) && function_exists( 'wpml_site_uses_icl' );
}
function wpml_site_uses_icl_message_notice() {
$plugin_download_url = 'https://wpml.org/account/downloads/#migrate-icanlocalize-translation-to-wpml-3-2';
$plugin_download_label = _x('Download from WPML.org', 'Site Uses ICL: message notice, plugin download button', 'sitepress');
$plugin_download_anchor = '' . $plugin_download_label . '';
$messages[] = _x( 'Your website is using ICanLocalize for professional translation. This version of WPML requires an update to your ICanLocalize project. We prepared a plugin that will do this update for you.', 'Site Uses ICL: message notice line 1', 'sitepress' );
$messages[] = $plugin_download_anchor;
$messages[] = _x( 'After you log-in, go to Downloads and get the plugin called "Migrate ICanLocalize Translation to WPML 3.2". Install and activate it, then follow the instructions to migrate your translation project.', 'Site Uses ICL: message notice line 2', 'sitepress' );
?>
1,
'high_priority' => 1,
);
if ( $sitepress ) {
$args[ 'site_key_nags' ] = array(
array(
'repository_id' => 'wpml',
'product_name' => 'WPML',
'condition_cb' => array( $sitepress, 'setup' )
)
);
}
/** @var WP_Installer $wp_installer_instance */
WP_Installer_Setup( $wp_installer_instance, $args );
// installer hook - end
}
function wpml_missing_filter_input_notice() {
?>
get_var (
"SELECT collation_name
FROM information_schema.COLUMNS
WHERE TABLE_NAME = '{$wpdb->posts}'
AND COLUMN_NAME = 'post_type'
AND table_schema = (SELECT DATABASE())
LIMIT 1"
);
// translations
$table_name = $wpdb->prefix . 'icl_translations';
$sql
= "
ALTER TABLE `{$table_name}`
CHANGE `element_type` `element_type` VARCHAR( 36 ) NOT NULL DEFAULT 'post_post' COLLATE {$correct_collate}
";
if ( $wpdb->query ( $sql ) === false ) {
throw new Exception( $wpdb->last_error );
}
}