PluginProbe
Post Grid Gutenberg Blocks – PostX / 5.1.0
Post Grid Gutenberg Blocks – PostX v5.1.0
5.1.1 5.1.0 5.0.41 5.0.39 5.0.38 5.0.37 5.0.36 5.0.35 5.0.34 5.0.33 5.0.32 5.0.31 5.0.30 5.0.29 5.0.28 5.0.27 5.0.26 5.0.25 5.0.23 5.0.24 5.0.22 5.0.21 5.0.20 5.0.19 5.0.18 All 240 releases
ultimate-post / classes / Options.php

Options.php in Post Grid Gutenberg Blocks – PostX 5.1.0, at classes/Options.php

358 lines 11.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Options Action.
5 *
6 * @package ULTP\Notice
7 * @since v.1.0.0
8 */
9
10 namespace ULTP;
11
12 use ULTP\Includes\Durbin\Xpo;
13
14 defined( 'ABSPATH' ) || exit;
15
16 /**
17 * Options class.
18 *
19 * Handles plugin options and settings for Ultimate Post.
20 *
21 * @package ULTP\Options
22 * @since 4.0.0
23 */
24 class Options {
25
26 /**
27 * Setup class.
28 *
29 * @since v.1.0.0
30 */
31 public function __construct() {
32 add_action( 'admin_init', array( $this, 'handle_external_redirects' ) );
33 add_action( 'admin_menu', array( $this, 'menu_page_callback' ) );
34 add_action( 'admin_footer', array( $this, 'sync_addon_submenu_visibility' ) );
35 add_action( 'in_admin_header', array( $this, 'remove_all_notices' ) );
36 add_filter( 'plugin_row_meta', array( $this, 'plugin_settings_meta' ), 10, 2 );
37 add_filter( 'plugin_action_links_' . ULTP_BASE, array( $this, 'plugin_action_links_callback' ) );
38 }
39
40
41 /**
42 * Adds extra links to the plugin row meta on the plugins page.
43 *
44 * @param array $links Existing plugin meta links.
45 * @param string $file Plugin file path.
46 * @return array Modified plugin meta links.
47 */
48 public function plugin_settings_meta( $links, $file ) {
49 if ( strpos( $file, 'ultimate-post.php' ) !== false ) {
50 $new_links = array(
51 'ultp_docs' => '<a href="https://wpxpo.com/docs/" target="_blank">' . esc_html__( 'Docs', 'ultimate-post' ) . '</a>',
52 'ultp_tutorial' => '<a href="https://www.youtube.com/watch?v=JZxIflYKOuM&list=PLPidnGLSR4qcAwVwIjMo1OVaqXqjUp_s4" target="_blank">' . esc_html__( 'Tutorials', 'ultimate-post' ) . '</a>',
53 'ultp_support' => '<a href="' . esc_url(
54 Xpo::generate_utm_link(
55 array(
56 'url' => 'https://www.wpxpo.com/contact/',
57 'utmKey' => 'plugin_dir_support',
58 )
59 )
60 ) . '" target="_blank">' . esc_html__( 'Support', 'ultimate-post' ) . '</a>',
61 );
62 $links = array_merge( $links, $new_links );
63 }
64 return $links;
65 }
66
67 /**
68 * Adds quick action links below the plugin name.
69 *
70 * @param array $links Default plugin action links.
71 * @return array Modified plugin action links.
72 */
73 public function plugin_action_links_callback( $links ) {
74 $offer_config = array(
75 array(
76 'start' => '2026-07-06 00:00 Asia/Dhaka',
77 'end' => '2026-08-01 23:59 Asia/Dhaka',
78 'text' => __(
79 'Summer Sale - Up to 50% OFF',
80 'ultimate-post'
81 ),
82 'utmKey' => 'summer_sale_meta',
83 ),
84 array(
85 'start' => '2026-09-02 00:00 Asia/Dhaka',
86 'end' => '2026-10-10 23:59 Asia/Dhaka',
87 'text' => __(
88 'Get Pro at $39',
89 'ultimate-post'
90 ),
91 'utmKey' => 'base_price_meta',
92 ),
93 );
94
95 $setting_link = array(
96 'ultp_options' => '<a href="' . esc_url( admin_url( 'admin.php?page=ultp-settings#startersites' ) ) . '">' . esc_html__( 'Starter Sites', 'ultimate-post' ) . '</a>',
97 );
98
99 $upgrade_link = array();
100
101 // Free user or expired license user.
102 if ( ! defined( 'ULTP_PRO_VER' ) || Xpo::is_lc_expired() ) {
103
104 $license_key = Xpo::get_lc_key() ?? '';
105
106 if ( Xpo::is_lc_expired() ) {
107 $text = esc_html__( 'Renew License', 'ultimate-post' );
108 $url = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key;
109 } else {
110
111 $text = esc_html__( 'Upgrade to Pro', 'ultimate-post' );
112 $url = Xpo::generate_utm_link(
113 array(
114 'utmKey' => 'sub_menu',
115 )
116 );
117
118 foreach ( $offer_config as $offer ) {
119 $current_time = gmdate( 'U' );
120 $notice_start = gmdate( 'U', strtotime( $offer['start'] ) );
121 $notice_end = gmdate( 'U', strtotime( $offer['end'] ) );
122 if ( $current_time >= $notice_start && $current_time <= $notice_end ) {
123 $url = Xpo::generate_utm_link(
124 array(
125 'utmKey' => $offer['utmKey'],
126 )
127 );
128 $text = $offer['text'];
129 break;
130 }
131 }
132 }
133
134 $upgrade_link['ultp_pro'] = '<a style="color: #0062ff; font-weight: bold;" target="_blank" href="' . esc_url( $url ) . '">' . esc_html( $text ) . '</a>';
135 }
136
137 return array_merge( $setting_link, $links, $upgrade_link );
138 }
139
140
141 /**
142 * Add admin menu option page and submenus.
143 *
144 * @since v.1.0.0
145 * @return void No return value.
146 */
147 public static function menu_page_callback() {
148 $ultp_menu_icon = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA0OC4zIj4NCiAgPGRlZnM+DQogICAgPHN0eWxlPg0KICAgICAgLmNscy0xIHsNCiAgICAgICAgZmlsbDogI2E3YWFhZDsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICA8L2RlZnM+DQogIDx0aXRsZT5Qb3N0eCBJY29uIGNtcHJzc2QgU1ZHPC90aXRsZT4NCiAgPGc+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguODEsOXY4LjlIOC4xOUE2LjE5LDYuMTksMCwwLDAsMiwyMy43N2EzLjE2LDMuMTYsMCwwLDEtMi0yLjk0VjRBMy4xNiwzLjE2LDAsMCwxLDMuMTUuODVIMjBhMy4xOCwzLjE4LDAsMCwxLDMsMi4zMUE2LjIxLDYuMjEsMCwwLDAsMTguODEsOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDUsOVYyM0gzMS4xYTYuMjMsNi4yMywwLDAsMC00LjkzLTQuOTNBNS41NCw1LjU0LDAsMCwwLDI1LDE3Ljk0SDIxLjg1VjlBMy4xNSwzLjE1LDAsMCwxLDIzLjEzLDYuNWEzLjEyLDMuMTIsMCwwLDEsMS40My0uNThsLjA5LDBINDEuODNBMy4xNCwzLjE0LDAsMCwxLDQ1LDlaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjg1KSIvPg0KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUwLDI5LjE3VjQ2YTMuMTYsMy4xNiwwLDAsMS0zLjE1LDMuMTVIMzBhMy4xOCwzLjE4LDAsMCwxLTMtMi4zMUE2LjIyLDYuMjIsMCwwLDAsMzEuMjEsNDFWMjZINDYuODVhMy4zLDMuMywwLDAsMSwxLjE0LjIxQTMuMTYsMy4xNiwwLDAsMSw1MCwyOS4xN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjguMTYsMjQuMTNWNDFhMy4xMywzLjEzLDAsMCwxLTEuMjksMi41NCwzLDMsMCwwLDEtMS40Ny41OGwwLDBIOC4xOUEzLjE1LDMuMTUsMCwwLDEsNSw0MVYyNGEzLjE3LDMuMTcsMCwwLDEsMy4xNS0zSDI1YTMuMTIsMy4xMiwwLDAsMSwxLjE0LjIyLDMuMjQsMy4yNCwwLDAsMSwxLjksMi4xQTMuNjMsMy42MywwLDAsMSwyOC4xNiwyNC4xM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogIDwvZz4NCjwvc3ZnPg0K';
149 $menupage_cap = apply_filters( 'ultp_menu_page_capability', 'manage_options' );
150 add_menu_page(
151 __( 'PostX', 'ultimate-post' ),
152 __( 'PostX', 'ultimate-post' ),
153 $menupage_cap,
154 'ultp-settings',
155 array( self::class, 'ultp_dashboard' ),
156 $ultp_menu_icon,
157 58.5
158 );
159
160 add_submenu_page(
161 'ultp-settings',
162 __( 'PostX Dashboard', 'ultimate-post' ),
163 __( 'Getting Started', 'ultimate-post' ),
164 $menupage_cap,
165 'ultp-settings'
166 );
167
168 $menu_lists = array(
169 'startersites' => esc_html__( 'Starter Sites', 'ultimate-post' ),
170 'builder' => esc_html__( 'Site Builder', 'ultimate-post' ),
171 'saved-templates' => esc_html__( 'Saved Templates', 'ultimate-post' ),
172 'custom-font' => esc_html__( 'Custom Font', 'ultimate-post' ),
173 'addons' => esc_html__( 'Add-ons', 'ultimate-post' ),
174 'blocks' => esc_html__( 'Blocks', 'ultimate-post' ),
175 'settings' => esc_html__( 'Settings', 'ultimate-post' ),
176 );
177 if ( defined( 'ULTP_PRO_VER' ) ) {
178 $menu_lists['license'] = esc_html__( 'License ', 'ultimate-post' );
179 }
180
181 foreach ( $menu_lists as $key => $val ) {
182 add_submenu_page(
183 'ultp-settings',
184 $val,
185 $val,
186 $menupage_cap,
187 'ultp-settings#' . $key,
188 array( __CLASS__, 'render_main' )
189 );
190 }
191 add_submenu_page(
192 'ultp-settings',
193 esc_html__( 'Initial Setup', 'ultimate-post' ),
194 esc_html__( 'Initial Setup', 'ultimate-post' ),
195 $menupage_cap,
196 'ultp-setup-wizard',
197 array( __CLASS__, 'ultp_wizard_page' )
198 );
199
200 $pro_link = '';
201 $pro_link_text = '';
202
203 // Check if current date is between November 5th and December 10th
204 $current_date = current_time( 'Y-m-d' );
205 $start_date = gmdate( 'Y' ) . '-01-01'; // January 1st of current year
206 $end_date = gmdate( 'Y' ) . '-02-15'; // February 15th of current year
207 $menu_pro_text_period = ( $current_date >= $start_date && $current_date <= $end_date );
208
209 if ( ! Xpo::is_lc_active() ) {
210 $pro_link = Xpo::generate_utm_link(
211 array(
212 'utmKey' => 'sub_menu',
213 )
214 );
215 $pro_link_text = $menu_pro_text_period ? __( 'New Year Offer!', 'ultimate-post' ) : __( 'Upgrade to Pro', 'ultimate-post' );
216 } elseif ( Xpo::is_lc_expired() ) {
217 $license_key = Xpo::get_lc_key();
218 $pro_link = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key;
219 $pro_link_text = __( 'Renew License', 'ultimate-post' );
220 }
221
222 if ( ! empty( $pro_link ) ) {
223 ob_start();
224 ?>
225 <a href="<?php echo esc_url( $pro_link ); ?>" target="_blank" class="ultp-go-pro">
226 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
227 <path d="M2.86 6.553a.5.5 0 01.823-.482l3.02 2.745c.196.178.506.13.64-.098L9.64 4.779a.417.417 0 01.72 0l2.297 3.939a.417.417 0 00.64.098l3.02-2.745a.5.5 0 01.823.482l-1.99 8.63a.833.833 0 01-.813.646H5.663a.833.833 0 01-.812-.646L2.86 6.553z" stroke="currentColor" stroke-width="1.5"></path>
228 </svg>
229 <span><?php echo esc_html( $pro_link_text ); ?></span>
230 </a>
231 <?php
232 $submenu_content = ob_get_clean();
233
234 add_submenu_page(
235 'ultp-settings',
236 '',
237 $submenu_content,
238 'manage_options',
239 'ultp-pro',
240 array( self::class, 'handle_external_redirects' )
241 );
242 }
243
244 add_theme_page(
245 __( 'Starter Sites', 'ultimate-post' ),
246 __( 'Starter Sites', 'ultimate-post' ),
247 $menupage_cap,
248 'ultp-startersites',
249 array( self::class, 'handle_external_redirects' )
250 );
251 }
252
253 /**
254 * Sync addon-backed WordPress submenu items with addon enabled status.
255 *
256 * @since v.4.1.7
257 * @return void No return value.
258 */
259 public function sync_addon_submenu_visibility() {
260 $settings = ultimate_post()->get_setting();
261 $submenus = array(
262 'builder' => 'ultp_builder',
263 'saved-templates' => 'ultp_templates',
264 'custom-font' => 'ultp_custom_font',
265 );
266
267 foreach ( $submenus as $slug => $setting_key ) {
268 $submenus[ $slug ] = isset( $settings[ $setting_key ] ) && $settings[ $setting_key ] !== 'false';
269 }
270 ?>
271 <script>
272 ( function() {
273 const postxAddonSubmenus = <?php echo wp_json_encode( $submenus ); ?>;
274
275 Object.keys( postxAddonSubmenus ).forEach( function( slug ) {
276 const link = document.querySelector( '#adminmenu a[href*="page=ultp-settings#' + slug + '"]' );
277 const item = link ? link.closest( 'li' ) : null;
278
279 if ( ! item ) {
280 return;
281 }
282
283 item.id = 'postx-submenu-' + slug;
284 item.style.display = postxAddonSubmenus[ slug ] ? '' : 'none';
285 } );
286 }() );
287 </script>
288 <?php
289 }
290
291 /**
292 * Handle external redirects for menu and pro links.
293 *
294 * @since v.1.0.0
295 * @return void No return value.
296 */
297 public function handle_external_redirects() {
298 if (empty($_GET['page'])) { // @codingStandardsIgnoreLine
299 return;
300 }
301 $_page = sanitize_key( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin page slug.
302 if ('ultp-startersites' === $_page) { // @codingStandardsIgnoreLine
303 wp_safe_redirect( admin_url( 'admin.php?page=ultp-settings#startersites' ) );
304 exit;
305 } else if ('go_postx_pro' === $_page) { // @codingStandardsIgnoreLine
306 wp_redirect( // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- Intentional redirect to the fixed wpxpo.com pricing URL.
307 Xpo::generate_utm_link(
308 array(
309 'utmKey' => 'dashboard_go_pro',
310 )
311 )
312 );
313 die();
314 }
315 }
316
317 /**
318 * Render the wizard page.
319 *
320 * @since v.2.4.4
321 */
322 public static function ultp_wizard_page() {
323 ?>
324 <div class="ultp-wizard-page-wrap" id="ultp-wizard-page"></div>
325 <?php
326 }
327
328 /**
329 * Render the dashboard page.
330 *
331 * @since v.1.0.0
332 * @return void No return value.
333 */
334 public static function ultp_dashboard() {
335 echo '<div id="ultp-dashboard"></div>';
336 }
337
338 /**
339 * Remove all notifications from menu page.
340 *
341 * @since v.1.0.0
342 * @return void No return value.
343 */
344 public static function remove_all_notices() {
345 if (isset($_GET['page'])) { // @codingStandardsIgnoreLine
346 $page = sanitize_key($_GET['page']); // @codingStandardsIgnoreLine
347 if (
348 $page === 'ultp-settings' ||
349 $page === 'ultp-license' ||
350 $page === 'ultp-setup-wizard'
351 ) {
352 remove_all_actions( 'admin_notices' );
353 remove_all_actions( 'all_admin_notices' );
354 }
355 }
356 }
357 }
358