Files
doitinpoland.com/wp-content/plugins/wpml-translation-management/inc/core/wpml-tm-element-translations.class.php
2023-09-12 21:41:04 +02:00

207 lines
6.1 KiB
PHP

<?php
class WPML_TM_Element_Translations extends WPML_TM_Record_User {
/** @var int[] $trid_cache */
private $trid_cache;
/** @var int[] $job_id_cache */
private $job_id_cache;
/** @var int[] $job_id_cache */
private $translation_status_cache;
/** @var bool[] $update_status_cache */
private $update_status_cache;
/** @var string[] $element_type_prefix_cache */
private $element_type_prefix_cache = array();
public function init_hooks() {
add_action( 'wpml_cache_clear', array( $this, 'reload' ) );
add_filter(
'wpml_tm_translation_status',
array(
$this,
'get_translation_status_filter',
),
10,
2
);
}
public function reload() {
$this->trid_cache = array();
$this->job_id_cache = array();
$this->translation_status_cache = array();
$this->update_status_cache = array();
$this->element_type_prefix_cache = array();
}
public function is_update_needed( $trid, $language_code ) {
if ( isset( $this->update_status_cache[ $trid ][ $language_code ] ) ) {
$needs_update = $this->update_status_cache[ $trid ][ $language_code ];
} else {
$this->init_job_id( $trid, $language_code );
$needs_update = isset( $this->update_status_cache[ $trid ][ $language_code ] )
? $this->update_status_cache[ $trid ][ $language_code ] : 0;
}
return (bool) $needs_update;
}
/**
* @param int $trid
* @param string $language_code
*
* @return string
*/
public function get_element_type_prefix( $trid, $language_code ) {
if ( $trid && $language_code && ! isset( $this->element_type_prefix_cache[ $trid ] ) ) {
$this->init_job_id( $trid, $language_code );
}
return $trid && array_key_exists( $trid, $this->element_type_prefix_cache ) ? $this->element_type_prefix_cache[ $trid ] : '';
}
public function get_translation_status_filter( $empty, $args ) {
$trid = $args['trid'];
$language_code = $args['language_code'];
return $this->get_translation_status( $trid, $language_code );
}
/**
* @param int $trid
* @param string $language_code
*
* @return int
*/
public function get_translation_status( $trid, $language_code ) {
if ( isset( $this->translation_status_cache[ $trid ][ $language_code ] ) ) {
$status = $this->translation_status_cache[ $trid ][ $language_code ];
} else {
$this->init_job_id( $trid, $language_code );
$status = isset( $this->translation_status_cache[ $trid ][ $language_code ] )
? $this->translation_status_cache[ $trid ][ $language_code ] : 0;
}
return (int) $status;
}
public function init_job_id( $trid, $target_lang_code ) {
global $wpdb, $wpml_language_resolution;
if ( ! isset( $this->job_id_cache[ $trid ][ $target_lang_code ] ) ) {
$jobs = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
tj.job_id,
ts.status,
ts.needs_update,
t.language_code,
SUBSTRING_INDEX(t.element_type, '_', 1)
AS element_type_prefix
FROM {$wpdb->prefix}icl_translate_job tj
JOIN {$wpdb->prefix}icl_translation_status ts
ON tj.rid = ts.rid
JOIN {$wpdb->prefix}icl_translations t
ON ts.translation_id = t.translation_id
WHERE t.trid = %d
",
$trid
)
);
$active_langs = $wpml_language_resolution->get_active_language_codes();
foreach ( $active_langs as $lang_code ) {
$this->cache_job_in_lang( $jobs, $lang_code, $trid );
}
}
}
/**
* @param object[] $jobs
* @param string $lang
* @param string $trid
*
* @return false|object
*/
private function cache_job_in_lang( $jobs, $lang, $trid ) {
$res = false;
foreach ( $jobs as $job ) {
if ( $job->language_code === $lang ) {
$res = $job;
break;
}
}
if ( (bool) $res === true ) {
$job_id = $res->job_id;
$status = $res->status;
$needs_update = (bool) $res->needs_update;
$element_type_prefix = $res->element_type_prefix;
} else {
$job_id = - 1;
$status = 0;
$needs_update = false;
$element_type_prefix = $this->fallback_type_prefix( $trid );
}
$this->cache_job( $trid, $lang, $job_id, $status, $needs_update, $element_type_prefix );
return $res;
}
private function fallback_type_prefix( $trid ) {
global $wpdb;
if ( isset( $this->element_type_prefix_cache[ $trid ] ) && (bool) $this->element_type_prefix_cache[ $trid ] === true ) {
$prefix = $this->element_type_prefix_cache[ $trid ];
} elseif ( (bool) $this->tm_records->get_post_translations()->get_element_translations( null, $trid ) ) {
$prefix = 'post';
} else {
$prefix = $wpdb->get_var(
$wpdb->prepare(
"SELECT SUBSTRING_INDEX(element_type, '_', 1)
FROM {$wpdb->prefix}icl_translations
WHERE trid = %d
LIMIT 1",
$trid
)
);
}
return $prefix;
}
/**
* @param int $trid
* @param string $language_code
* @param int $job_id
* @param int $status
* @param bool $needs_update
* @param string $element_type_prefix
*/
private function cache_job( $trid, $language_code, $job_id, $status, $needs_update, $element_type_prefix ) {
if ( (bool) $job_id === true && (bool) $trid === true && (bool) $language_code === true ) {
$this->maybe_init_trid_cache( $trid );
$this->job_id_cache[ $trid ][ $language_code ] = $job_id;
$this->translation_status_cache[ $trid ][ $language_code ] = $status;
$this->update_status_cache[ $trid ][ $language_code ] = $needs_update;
$this->element_type_prefix_cache[ $trid ] = isset( $this->element_type_prefix_cache[ $trid ] )
&& (bool) $this->element_type_prefix_cache[ $trid ] === true
? $this->element_type_prefix_cache[ $trid ] : $element_type_prefix;
}
}
private function maybe_init_trid_cache( $trid ) {
foreach (
array(
&$this->job_id_cache,
&$this->trid_cache,
&$this->translation_status_cache,
&$this->update_status_cache,
) as $cache
) {
$cache[ $trid ] = isset( $cache[ $trid ] ) ? $cache[ $trid ] : array();
}
}
}