| @@ -2,8 +2,10 @@ | ||
| 2 | 2 | /** |
| 3 | 3 | * @package Polylang |
| 4 | 4 | */ |
| 5 | 5 | |
| 6 | +defined( 'ABSPATH' ) || exit; | |
| 7 | + | |
| 6 | 8 | /** |
| 7 | 9 | * Manages filters and actions related to the classic editor |
| 8 | 10 | * |
| 9 | 11 | * @since 2.4 |
| @@ -21,9 +23,9 @@ | ||
| 21 | 23 | |
| 22 | 24 | /** |
| 23 | 25 | * Current language (used to filter the content). |
| 24 | 26 | * |
| 25 | - * @var PLL_Language | |
| 27 | + * @var PLL_Language|null | |
| 26 | 28 | */ |
| 27 | 29 | public $curlang; |
| 28 | 30 | |
| 29 | 31 | /** |
| @@ -28,18 +30,18 @@ | ||
| 28 | 30 | |
| 29 | 31 | /** |
| 30 | 32 | * Preferred language to assign to new contents. |
| 31 | 33 | * |
| 32 | - * @var PLL_Language | |
| 34 | + * @var PLL_Language|null | |
| 33 | 35 | */ |
| 34 | 36 | public $pref_lang; |
| 35 | 37 | |
| 36 | 38 | /** |
| 37 | - * Constructor: setups filters and actions | |
| 39 | + * Constructor: setups filters and actions. | |
| 38 | 40 | * |
| 39 | 41 | * @since 2.4 |
| 40 | 42 | * |
| 41 | - * @param object $polylang | |
| 43 | + * @param object $polylang The Polylang object. | |
| 42 | 44 | */ |
| 43 | 45 | public function __construct( &$polylang ) { |
| 44 | 46 | $this->model = &$polylang->model; |
| 45 | 47 | $this->links = &$polylang->links; |
| @@ -158,37 +160,33 @@ | ||
| 158 | 160 | public function post_lang_choice() { |
| 159 | 161 | check_ajax_referer( 'pll_language', '_pll_nonce' ); |
| 160 | 162 | |
| 161 | 163 | if ( ! isset( $_POST['post_id'], $_POST['lang'], $_POST['post_type'] ) ) { |
| 162 | - wp_die( 0 ); | |
| 164 | + wp_die( 'The request is missing the parameter "post_type", "lang" and/or "post_id".' ); | |
| 163 | 165 | } |
| 164 | 166 | |
| 165 | 167 | global $post_ID; // Obliged to use the global variable for wp_popular_terms_checklist |
| 166 | 168 | $post_ID = (int) $_POST['post_id']; |
| 167 | - $lang = $this->model->get_language( sanitize_key( $_POST['lang'] ) ); | |
| 169 | + $lang_slug = sanitize_key( $_POST['lang'] ); | |
| 170 | + $lang = $this->model->get_language( $lang_slug ); | |
| 168 | 171 | $post_type = sanitize_key( $_POST['post_type'] ); |
| 169 | 172 | |
| 170 | - if ( empty( $lang ) || ! post_type_exists( $post_type ) ) { | |
| 171 | - wp_die( 0 ); | |
| 173 | + if ( empty( $lang ) ) { | |
| 174 | + wp_die( esc_html( "{$lang_slug} is not a valid language code." ) ); | |
| 172 | 175 | } |
| 173 | 176 | |
| 174 | 177 | $post_type_object = get_post_type_object( $post_type ); |
| 175 | 178 | |
| 176 | 179 | if ( empty( $post_type_object ) ) { |
| 177 | - wp_die( 0 ); | |
| 180 | + wp_die( esc_html( "{$post_type} is not a valid post type." ) ); | |
| 178 | 181 | } |
| 179 | 182 | |
| 180 | 183 | if ( ! current_user_can( $post_type_object->cap->edit_post, $post_ID ) ) { |
| 181 | - wp_die( -1 ); | |
| 184 | + wp_die( 'You are not allowed to edit this post.' ); | |
| 182 | 185 | } |
| 183 | 186 | |
| 184 | - $this->model->post->set_language( $post_ID, $lang ); // Save language, useful to set the language when uploading media from post | |
| 187 | + $this->model->post->set_language( $post_ID, $lang ); | |
| 185 | 188 | |
| 186 | - // We also need to save the translations to match the language change | |
| 187 | - $translations = $this->model->post->get_translations( $post_ID ); | |
| 188 | - $translations = array_diff( $translations, array( $post_ID ) ); | |
| 189 | - $this->model->post->save_translations( $post_ID, $translations ); | |
| 190 | - | |
| 191 | 189 | ob_start(); |
| 192 | 190 | if ( 'attachment' === $post_type ) { |
| 193 | 191 | include __DIR__ . '/view-translations-media.php'; |
| 194 | 192 | } else { |
| @@ -249,11 +247,15 @@ | ||
| 249 | 247 | 'echo' => 0, |
| 250 | 248 | ); |
| 251 | 249 | |
| 252 | 250 | /** This filter is documented in wp-admin/includes/meta-boxes.php */ |
| 253 | - $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); // Since WP 3.3 | |
| 251 | + $dropdown_args = (array) apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); // Since WP 3.3. | |
| 252 | + $dropdown_args['echo'] = 0; // Make sure to not print it. | |
| 254 | 253 | |
| 255 | - $x->Add( array( 'what' => 'pages', 'data' => wp_dropdown_pages( $dropdown_args ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput | |
| 254 | + /** @var string $data */ | |
| 255 | + $data = wp_dropdown_pages( $dropdown_args ); // phpcs:ignore WordPress.Security.EscapeOutput | |
| 256 | + | |
| 257 | + $x->Add( array( 'what' => 'pages', 'data' => $data ) ); | |
| 256 | 258 | } |
| 257 | 259 | } |
| 258 | 260 | |
| 259 | 261 | // Flag |
| @@ -331,11 +333,16 @@ | ||
| 331 | 333 | * @param WP_Post $post The page being edited. |
| 332 | 334 | * @return array Modified arguments. |
| 333 | 335 | */ |
| 334 | 336 | public function page_attributes_dropdown_pages_args( $dropdown_args, $post ) { |
| 335 | - $dropdown_args['lang'] = isset( $_POST['lang'] ) ? $this->model->get_language( sanitize_key( $_POST['lang'] ) ) : $this->model->post->get_language( $post->ID ); // phpcs:ignore WordPress.Security.NonceVerification | |
| 336 | - if ( ! $dropdown_args['lang'] ) { | |
| 337 | - $dropdown_args['lang'] = $this->pref_lang; | |
| 337 | + $language = isset( $_POST['lang'] ) ? $this->model->get_language( sanitize_key( $_POST['lang'] ) ) : $this->model->post->get_language( $post->ID ); // phpcs:ignore WordPress.Security.NonceVerification | |
| 338 | + | |
| 339 | + if ( empty( $language ) ) { | |
| 340 | + $language = $this->pref_lang; | |
| 341 | + } | |
| 342 | + | |
| 343 | + if ( ! empty( $language ) ) { | |
| 344 | + $dropdown_args['lang'] = $language->slug; | |
| 338 | 345 | } |
| 339 | 346 | |
| 340 | 347 | return $dropdown_args; |
| 341 | 348 | } |