PluginProbe
Polylang / 2.9.1
Polylang v2.9.1
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-static-pages.php

admin-static-pages.php in Polylang 2.9.1, at admin/admin-static-pages.php

253 lines 7.3 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 * Manages the static front page and the page for posts on admin side
8 *
9 * @since 1.8
10 */
11 class PLL_Admin_Static_Pages extends PLL_Static_Pages {
12 protected $links;
13
14 /**
15 * Constructor: setups filters and actions
16 *
17 * @since 1.8
18 *
19 * @param object $polylang
20 */
21 public function __construct( &$polylang ) {
22 parent::__construct( $polylang );
23
24 $this->links = &$polylang->links;
25
26 // Removes the editor and the template select dropdown for pages for posts
27 add_filter( 'use_block_editor_for_post', array( $this, 'use_block_editor_for_post' ), 10, 2 ); // Since WP 5.0
28 add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 10, 2 );
29
30 // Add post state for translations of the front page and posts page
31 add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 );
32
33 // Refresh language cache when a static front page has been translated
34 add_action( 'pll_save_post', array( $this, 'pll_save_post' ), 10, 3 );
35
36 // Checks if chosen page on front is translated
37 add_filter( 'pre_update_option_page_on_front', array( $this, 'update_page_on_front' ), 10, 2 );
38 add_filter( 'customize_validate_page_on_front', array( $this, 'customize_validate_page_on_front' ), 10, 2 );
39
40 // Prevents WP resetting the option
41 add_filter( 'pre_update_option_show_on_front', array( $this, 'update_show_on_front' ), 10, 2 );
42
43 add_action( 'admin_notices', array( $this, 'notice_must_translate' ) );
44 }
45
46 /**
47 * Don't use the block editor for the translations of the pages for posts
48 *
49 * @since 2.5
50 *
51 * @param bool $use_block_editor Whether the post can be edited or not.
52 * @param WP_Post $post The post being checked.
53 * @return bool
54 */
55 public function use_block_editor_for_post( $use_block_editor, $post ) {
56 if ( 'page' === $post->post_type ) {
57 add_filter( 'option_page_for_posts', array( $this, 'translate_page_for_posts' ) );
58
59 if ( ( get_option( 'page_for_posts' ) == $post->ID ) && empty( $post->post_content ) ) {
60 return false;
61 }
62 }
63
64 return $use_block_editor;
65 }
66
67 /**
68 * Removes the editor for translations of the pages for posts
69 * Removes the page template select dropdown in page attributes metabox too
70 *
71 * @since 2.2.2
72 *
73 * @param string $post_type Current post type
74 * @param object $post Current post
75 */
76 public function add_meta_boxes( $post_type, $post ) {
77 if ( 'page' === $post_type ) {
78 add_filter( 'option_page_for_posts', array( $this, 'translate_page_for_posts' ) );
79
80 if ( ( get_option( 'page_for_posts' ) == $post->ID ) && empty( $post->post_content ) ) {
81 add_action( 'edit_form_after_title', '_wp_posts_page_notice' );
82 remove_post_type_support( $post_type, 'editor' );
83 }
84 }
85 }
86
87 /**
88 * Add post state for translations of the front page and posts page
89 *
90 * @since 1.8
91 *
92 * @param array $post_states An array of post display states.
93 * @param object $post The current post object.
94 * @return array
95 */
96 public function display_post_states( $post_states, $post ) {
97 if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_on_front' ) ) ) ) {
98 $post_states['page_on_front'] = __( 'Front Page', 'polylang' );
99 }
100
101 if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_for_posts' ) ) ) ) {
102 $post_states['page_for_posts'] = __( 'Posts Page', 'polylang' );
103 }
104
105 return $post_states;
106 }
107
108 /**
109 * Refresh language cache when a static front page has been translated
110 *
111 * @since 1.8
112 *
113 * @param int $post_id Not used
114 * @param object $post Not used
115 * @param array $translations
116 */
117 public function pll_save_post( $post_id, $post, $translations ) {
118 if ( in_array( $this->page_on_front, $translations ) ) {
119 $this->model->clean_languages_cache();
120 }
121 }
122
123 /**
124 * Checks if a page is translated in all languages
125 *
126 * @since 2.2
127 *
128 * @param int $page_id
129 * @return bool
130 */
131 protected function is_page_translated( $page_id ) {
132 if ( $page_id ) {
133 $translations = count( $this->model->post->get_translations( $page_id ) );
134 $languages = count( $this->model->get_languages_list() );
135
136 if ( $languages > 1 && $translations != $languages ) {
137 return false;
138 }
139 }
140
141 return true;
142 }
143
144 /**
145 * Prevents choosing an untranslated static front page
146 * Displays an error message
147 *
148 * @since 1.6
149 *
150 * @param int $page_id New page on front page id
151 * @param int $old_id Old page on front page_id
152 * @return int
153 */
154 public function update_page_on_front( $page_id, $old_id ) {
155 if ( ! $this->is_page_translated( $page_id ) ) {
156 $page_id = $old_id;
157 add_settings_error( 'reading', 'pll_page_on_front_error', __( 'The chosen static front page must be translated in all languages.', 'polylang' ) );
158 }
159
160 return $page_id;
161 }
162
163 /**
164 * Displays an error message in the customizer when choosing an untranslated static front page
165 *
166 * @since 2.2
167 *
168 * @param object $validity WP_Error object
169 * @param int $page_id New page on front page id
170 * @return object
171 */
172 public function customize_validate_page_on_front( $validity, $page_id ) {
173 if ( ! $this->is_page_translated( $page_id ) ) {
174 return new WP_Error( 'pll_page_on_front_error', __( 'The chosen static front page must be translated in all languages.', 'polylang' ) );
175 }
176
177 return $validity;
178 }
179
180 /**
181 * Prevents WP resetting the option if the admin language filter is active for a language with no pages
182 *
183 * @since 1.9.3
184 *
185 * @param string $value
186 * @param string $old_value
187 * @return string
188 */
189 public function update_show_on_front( $value, $old_value ) {
190 if ( ! empty( $GLOBALS['pagenow'] ) && 'options-reading.php' === $GLOBALS['pagenow'] && 'posts' === $value && ! get_pages() && get_pages( array( 'lang' => '' ) ) ) {
191 $value = $old_value;
192 }
193 return $value;
194 }
195
196 /**
197 * Add a notice to translate the static front page if it is not translated in all languages
198 * This is especially useful after a new language is created.
199 * The notice is not dismissible and displayed on the Languages pages and the list of pages.
200 *
201 * @since 2.6
202 */
203 public function notice_must_translate() {
204 $screen = get_current_screen();
205
206 if ( 'toplevel_page_mlang' === $screen->id || 'edit-page' === $screen->id ) {
207 $message = $this->get_must_translate_message();
208
209 if ( ! empty( $message ) ) {
210 printf(
211 '<div class="error"><p>%s</p></div>',
212 $message // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
213 );
214 }
215 }
216 }
217
218 /**
219 * Returns the message asking to translate the static front page in all languages.
220 *
221 * @since 2.8
222 *
223 * @return string
224 */
225 public function get_must_translate_message() {
226 $message = '';
227
228 if ( $this->page_on_front ) {
229 $untranslated = array();
230
231 foreach ( $this->model->get_languages_list() as $language ) {
232 if ( ! $this->model->post->get( $this->page_on_front, $language ) ) {
233 $untranslated[] = sprintf(
234 '<a href="%s">%s</a>',
235 esc_url( $this->links->get_new_post_translation_link( $this->page_on_front, $language ) ),
236 esc_html( $language->name )
237 );
238 }
239 }
240
241 if ( ! empty( $untranslated ) ) {
242 $message = sprintf(
243 /* translators: %s is a comma separated list of native language names */
244 esc_html__( 'You must translate your static front page in %s.', 'polylang' ),
245 implode( ', ', $untranslated ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
246 );
247 }
248 }
249
250 return $message;
251 }
252 }
253