PluginProbe
Polylang / 2.1.6
Polylang v2.1.6
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
polylang / admin / admin-filters.php

admin-filters.php in Polylang 2.1.6, at admin/admin-filters.php

257 lines 8.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Setup miscellaneous admin filters as well as filters common to admin and frontend
5 *
6 * @since 1.2
7 */
8 class PLL_Admin_Filters extends PLL_Filters {
9
10 /**
11 * Constructor: setups filters and actions
12 *
13 * @since 1.2
14 *
15 * @param object $polylang
16 */
17 public function __construct( &$polylang ) {
18 parent::__construct( $polylang );
19
20 // Widgets languages filter
21 add_action( 'in_widget_form', array( $this, 'in_widget_form' ), 10, 3 );
22 add_filter( 'widget_update_callback', array( $this, 'widget_update_callback' ), 10, 4 );
23
24 // Language management for users
25 add_action( 'personal_options_update', array( $this, 'personal_options_update' ) );
26 add_action( 'edit_user_profile_update', array( $this, 'personal_options_update' ) );
27 add_action( 'personal_options', array( $this, 'personal_options' ) );
28
29 // Ugrades languages files after a core upgrade ( timing is important )
30 // Backward compatibility WP < 4.0 *AND* Polylang < 1.6
31 add_action( '_core_updated_successfully', array( $this, 'upgrade_languages' ), 1 ); // since WP 3.3
32
33 // Upgrades plugins and themes translations files
34 add_filter( 'themes_update_check_locales', array( $this, 'update_check_locales' ) );
35 add_filter( 'plugins_update_check_locales', array( $this, 'update_check_locales' ) );
36
37 // We need specific filters for German and Danish
38 $specific_locales = array( 'da_DK', 'de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'ca', 'sr_RS', 'bs_BA' );
39 if ( array_intersect( $this->model->get_languages_list( array( 'fields' => 'locale' ) ), $specific_locales ) ) {
40 add_filter( 'sanitize_title', array( $this, 'sanitize_title' ), 10, 3 );
41 add_filter( 'sanitize_user', array( $this, 'sanitize_user' ), 10, 3 );
42 }
43 }
44
45 /**
46 * Modifies the widgets forms to add our language dropdwown list
47 *
48 * @since 0.3
49 *
50 * @param object $widget
51 */
52 public function in_widget_form( $widget, $return, $instance ) {
53 $dropdown = new PLL_Walker_Dropdown();
54 printf( '<p><label for="%1$s">%2$s %3$s</label></p>',
55 esc_attr( $widget->id.'_lang_choice' ),
56 esc_html__( 'The widget is displayed for:', 'polylang' ),
57 $dropdown->walk(
58 array_merge(
59 array( (object) array( 'slug' => 0, 'name' => __( 'All languages', 'polylang' ) ) ),
60 $this->model->get_languages_list()
61 ),
62 array(
63 'name' => $widget->id.'_lang_choice',
64 'class' => 'tags-input',
65 'selected' => empty( $instance['pll_lang'] ) ? '' : $instance['pll_lang'],
66 )
67 )
68 );
69 }
70
71 /**
72 * Called when widget options are saved
73 * saves the language associated to the widget
74 *
75 * @since 0.3
76 *
77 * @param array $instance Widget options
78 * @param array $new_instance Not used
79 * @param array $old_instance Not used
80 * @param object $widget WP_Widget object
81 * @return array Widget options
82 */
83 public function widget_update_callback( $instance, $new_instance, $old_instance, $widget ) {
84 if ( ! empty( $_POST[ $key = $widget->id.'_lang_choice' ] ) && in_array( $_POST[ $key ], $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) ) {
85 $instance['pll_lang'] = $_POST[ $key ];
86 } else {
87 unset( $instance['pll_lang'] );
88 }
89
90 return $instance;
91 }
92
93 /**
94 * Updates language user preference set in user profile
95 *
96 * @since 0.4
97 *
98 * @param int $user_id
99 */
100 public function personal_options_update( $user_id ) {
101 // Admin language
102 // FIXME Backward compatibility with WP < 4.7
103 if ( version_compare( $GLOBALS['wp_version'], '4.7alpha', '<' ) ) {
104 $user_lang = in_array( $_POST['user_lang'], $this->model->get_languages_list( array( 'fields' => 'locale' ) ) ) ? $_POST['user_lang'] : 0;
105 update_user_meta( $user_id, 'locale', $user_lang );
106 }
107
108 // Biography translations
109 foreach ( $this->model->get_languages_list() as $lang ) {
110 $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug;
111 $description = empty( $_POST[ 'description_' . $lang->slug ] ) ? '' : trim( $_POST[ 'description_' . $lang->slug ] );
112
113 /** This filter is documented in wp-includes/user.php */
114 $description = apply_filters( 'pre_user_description', $description ); // Applies WP default filter wp_filter_kses
115 update_user_meta( $user_id, $meta, $description );
116 }
117 }
118
119 /**
120 * Form for language user preference in user profile
121 *
122 * @since 0.4
123 *
124 * @param object $profileuser
125 */
126 public function personal_options( $profileuser ) {
127 // FIXME: Backward compatibility with WP < 4.7
128 if ( version_compare( $GLOBALS['wp_version'], '4.7alpha', '<' ) ) {
129 $dropdown = new PLL_Walker_Dropdown();
130 printf( '
131 <tr>
132 <th><label for="user_lang">%s</label></th>
133 <td>%s</td>
134 </tr>',
135 esc_html__( 'Admin language', 'polylang' ),
136 $dropdown->walk(
137 array_merge(
138 array( (object) array( 'locale' => 0, 'name' => __( 'WordPress default', 'polylang' ) ) ),
139 $this->model->get_languages_list()
140 ),
141 array(
142 'name' => 'user_lang',
143 'value' => 'locale',
144 'selected' => get_user_meta( $profileuser->ID, 'locale', true ),
145 )
146 )
147 );
148 }
149
150 // Hidden informations to modify the biography form with js
151 foreach ( $this->model->get_languages_list() as $lang ) {
152 $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug;
153
154 /** This filter is documented in wp-includes/user.php */
155 $description = apply_filters( 'user_description', get_user_meta( $profileuser->ID, $meta, true ) ); // Applies WP default filter wp_kses_data
156
157 printf( '<input type="hidden" class="biography" name="%s___%s" value="%s" />',
158 esc_attr( $lang->slug ),
159 esc_attr( $lang->name ),
160 esc_attr( $description )
161 );
162 }
163 }
164
165 /**
166 * Ugprades languages files after a core upgrade
167 * only for backward compatibility WP < 4.0 *AND* Polylang < 1.6
168 *
169 * @since 0.6
170 *
171 * @param string $version new WP version
172 */
173 public function upgrade_languages( $version ) {
174 // $GLOBALS['wp_version'] is the old WP version
175 if ( version_compare( $version, '4.0', '>=' ) && version_compare( $GLOBALS['wp_version'], '4.0', '<' ) ) {
176
177 /** This filter is documented in wp-admin/includes/update-core.php */
178 apply_filters( 'update_feedback', __( 'Upgrading language files&#8230;', 'polylang' ) );
179 PLL_Upgrade::download_language_packs();
180 }
181 }
182
183 /**
184 * Allows to update translations files for plugins and themes
185 *
186 * @since 1.6
187 *
188 * @param array $locale not used
189 * @return array list of locales to update
190 */
191 function update_check_locales( $locales ) {
192 return $this->model->get_languages_list( array( 'fields' => 'locale' ) );
193 }
194
195 /**
196 * Filters the locale according to the current language instead of the language
197 * of the admin interface
198 *
199 * @since 2.0
200 *
201 * @param string $locale
202 * @return string
203 */
204 public function get_locale( $locale ) {
205 return $this->curlang->locale;
206 }
207
208 /**
209 * Maybe fix the result of sanitize_title() in case the languages include German or Danish
210 * Without this filter, if language of the title being sanitized is different from the language
211 * used for the admin interface and if one this language is German or Danish, some specific
212 * characters such as ä, ö, ü, ß are incorrectly sanitized.
213 *
214 * @since 2.0
215 *
216 * @param string $title Sanitized title.
217 * @param string $raw_title The title prior to sanitization.
218 * @param string $context The context for which the title is being sanitized.
219 * @return string
220 */
221 public function sanitize_title( $title, $raw_title, $context ) {
222 static $once = false;
223
224 if ( ! $once && 'save' == $context && ! empty( $this->curlang ) && ! empty( $title ) ) {
225 $once = true;
226 add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface
227 $title = sanitize_title( $raw_title, '', $context );
228 remove_filter( 'locale', array( $this, 'get_locale' ), 20 );
229 $once = false;
230 }
231 return $title;
232 }
233
234 /**
235 * Maybe fix the result of sanitize_user() in case the languages include German or Danish
236 *
237 * @since 2.0
238 *
239 * @param string $username Sanitized username.
240 * @param string $raw_username The username prior to sanitization.
241 * @param bool $strict Whether to limit the sanitization to specific characters. Default false.
242 * @return string
243 */
244 public function sanitize_user( $username, $raw_username, $strict ) {
245 static $once = false;
246
247 if ( ! $once && ! empty( $this->curlang ) ) {
248 $once = true;
249 add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface
250 $username = sanitize_user( $raw_username, '', $strict );
251 remove_filter( 'locale', array( $this, 'get_locale' ), 20 );
252 $once = false;
253 }
254 return $username;
255 }
256 }
257