wpml-media-string-batch-media-url-translation.php
3.8 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
136
137
138
139
140
<?php
/**
* Class WPML_Media_String_Batch_Url_Translation
*/
class WPML_Media_String_Batch_Url_Translation extends WPML_Media_Batch_Url_Translation implements IWPML_Action {
const BATCH_SIZE = 500;
const AJAX_ACTION = 'wpml_media_translate_media_url_in_strings';
/**
* @var WPML_ST_String_Factory
*/
private $string_factory;
/**
* WPML_Media_String_Batch_Url_Translation constructor.
*
* @param wpdb $wpdb
* @param WPML_ST_String_Factory $string_factory
*/
public function __construct(
wpdb $wpdb,
WPML_ST_String_Factory $string_factory
) {
parent::__construct( $wpdb );
$this->string_factory = $string_factory;
}
/**
* @param int $batch_size_factor
*
* @return int
*/
protected function get_batch_size( $batch_size_factor = self::BATCH_SIZE_FACTOR_ALL_MEDIA ) {
return $batch_size_factor * self::BATCH_SIZE;
}
/**
* @return string
*/
protected function get_ajax_action() {
return self::AJAX_ACTION;
}
public static function is_ajax_request() {
return isset( $_POST['action'] ) && self::AJAX_ACTION === $_POST['action'];
}
/**
* @param int $number_of_strings_left
*
* @return string
*/
protected function get_response_message( $number_of_strings_left ) {
return sprintf(
__( 'Translating media urls in string translations: %s', 'wpml-media' ),
$number_of_strings_left > 0 ?
sprintf( __( '%d left', 'wpml-media' ), $number_of_strings_left ) :
__( 'done!', 'wpml-media' )
);
}
protected function get_ajax_error_message() {
return array(
'key' => 'wpml_media_batch_urls_update_error_strings',
'value' => esc_js( __( 'Translating media urls in string translations failed: Please try again (%s)', 'wpml-media' ) ),
);
}
/**
* @param int $offset
*
* @return int
*/
protected function process_batch( $offset ) {
$original_strings = $this->wpdb->get_col(
"
SELECT SQL_CALC_FOUND_ROWS id, language
FROM {$this->wpdb->prefix}icl_strings
ORDER BY id ASC
LIMIT {$offset}, " . self::BATCH_SIZE
);
$number_of_all_strings = (int) $this->wpdb->get_var( 'SELECT FOUND_ROWS()' );
foreach ( $original_strings as $string_id ) {
$string = $this->string_factory->find_by_id( $string_id );
$string_translations = $string->get_translations();
foreach ( $string_translations as $string_translation ) {
if ( $string_translation->value ) {
$string->set_translation( $string_translation->language, $string_translation->value );
}
}
}
return $number_of_all_strings - $offset - self::BATCH_SIZE;
}
protected function process_batch_for_selected_media( $offset, $attachment_id ) {
$media_url = wpml_like_escape( wp_get_attachment_url( $attachment_id ) );
if ( ! $media_url ) {
return 0;
}
preg_match( '/(.+)\.([a-z]+)$/', $media_url, $match );
$media_url_no_extension = wpml_like_escape( $match[1] );
$extension = wpml_like_escape( $match[2] );
$batch_size = $this->get_batch_size( parent::BATCH_SIZE_FACTOR_SPECIFIC_MEDIA );
$original_strings = $this->wpdb->get_col(
"
SELECT SQL_CALC_FOUND_ROWS id, language
FROM {$this->wpdb->prefix}icl_strings
WHERE (
value LIKE '%{$media_url}%' OR
value LIKE '%{$media_url_no_extension}-%x%.{$extension}%'
)
ORDER BY id ASC
LIMIT {$offset}, " . $batch_size
);
$number_of_all_strings = (int) $this->wpdb->get_var( 'SELECT FOUND_ROWS()' );
foreach ( $original_strings as $string_id ) {
$string = $this->string_factory->find_by_id( $string_id );
$string_translations = $string->get_translations();
foreach ( $string_translations as $string_translation ) {
if ( $string_translation->value ) {
$string->set_translation( $string_translation->language, $string_translation->value );
}
}
}
return $number_of_all_strings - $offset - $batch_size;
}
}