PluginProbe
Polylang / 1.8
Polylang v1.8
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-base.php

admin-base.php in Polylang 1.8, at admin/admin-base.php

272 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * base class for both admin
5 *
6 * @since 1.8
7 */
8 class PLL_Admin_Base extends PLL_Base {
9 public $curlang, $pref_lang;
10
11 /*
12 * loads the polylang text domain
13 * setups actions needed on all admin pages
14 *
15 * @since 1.8
16 *
17 * @param object $links_model
18 */
19 public function __construct( &$links_model ) {
20 parent::__construct( $links_model );
21
22 // plugin i18n, only needed for backend
23 load_plugin_textdomain( 'polylang', false, basename( POLYLANG_DIR ).'/languages' );
24
25 // adds the link to the languages panel in the WordPress admin menu
26 add_action( 'admin_menu', array( &$this, 'add_menus' ) );
27
28 // setup js scripts and css styles
29 add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) );
30 add_action( 'admin_print_footer_scripts', array( &$this, 'admin_print_footer_scripts' ) );
31
32 // Lingotek
33 if ( ! defined( 'PLL_LINGOTEK_AD' ) || PLL_LINGOTEK_AD ) {
34 require_once( POLYLANG_DIR . '/lingotek/lingotek.php' );
35 }
36 }
37
38 /*
39 * setups filters and action needed on all admin pages and on plugins page
40 * loads the settings pages or the filters base on the request
41 *
42 * @since 1.2
43 *
44 * @param object $links_model
45 */
46 public function init() {
47 if ( ! $this->model->get_languages_list() ) {
48 return;
49 }
50
51 $this->links = new PLL_Admin_Links( $this ); // FIXME needed here ?
52 $this->static_pages = new PLL_Admin_Static_Pages( $this ); // FIXME needed here ?
53 $this->filters_links = new PLL_Filters_Links( $this ); // FIXME needed here ?
54
55 // filter admin language for users
56 // we must not call user info before WordPress defines user roles in wp-settings.php
57 add_filter( 'setup_theme', array( &$this, 'init_user' ) );
58 add_filter( 'request', array( &$this, 'request' ) );
59
60 // adds the languages in admin bar
61 add_action( 'admin_bar_menu', array( &$this, 'admin_bar_menu' ), 100 ); // 100 determines the position
62 }
63
64 /*
65 * adds the link to the languages panel in the WordPress admin menu
66 *
67 * @since 0.1
68 */
69 public function add_menus() {
70 add_submenu_page( 'options-general.php', $title = __( 'Languages', 'polylang' ), $title, 'manage_options', 'mlang', '__return_null' );
71 }
72
73 /*
74 * setup js scripts & css styles ( only on the relevant pages )
75 *
76 * @since 0.6
77 */
78 public function admin_enqueue_scripts() {
79 $screen = get_current_screen();
80 if ( empty( $screen ) ) {
81 return;
82 }
83
84 $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
85
86 // for each script:
87 // 0 => the pages on which to load the script
88 // 1 => the scripts it needs to work
89 // 2 => 1 if loaded even if languages have not been defined yet, 0 otherwise
90 // 3 => 1 if loaded in footer
91 // FIXME: check if I can load more scripts in footer
92 $scripts = array(
93 'post' => array( array( 'post', 'media', 'async-upload', 'edit' ), array( 'jquery', 'wp-ajax-response', 'post', 'jquery-ui-autocomplete' ), 0 , 1 ),
94 'media' => array( array( 'upload' ), array( 'jquery' ), 0 , 1 ),
95 'term' => array( array( 'edit-tags' ), array( 'jquery', 'wp-ajax-response', 'jquery-ui-autocomplete' ), 0, 1 ),
96 'user' => array( array( 'profile', 'user-edit' ), array( 'jquery' ), 0 , 0 ),
97 );
98
99 foreach ( $scripts as $script => $v ) {
100 if ( in_array( $screen->base, $v[0] ) && ( $v[2] || $this->model->get_languages_list() ) ) {
101 wp_enqueue_script( 'pll_'.$script, POLYLANG_URL .'/js/'.$script.$suffix.'.js', $v[1], POLYLANG_VERSION, $v[3] );
102 }
103 }
104
105 wp_enqueue_style( 'polylang_admin', POLYLANG_URL .'/css/admin'.$suffix.'.css', array(), POLYLANG_VERSION );
106 }
107
108 /*
109 * sets pll_ajax_backend on all backend ajax request
110 * the final goal is to detect if an ajax request is made on admin or frontend
111 *
112 * takes care to various situations:
113 * when the ajax request has no options.data thanks to ScreenfeedFr
114 * see: https://wordpress.org/support/topic/ajaxprefilter-may-not-work-as-expected
115 * when options.data is a json string
116 * see: https://wordpress.org/support/topic/polylang-breaking-third-party-ajax-requests-on-admin-panels
117 * when options.data is an empty string (GET request with the method 'load')
118 * see: https://wordpress.org/support/topic/invalid-url-during-wordpress-new-dashboard-widget-operation
119 *
120 * @since 1.4
121 */
122 public function admin_print_footer_scripts() {
123 global $post_ID;
124
125 $params = array( 'pll_ajax_backend' => 1 );
126 if ( ! empty( $post_ID ) ) {
127 $params = array_merge( $params, array( 'pll_post_id' => (int) $post_ID ) );
128 }
129
130 $str = $arr = '';
131 foreach ( $params as $k => $v ) {
132 $str .= ( empty( $str ) ? '' : '&' ) . $k . '=' . $v;
133 $arr .= ( empty( $arr ) ? '' : ', ') . $k . ': ' . $v;
134 }
135 ?>
136 <script type="text/javascript">
137 if (typeof jQuery != 'undefined') {
138 (function($){
139 $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
140 if (options.url.indexOf(ajaxurl) != -1) {
141 if ( typeof options.data === 'undefined' ) {
142 options.data = options.type.toLowerCase() === "get" ? '<?php echo $str;?>' : {<?php echo $arr;?>};
143 }
144 else {
145 if (typeof options.data === "string") {
146 if ( '' === options.data && "get" === options.type.toLowerCase() ) {
147 options.url = options.url+'<?php echo '&' . $str;?>';
148 }
149 else {
150 try {
151 o = $.parseJSON(options.data);
152 o = $.extend(o, {<?php echo $arr;?>});
153 options.data = JSON.stringify(o);
154 }
155 catch(e) {
156 options.data = '<?php echo $str . '&';?>'+options.data;
157 }
158 }
159 }
160 else {
161 options.data = $.extend(options.data, {<?php echo $arr;?>});
162 }
163 }
164 }
165 });
166 })(jQuery)
167 }
168 </script><?php
169
170 }
171
172 /*
173 * defines the backend language and the admin language filter based on user preferences
174 *
175 * @since 1.2.3
176 */
177 public function init_user() {
178 // backend locale
179 add_filter( 'locale', array( &$this, 'get_locale' ) );
180
181 // language for admin language filter: may be empty
182 // $_GET['lang'] is numeric when editing a language, not when selecting a new language in the filter
183 if ( ! defined( 'DOING_AJAX' ) && ! empty( $_GET['lang'] ) && ! is_numeric( $_GET['lang'] ) && current_user_can( 'edit_user', $user_id = get_current_user_id() ) ) {
184 update_user_meta( $user_id, 'pll_filter_content', ( $lang = $this->model->get_language( $_GET['lang'] ) ) ? $lang->slug : '' );
185 }
186
187 $this->curlang = $this->model->get_language( get_user_meta( get_current_user_id(), 'pll_filter_content', true ) );
188
189 // set preferred language for use when saving posts and terms: must not be empty
190 $this->pref_lang = empty( $this->curlang ) ? $this->model->get_language( $this->options['default_lang'] ) : $this->curlang;
191 $this->pref_lang = apply_filters( 'pll_admin_preferred_language', $this->pref_lang );
192
193 // inform that the admin language has been set
194 // only if the admin language is one of the Polylang defined language
195 if ( $curlang = $this->model->get_language( get_locale() ) ) {
196 $GLOBALS['text_direction'] = $curlang->is_rtl ? 'rtl' : 'ltr'; // force text direction according to language setting
197 do_action( 'pll_language_defined', $curlang->slug, $curlang );
198 }
199 else {
200 do_action( 'pll_no_language_defined' ); // to load overriden textdomains
201 }
202 }
203
204 /*
205 * avoids parsing a tax query when all languages are requested
206 * fixes https://wordpress.org/support/topic/notice-undefined-offset-0-in-wp-includesqueryphp-on-line-3877 introduced in WP 4.1
207 * @see the suggestion of @boonebgorges, https://core.trac.wordpress.org/ticket/31246
208 *
209 * @since 1.6.5
210 *
211 * @param array $qvars
212 * @return array
213 */
214 public function request( $qvars ) {
215 if ( isset( $qvars['lang'] ) && 'all' === $qvars['lang'] ) {
216 unset( $qvars['lang'] );
217 }
218
219 return $qvars;
220 }
221
222 /*
223 * get the locale based on user preference
224 *
225 * @since 0.4
226 *
227 * @param string $locale
228 * @return string modified locale
229 */
230 public function get_locale( $locale ) {
231 return ( $loc = get_user_meta( get_current_user_id(), 'user_lang', 'true' ) ) ? $loc : $locale;
232 }
233
234 /*
235 * adds the languages list in admin bar for the admin languages filter
236 *
237 * @since 0.9
238 *
239 * @param object $wp_admin_bar
240 */
241 public function admin_bar_menu( $wp_admin_bar ) {
242 $url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
243
244 $all_item = (object) array(
245 'slug' => 'all',
246 'name' => __( 'Show all languages', 'polylang' ),
247 'flag' => '<span class="ab-icon"></span>',
248 );
249
250 $selected = empty( $this->curlang ) ? $all_item : $this->curlang;
251
252 $wp_admin_bar->add_menu( array(
253 'id' => 'languages',
254 'title' => $selected->flag . '<span class="ab-label">'. esc_html( $selected->name ) . '</span>',
255 'meta' => array( 'title' => __( 'Filters content by language', 'polylang' ) ),
256 ) );
257
258 foreach ( array_merge( array( $all_item ), $this->model->get_languages_list() ) as $lang ) {
259 if ( $selected->slug == $lang->slug ) {
260 continue;
261 }
262
263 $wp_admin_bar->add_menu( array(
264 'parent' => 'languages',
265 'id' => $lang->slug,
266 'title' => $lang->flag . esc_html( $lang->name ),
267 'href' => esc_url( add_query_arg( 'lang', $lang->slug, remove_query_arg( 'paged', $url ) ) ),
268 ) );
269 }
270 }
271 }
272