PluginProbe
Polylang / 2.5
Polylang v2.5
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
← All changes | settings/table-string.php +34 -93 2.72.5 View file →
@@ -30,18 +30,10 @@
30 30
31 31 $this->languages = $languages;
32 32 $this->strings = PLL_Admin_Strings::get_strings();
33 33 $this->groups = array_unique( wp_list_pluck( $this->strings, 'context' ) );
34 + $this->selected_group = empty( $_GET['group'] ) || ! in_array( $_GET['group'], $this->groups ) ? -1 : $_GET['group'];
34 35
35 - $this->selected_group = -1;
36 -
37 - if ( ! empty( $_GET['group'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
38 - $group = sanitize_text_field( wp_unslash( $_GET['group'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
39 - if ( in_array( $group, $this->groups ) ) {
40 - $this->selected_group = $group;
41 - }
42 - }
43 -
44 36 add_action( 'mlang_action_string-translation', array( $this, 'save_translations' ) );
45 37 }
46 38
47 39 /**
@@ -69,9 +61,9 @@
69 61 return sprintf(
70 62 '<label class="screen-reader-text" for="cb-select-%1$s">%2$s</label><input id="cb-select-%1$s" type="checkbox" name="strings[]" value="%1$s" %3$s />',
71 63 esc_attr( $item['row'] ),
72 64 /* translators: accessibility text, %s is a string potentially in any language */
73 - sprintf( __( 'Select %s', 'polylang' ), format_to_edit( $item['string'] ) ),
65 + sprintf( __( 'Select %s' ), format_to_edit( $item['string'] ) ),
74 66 empty( $item['icl'] ) ? 'disabled' : '' // Only strings registered with WPML API can be removed
75 67 );
76 68 }
77 69
@@ -158,31 +150,8 @@
158 150 return 'string';
159 151 }
160 152
161 153 /**
162 - * Search for a string in translations. Case insensitive.
163 - *
164 - * @since 2.6
165 - *
166 - * @param array $mos An array of PLL_MO objects
167 - * @param string $s Searched string
168 - * @return array Found strings
169 - */
170 - protected function search_in_translations( $mos, $s ) {
171 - $founds = array();
172 -
173 - foreach ( $mos as $mo ) {
174 - foreach ( wp_list_pluck( $mo->entries, 'translations' ) as $string => $translation ) {
175 - if ( false !== stripos( $translation[0], $s ) ) {
176 - $founds[] = $string;
177 - }
178 - }
179 - }
180 -
181 - return array_unique( $founds );
182 - }
183 -
184 - /**
185 154 * Sort items
186 155 *
187 156 * @since 0.6
188 157 *
@@ -190,17 +159,10 @@
190 159 * @param object $b The second object to compare
191 160 * @return int -1 or 1 if $a is considered to be respectively less than or greater than $b.
192 161 */
193 162 protected function usort_reorder( $a, $b ) {
194 - if ( ! empty( $_GET['orderby'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
195 - $orderby = sanitize_key( $_GET['orderby'] ); // phpcs:ignore WordPress.Security.NonceVerification
196 - if ( isset( $a[ $orderby ], $b[ $orderby ] ) ) {
197 - $result = strcmp( $a[ $orderby ], $b[ $orderby ] ); // Determine sort order
198 - return ( empty( $_GET['order'] ) || 'asc' === $_GET['order'] ) ? $result : -$result; // phpcs:ignore WordPress.Security.NonceVerification
199 - }
200 - }
201 -
202 - return 0;
163 + $result = strcmp( $a[ $_GET['orderby'] ], $b[ $_GET['orderby'] ] ); // determine sort order
164 + return ( empty( $_GET['order'] ) || 'asc' === $_GET['order'] ) ? $result : -$result; // send final sort direction to usort
203 165 }
204 166
205 167 /**
206 168 * Prepares the list of items for displaying
@@ -207,52 +169,42 @@
207 169 *
208 170 * @since 0.6
209 171 */
210 172 public function prepare_items() {
211 - // Is admin language filter active?
212 - if ( $lg = get_user_meta( get_current_user_id(), 'pll_filter_content', true ) ) {
213 - $languages = wp_list_filter( $this->languages, array( 'slug' => $lg ) );
214 - } else {
215 - $languages = $this->languages;
216 - }
217 -
218 - // Load translations
219 - $mo = array();
220 - foreach ( $languages as $language ) {
221 - $mo[ $language->slug ] = new PLL_MO();
222 - $mo[ $language->slug ]->import_from_db( $language );
223 - }
224 -
225 173 $data = $this->strings;
226 174
227 - // Filter by selected group
228 - if ( -1 !== $this->selected_group ) {
229 - $data = wp_list_filter( $data, array( 'context' => $this->selected_group ) );
175 + // Filter for search string
176 + $s = empty( $_GET['s'] ) ? '' : wp_unslash( $_GET['s'] );
177 + foreach ( $data as $key => $row ) {
178 + if ( ( -1 !== $this->selected_group && $row['context'] !== $this->selected_group ) || ( ! empty( $s ) && stripos( $row['name'], $s ) === false && stripos( $row['string'], $s ) === false ) ) {
179 + unset( $data[ $key ] );
180 + }
230 181 }
231 182
232 - // Filter by searched string
233 - $s = empty( $_GET['s'] ) ? '' : wp_unslash( $_GET['s'] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput
183 + // Load translations
184 + foreach ( $this->languages as $language ) {
185 + // Filters by language if requested
186 + if ( ( $lg = get_user_meta( get_current_user_id(), 'pll_filter_content', true ) ) && $language->slug !== $lg ) {
187 + continue;
188 + }
234 189
235 - if ( ! empty( $s ) ) {
236 - // Search in translations
237 - $in_translations = $this->search_in_translations( $mo, $s );
238 -
190 + $mo = new PLL_MO();
191 + $mo->import_from_db( $language );
239 192 foreach ( $data as $key => $row ) {
240 - if ( stripos( $row['name'], $s ) === false && stripos( $row['string'], $s ) === false && ! in_array( $row['string'], $in_translations ) ) {
241 - unset( $data[ $key ] );
242 - }
193 + $data[ $key ]['translations'][ $language->slug ] = $mo->translate( $row['string'] );
194 + $data[ $key ]['row'] = $key; // Store the row number for convenience
243 195 }
244 196 }
245 197
246 - // Sorting
247 - uasort( $data, array( $this, 'usort_reorder' ) );
248 -
249 - // Paging
250 198 $per_page = $this->get_items_per_page( 'pll_strings_per_page' );
251 199 $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns() );
252 200
201 + if ( ! empty( $_GET['orderby'] ) ) { // No sort by default
202 + usort( $data, array( $this, 'usort_reorder' ) );
203 + }
204 +
253 205 $total_items = count( $data );
254 - $this->items = array_slice( $data, ( $this->get_pagenum() - 1 ) * $per_page, $per_page, true );
206 + $this->items = array_slice( $data, ( $this->get_pagenum() - 1 ) * $per_page, $per_page );
255 207
256 208 $this->set_pagination_args(
257 209 array(
258 210 'total_items' => $total_items,
@@ -259,17 +211,8 @@
259 211 'per_page' => $per_page,
260 212 'total_pages' => ceil( $total_items / $per_page ),
261 213 )
262 214 );
263 -
264 - // Translate strings
265 - // Kept for the end as it is a slow process
266 - foreach ( $languages as $language ) {
267 - foreach ( $this->items as $key => $row ) {
268 - $this->items[ $key ]['translations'][ $language->slug ] = $mo[ $language->slug ]->translate( $row['string'] );
269 - $this->items[ $key ]['row'] = $key; // Store the row number for convenience
270 - }
271 - }
272 215 }
273 216
274 217 /**
275 218 * Get the list of possible bulk actions
@@ -290,9 +233,9 @@
290 233 *
291 234 * @return string|false The action name or False if no action was selected
292 235 */
293 236 public function current_action() {
294 - return empty( $_POST['submit'] ) ? parent::current_action() : false; // phpcs:ignore WordPress.Security.NonceVerification
237 + return empty( $_POST['submit'] ) ? parent::current_action() : false;
295 238 }
296 239
297 240 /**
298 241 * Displays the dropdown list to filter strings per group
@@ -314,9 +257,9 @@
314 257 );
315 258 echo '<select id="select-group" name="group">' . "\n";
316 259 printf(
317 260 '<option value="-1"%s>%s</option>' . "\n",
318 - selected( $this->group_selected, -1, false ),
261 + -1 === $this->group_selected ? ' selected="selected"' : '',
319 262 esc_html__( 'View all groups', 'polylang' )
320 263 );
321 264
322 265 foreach ( $this->groups as $group ) {
@@ -322,15 +265,15 @@
322 265 foreach ( $this->groups as $group ) {
323 266 printf(
324 267 '<option value="%s"%s>%s</option>' . "\n",
325 268 esc_attr( urlencode( $group ) ),
326 - selected( $this->selected_group, $group, false ),
269 + $this->selected_group === $group ? ' selected="selected"' : '',
327 270 esc_html( $group )
328 271 );
329 272 }
330 273 echo '</select>' . "\n";
331 274
332 - submit_button( __( 'Filter', 'polylang' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
275 + submit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
333 276 echo '</div>';
334 277 }
335 278
336 279 /**
@@ -350,20 +293,18 @@
350 293
351 294 $mo = new PLL_MO();
352 295 $mo->import_from_db( $language );
353 296
354 - $translations = array_map( 'trim', wp_unslash( $_POST['translation'][ $language->slug ] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
355 - foreach ( $translations as $key => $translation ) {
297 + foreach ( $_POST['translation'][ $language->slug ] as $key => $translation ) {
356 298 /**
357 299 * Filter the string translation before it is saved in DB
358 300 * Allows to sanitize strings registered with pll_register_string
359 301 *
360 302 * @since 1.6
361 - * @since 2.7 The translation passed to the filter is unslashed.
362 303 *
363 - * @param string $translation The string translation.
364 - * @param string $name The name as defined in pll_register_string.
365 - * @param string $context The context as defined in pll_register_string.
304 + * @param string $translation the string translation
305 + * @param string $name the name as defined in pll_register_string
306 + * @param string $context the context as defined in pll_register_string
366 307 */
367 308 $translation = apply_filters( 'pll_sanitize_string_translation', $translation, $this->strings[ $key ]['name'], $this->strings[ $key ]['context'] );
368 309 $mo->add_entry( $mo->make_entry( $this->strings[ $key ]['string'], $translation ) );
369 310 }
@@ -391,9 +332,9 @@
391 332 }
392 333
393 334 // Unregisters strings registered through WPML API
394 335 if ( $this->current_action() === 'delete' && ! empty( $_POST['strings'] ) && function_exists( 'icl_unregister_string' ) ) {
395 - foreach ( array_map( 'sanitize_key', $_POST['strings'] ) as $key ) {
336 + foreach ( $_POST['strings'] as $key ) {
396 337 icl_unregister_string( $this->strings[ $key ]['context'], $this->strings[ $key ]['name'] );
397 338 }
398 339 }
399 340