class-wpml-pb-string-translation.php
3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
use WPML\LIB\WP\Cache;
class WPML_PB_String_Translation {
/** @var wpdb $wpdb */
protected $wpdb;
/** @const string CACHE_GROUP_KEY **/
const CACHE_GROUP_KEY = 'wpml-pb-package-strings';
public function __construct( wpdb $wpdb ) {
$this->wpdb = $wpdb;
wp_cache_add_non_persistent_groups( self::CACHE_GROUP_KEY );
}
/**
* @param array $package_data
* @param bool $reload_cache
*
* @return array
*/
public function get_package_strings( array $package_data, $reload_cache = false ) {
$strings = array();
$package_id = $this->get_package_id( $package_data );
if ( $package_id ) {
if ( $reload_cache ) {
Cache::flushGroup( self::CACHE_GROUP_KEY );
}
$getPackageStrings = Cache::memorize(
self::CACHE_GROUP_KEY,
HOUR_IN_SECONDS,
function( $packageId ) {
return $this->getPackageStringsFromDb( $packageId );
}
);
$strings = $getPackageStrings( $package_id );
}
return $strings;
}
/**
* @param int $packageId
*
* @return array
*/
private function getPackageStringsFromDb( $packageId ) {
$strings = [];
// phpcs:disable WordPress.WP.PreparedSQL.NotPrepared
$sql_to_get_strings_with_package_id = $this->wpdb->prepare( "SELECT *
FROM {$this->wpdb->prefix}icl_strings s
WHERE s.string_package_id=%d",
$packageId );
$packageStrings = $this->wpdb->get_results( $sql_to_get_strings_with_package_id );
// phpcs:enable
if ( ! empty( $packageStrings ) ) {
foreach ( $packageStrings as $string ) {
$strings[ $this->get_string_hash( $string->value ) ] = array(
'value' => $string->value,
'context' => $string->context,
'name' => $string->name,
'id' => $string->id,
'package_id' => $packageId,
'location' => $string->location,
);
}
}
return $strings;
}
public function remove_string( array $string_data ) {
icl_unregister_string( $string_data['context'], $string_data['name'] );
$field_type = 'package-string-' . $string_data['package_id'] . '-' . $string_data['id'];
$job_id = $this->get_job_id( $field_type );
if ( ! $job_id || ! $this->is_job_in_progress( $job_id ) ) {
$this->wpdb->delete( $this->wpdb->prefix . 'icl_translate', array( 'field_type' => $field_type ), array( '%s' ) );
}
}
/**
* @param string $field_type
*
* @return string|null
*/
private function get_job_id( $field_type ) {
return $this->wpdb->get_var( $this->wpdb->prepare( "SELECT MAX(job_id) FROM {$this->wpdb->prefix}icl_translate WHERE field_type = %s", $field_type ) );
}
/**
* @param int $job_id
*
* @return bool
*/
private function is_job_in_progress( $job_id ) {
return ! (bool) $this->wpdb->get_var( $this->wpdb->prepare( "SELECT translated FROM {$this->wpdb->prefix}icl_translate_job WHERE job_id = %d", $job_id ) );
}
/**
* @param array $package_data
*
* @return bool
*/
private function get_package_id( array $package_data ) {
$package_id = false;
$sql_to_get_package_id = $this->wpdb->prepare( "SELECT s.ID
FROM {$this->wpdb->prefix}icl_string_packages s
WHERE s.kind=%s AND s.name=%s AND s.title=%s AND s.post_id=%s",
$package_data['kind'], $package_data['name'], $package_data['title'], $package_data['post_id'] );
$result = $this->wpdb->get_row( $sql_to_get_package_id );
if ( isset( $result->ID ) ) {
$package_id = $result->ID;
}
return $package_id;
}
/**
* @param string $string_value
*
* @return string
*/
public function get_string_hash( $string_value ) {
return md5( $string_value );
}
}