1414 */
1515class Page_Settings {
1616
17- /**
18- * Constructor.
19- */
20- public function __construct () {
21- // Add the admin menu page.
22- \add_action ( 'admin_menu ' , [ $ this , 'add_admin_menu_page ' ] );
23-
24- // Add AJAX hooks to save options.
25- \add_action ( 'wp_ajax_prpl_settings_form ' , [ $ this , 'store_settings_form_options ' ] );
26- }
27-
28- /**
29- * Add admin-menu page, as a submenu in the progress-planner menu.
30- *
31- * @return void
32- */
33- public function add_admin_menu_page () {
34- \add_submenu_page (
35- 'progress-planner ' ,
36- \esc_html__ ( 'Settings ' , 'progress-planner ' ),
37- \esc_html__ ( 'Settings ' , 'progress-planner ' ),
38- 'manage_options ' ,
39- 'progress-planner-settings ' ,
40- [ $ this , 'add_admin_page_content ' ]
41- );
42- }
43-
44- /**
45- * Add content to the admin page of the free plugin.
46- *
47- * @return void
48- */
49- public function add_admin_page_content () {
50- require_once PROGRESS_PLANNER_DIR . '/views/admin-page-settings.php ' ;
51- }
52-
5317 /**
5418 * Get an array of settings.
5519 *
@@ -58,27 +22,28 @@ public function add_admin_page_content() {
5822 public function get_settings () {
5923 $ settings = [];
6024 foreach ( \progress_planner ()->get_page_types ()->get_page_types () as $ page_type ) {
61- if ( ! $ this ->should_show_setting ( $ page_type ['slug ' ] ) ) {
25+ $ slug = (string ) $ page_type ['slug ' ]; // @phpstan-ignore offsetAccess.invalidOffset
26+ if ( ! $ this ->should_show_setting ( $ slug ) ) {
6227 continue ;
6328 }
6429
65- $ settings [ $ page_type [ ' slug ' ] ] = [
66- 'id ' => $ page_type [ ' slug ' ] ,
30+ $ settings [ $ slug ] = [
31+ 'id ' => $ slug ,
6732 'value ' => '_no_page_needed ' ,
6833 'isset ' => 'no ' ,
69- 'title ' => $ page_type ['title ' ],
70- 'description ' => $ page_type ['description ' ] ?? '' ,
34+ 'title ' => $ page_type ['title ' ], // @phpstan-ignore offsetAccess.invalidOffset
35+ 'description ' => $ page_type ['description ' ] ?? '' , // @phpstan-ignore offsetAccess.invalidOffset
7136 'type ' => 'page-select ' ,
72- 'page ' => $ page_type [ ' slug ' ] ,
37+ 'page ' => $ slug ,
7338 ];
7439
75- if ( \progress_planner ()->get_page_types ()->is_page_needed ( $ page_type [ ' slug ' ] ) ) {
76- $ type_pages = \progress_planner ()->get_page_types ()->get_posts_by_type ( 'any ' , $ page_type [ ' slug ' ] );
40+ if ( \progress_planner ()->get_page_types ()->is_page_needed ( $ slug ) ) {
41+ $ type_pages = \progress_planner ()->get_page_types ()->get_posts_by_type ( 'any ' , $ slug );
7742 if ( empty ( $ type_pages ) ) {
78- $ settings [ $ page_type [ ' slug ' ] ]['value ' ] = \progress_planner ()->get_page_types ()->get_default_page_id_by_type ( $ page_type [ ' slug ' ] );
43+ $ settings [ $ slug ]['value ' ] = \progress_planner ()->get_page_types ()->get_default_page_id_by_type ( $ slug );
7944 } else {
80- $ settings [ $ page_type [ ' slug ' ] ]['value ' ] = $ type_pages [0 ]->ID ;
81- $ settings [ $ page_type [ ' slug ' ] ]['isset ' ] = 'yes ' ;
45+ $ settings [ $ slug ]['value ' ] = $ type_pages [0 ]->ID ;
46+ $ settings [ $ slug ]['isset ' ] = 'yes ' ;
8247
8348 // If there is more than one page, we need to check if the page has a parent with the same page-type assigned.
8449 if ( 1 < \count ( $ type_pages ) ) {
@@ -89,7 +54,7 @@ public function get_settings() {
8954 foreach ( $ type_pages as $ type_page ) {
9055 $ parent = \get_post_field ( 'post_parent ' , $ type_page ->ID );
9156 if ( $ parent && \in_array ( (int ) $ parent , $ type_pages_ids , true ) ) {
92- $ settings [ $ page_type [ ' slug ' ] ]['value ' ] = $ parent ;
57+ $ settings [ $ slug ]['value ' ] = $ parent ;
9358 break ;
9459 }
9560 }
@@ -123,95 +88,76 @@ public function should_show_setting( $page_type ) {
12388 }
12489
12590 /**
126- * Store the settings form options.
91+ * Set the page value.
92+ *
93+ * @param array $pages The pages.
12794 *
12895 * @return void
12996 */
130- public function store_settings_form_options ( ) {
97+ public function set_page_values ( $ pages ) {
13198
132- if ( ! \current_user_can ( ' manage_options ' ) ) {
133- \wp_send_json_error ( [ ' message ' => \esc_html__ ( ' You do not have permission to update settings. ' , ' progress-planner ' ) ] ) ;
99+ if ( empty ( $ pages ) ) {
100+ return ;
134101 }
135102
136- // Use check_ajax_referer instead of check_admin_referer for AJAX handlers.
137- // check_admin_referer is designed for form submissions, not AJAX requests.
138- if ( ! \check_ajax_referer ( 'progress_planner ' , 'nonce ' , false ) ) {
139- \wp_send_json_error ( [ 'message ' => \esc_html__ ( 'Invalid nonce. ' , 'progress-planner ' ) ] );
140- }
141-
142- if ( isset ( $ _POST ['pages ' ] ) ) {
143- // Sanitize the pages array at point of reception.
144- $ pages = \map_deep ( \wp_unslash ( $ _POST ['pages ' ] ), 'sanitize_text_field ' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
145-
146- foreach ( $ pages as $ type => $ page_args ) {
147- $ need_page = isset ( $ page_args ['have_page ' ] ) ? $ page_args ['have_page ' ] : '' ;
103+ foreach ( $ pages as $ type => $ page_args ) {
104+ $ need_page = isset ( $ page_args ['have_page ' ] ) ? $ page_args ['have_page ' ] : '' ;
148105
149- \progress_planner ()->get_page_types ()->set_no_page_needed (
150- $ type ,
151- 'not-applicable ' === $ need_page
152- );
153-
154- // Remove the post-meta from the existing posts.
155- $ existing_posts = \progress_planner ()->get_page_types ()->get_posts_by_type ( 'any ' , $ type );
156- foreach ( $ existing_posts as $ post ) {
157- if ( $ post ->ID === (int ) $ page_args ['id ' ] && 'no ' !== $ page_args ['have_page ' ] ) {
158- continue ;
159- }
106+ \progress_planner ()->get_page_types ()->set_no_page_needed (
107+ $ type ,
108+ 'not-applicable ' === $ need_page
109+ );
160110
161- // Get the term-ID for the type.
162- $ term = \get_term_by ( 'slug ' , $ type , Page_Types::TAXONOMY_NAME );
163- if ( ! $ term instanceof \WP_Term ) {
164- continue ;
165- }
166-
167- // Remove the assigned terms from the `progress_planner_page_types` taxonomy.
168- \wp_remove_object_terms ( $ post ->ID , $ term ->term_id , Page_Types::TAXONOMY_NAME );
111+ // Remove the post-meta from the existing posts.
112+ $ existing_posts = \progress_planner ()->get_page_types ()->get_posts_by_type ( 'any ' , $ type );
113+ foreach ( $ existing_posts as $ post ) {
114+ if ( $ post ->ID === (int ) $ page_args ['id ' ] && 'no ' !== $ page_args ['have_page ' ] ) {
115+ continue ;
169116 }
170117
171- // Skip if the ID is not set.
172- if ( ! isset ( $ page_args ['id ' ] ) || 1 > (int ) $ page_args ['id ' ] ) {
118+ // Get the term-ID for the type.
119+ $ term = \get_term_by ( 'slug ' , $ type , Page_Types::TAXONOMY_NAME );
120+ if ( ! $ term instanceof \WP_Term ) {
173121 continue ;
174122 }
175123
176- if ( 'no ' !== $ page_args ['have_page ' ] ) {
177- // Add the term to the `progress_planner_page_types` taxonomy.
178- \progress_planner ()->get_page_types ()->set_page_type_by_id ( (int ) $ page_args ['id ' ], $ type );
179- }
124+ // Remove the assigned terms from the `progress_planner_page_types` taxonomy.
125+ \wp_remove_object_terms ( $ post ->ID , $ term ->term_id , Page_Types::TAXONOMY_NAME );
180126 }
181- }
182-
183- $ this ->save_settings ();
184- $ this ->save_post_types ();
185127
186- \do_action ( 'progress_planner_settings_form_options_stored ' );
128+ // Skip if the ID is not set.
129+ if ( ! isset ( $ page_args ['id ' ] ) || 1 > (int ) $ page_args ['id ' ] ) {
130+ continue ;
131+ }
187132
188- \wp_send_json_success ( \esc_html__ ( 'Options stored successfully ' , 'progress-planner ' ) );
133+ if ( 'no ' !== $ page_args ['have_page ' ] ) {
134+ // Add the term to the `progress_planner_page_types` taxonomy.
135+ \progress_planner ()->get_page_types ()->set_page_type_by_id ( (int ) $ page_args ['id ' ], $ type );
136+ }
137+ }
189138 }
190139
191140 /**
192- * Save the settings.
141+ * Save the redirect on login setting.
142+ *
143+ * @param bool $redirect_on_login Whether to redirect on login.
193144 *
194145 * @return void
195146 */
196- public function save_settings () {
197- // Nonce is already checked in store_settings_form_options() which calls this method.
198- $ redirect_on_login = isset ( $ _POST ['prpl-redirect-on-login ' ] ) // phpcs:ignore WordPress.Security.NonceVerification.Missing
199- ? \sanitize_text_field ( \wp_unslash ( $ _POST ['prpl-redirect-on-login ' ] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing
200- : false ;
201-
202- \update_user_meta ( \get_current_user_id (), 'prpl_redirect_on_login ' , (bool ) $ redirect_on_login );
147+ public function save_redirect_on_login ( $ redirect_on_login = false ) {
148+ \update_user_meta ( \get_current_user_id (), 'prpl_redirect_on_login ' , $ redirect_on_login );
203149 }
204150
205151 /**
206152 * Save the post types.
207153 *
154+ * @param array $post_types The post types.
155+ *
208156 * @return void
209157 */
210- public function save_post_types () {
211- // Nonce is already checked in store_settings_form_options() which calls this method.
212- $ include_post_types = isset ( $ _POST ['prpl-post-types-include ' ] ) // phpcs:ignore WordPress.Security.NonceVerification.Missing
213- ? \array_map ( 'sanitize_text_field ' , \wp_unslash ( $ _POST ['prpl-post-types-include ' ] ) ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
214- // If no post types are selected, use the default post types (post and page can be deregistered).
158+ public function save_post_types ( $ post_types = [] ) {
159+ $ include_post_types = ! empty ( $ post_types )
160+ ? $ post_types
215161 : \array_intersect ( [ 'post ' , 'page ' ], \progress_planner ()->get_settings ()->get_public_post_types () );
216162
217163 \progress_planner ()->get_settings ()->set ( 'include_post_types ' , $ include_post_types );
0 commit comments