PluginProbe
Polylang / 2.9
Polylang v2.9
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.9, at admin/admin-filters.php

215 lines 7.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Polylang
4 */
5
6 /**
7 * Setup miscellaneous admin filters as well as filters common to admin and frontend
8 *
9 * @since 1.2
10 */
11 class PLL_Admin_Filters extends PLL_Filters {
12
13 /**
14 * Constructor: setups filters and actions
15 *
16 * @since 1.2
17 *
18 * @param object $polylang
19 */
20 public function __construct( &$polylang ) {
21 parent::__construct( $polylang );
22
23 // Widgets languages filter
24 add_action( 'in_widget_form', array( $this, 'in_widget_form' ), 10, 3 );
25 add_filter( 'widget_update_callback', array( $this, 'widget_update_callback' ), 10, 4 );
26
27 // Language management for users
28 add_action( 'personal_options_update', array( $this, 'personal_options_update' ) );
29 add_action( 'edit_user_profile_update', array( $this, 'personal_options_update' ) );
30 add_action( 'personal_options', array( $this, 'personal_options' ) );
31
32 // Upgrades languages files after a core upgrade ( timing is important )
33 // Backward compatibility WP < 4.0 *AND* Polylang < 1.6
34 add_action( '_core_updated_successfully', array( $this, 'upgrade_languages' ), 1 ); // since WP 3.3
35
36 // Upgrades plugins and themes translations files
37 add_filter( 'themes_update_check_locales', array( $this, 'update_check_locales' ) );
38 add_filter( 'plugins_update_check_locales', array( $this, 'update_check_locales' ) );
39
40 add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
41
42 // Add post state for translations of the privacy policy page
43 add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 );
44 }
45
46 /**
47 * Modifies the widgets forms to add our language dropdown list
48 *
49 * @since 0.3
50 *
51 * @param object $widget Widget instance
52 * @param null $return Not used
53 * @param array $instance Widget settings
54 */
55 public function in_widget_form( $widget, $return, $instance ) {
56 $screen = get_current_screen();
57
58 // Test the Widgets screen and the Customizer to avoid displaying the option in page builders
59 // Saving the widget reloads the form. And curiously the action is in $_REQUEST but neither in $_POST, nor in $_GET.
60 if ( ( isset( $screen ) && 'widgets' === $screen->base ) || ( isset( $_REQUEST['action'] ) && 'save-widget' === $_REQUEST['action'] ) || isset( $GLOBALS['wp_customize'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
61 $dropdown = new PLL_Walker_Dropdown();
62
63 $dropdown_html = $dropdown->walk(
64 array_merge(
65 array( (object) array( 'slug' => 0, 'name' => __( 'All languages', 'polylang' ) ) ),
66 $this->model->get_languages_list()
67 ),
68 -1,
69 array(
70 'name' => $widget->id . '_lang_choice',
71 'class' => 'tags-input pll-lang-choice',
72 'selected' => empty( $instance['pll_lang'] ) ? '' : $instance['pll_lang'],
73 )
74 );
75
76 printf(
77 '<p><label for="%1$s">%2$s %3$s</label></p>',
78 esc_attr( $widget->id . '_lang_choice' ),
79 esc_html__( 'The widget is displayed for:', 'polylang' ),
80 $dropdown_html // phpcs:ignore WordPress.Security.EscapeOutput
81 );
82 }
83 }
84
85 /**
86 * Called when widget options are saved
87 * saves the language associated to the widget
88 *
89 * @since 0.3
90 *
91 * @param array $instance Widget options
92 * @param array $new_instance Not used
93 * @param array $old_instance Not used
94 * @param object $widget WP_Widget object
95 * @return array Widget options
96 */
97 public function widget_update_callback( $instance, $new_instance, $old_instance, $widget ) {
98 $key = $widget->id . '_lang_choice';
99
100 if ( ! empty( $_POST[ $key ] ) && $lang = $this->model->get_language( sanitize_key( $_POST[ $key ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
101 $instance['pll_lang'] = $lang->slug;
102 } else {
103 unset( $instance['pll_lang'] );
104 }
105
106 return $instance;
107 }
108
109 /**
110 * Updates language user preference set in user profile
111 *
112 * @since 0.4
113 *
114 * @param int $user_id
115 */
116 public function personal_options_update( $user_id ) {
117 // Biography translations
118 foreach ( $this->model->get_languages_list() as $lang ) {
119 $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug;
120 $description = empty( $_POST[ 'description_' . $lang->slug ] ) ? '' : trim( $_POST[ 'description_' . $lang->slug ] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput
121
122 /** This filter is documented in wp-includes/user.php */
123 $description = apply_filters( 'pre_user_description', $description ); // Applies WP default filter wp_filter_kses
124 update_user_meta( $user_id, $meta, $description );
125 }
126 }
127
128 /**
129 * Outputs hidden information to modify the biography form with js
130 *
131 * @since 0.4
132 *
133 * @param object $profileuser
134 */
135 public function personal_options( $profileuser ) {
136 foreach ( $this->model->get_languages_list() as $lang ) {
137 $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug;
138
139 /** This filter is documented in wp-includes/user.php */
140 $description = apply_filters( 'user_description', get_user_meta( $profileuser->ID, $meta, true ) ); // Applies WP default filter wp_kses_data
141
142 printf(
143 '<input type="hidden" class="biography" name="%s___%s" value="%s" />',
144 esc_attr( $lang->slug ),
145 esc_attr( $lang->name ),
146 esc_attr( $description )
147 );
148 }
149 }
150
151 /**
152 * Upgrades languages files after a core upgrade
153 * only for backward compatibility WP < 4.0 *AND* Polylang < 1.6
154 *
155 * @since 0.6
156 *
157 * @param string $version new WP version
158 */
159 public function upgrade_languages( $version ) {
160 // $GLOBALS['wp_version'] is the old WP version
161 if ( version_compare( $version, '4.0', '>=' ) && version_compare( $GLOBALS['wp_version'], '4.0', '<' ) ) {
162
163 /** This filter is documented in wp-admin/includes/update-core.php */
164 apply_filters( 'update_feedback', __( 'Upgrading language files&#8230;', 'polylang' ) );
165 PLL_Upgrade::download_language_packs();
166 }
167 }
168
169 /**
170 * Allows to update translations files for plugins and themes.
171 *
172 * @since 1.6
173 *
174 * @param array $locales List of locales to update for plugins and themes.
175 * @return array
176 */
177 public function update_check_locales( $locales ) {
178 return array_merge( $locales, $this->model->get_languages_list( array( 'fields' => 'locale' ) ) );
179 }
180
181 /**
182 * Adds a text direction dependent class to the body
183 *
184 * @since 2.2
185 *
186 * @param string $classes Space-separated list of CSS classes.
187 * @return string
188 */
189 public function admin_body_class( $classes ) {
190 if ( ! empty( $this->curlang ) ) {
191 $classes .= ' pll-dir-' . ( $this->curlang->is_rtl ? 'rtl' : 'ltr' );
192 }
193 return $classes;
194 }
195
196 /**
197 * Add post state for translations of the privacy policy page
198 *
199 * @since 2.7
200 *
201 * @param array $post_states An array of post display states.
202 * @param object $post The current post object.
203 * @return array
204 */
205 public function display_post_states( $post_states, $post ) {
206 $page_for_privacy_policy = get_option( 'wp_page_for_privacy_policy' );
207
208 if ( $page_for_privacy_policy && in_array( $post->ID, $this->model->post->get_translations( $page_for_privacy_policy ) ) ) {
209 $post_states['page_for_privacy_policy'] = __( 'Privacy Policy Page', 'polylang' );
210 }
211
212 return $post_states;
213 }
214 }
215