PluginProbe
Post Grid Gutenberg Blocks – PostX / 5.0.35
Post Grid Gutenberg Blocks – PostX v5.0.35
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 5.0.17 2.1.1 2.1.2 All 237 releases
ultimate-post / classes / Options.php

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

355 lines 11.6 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-08-02 00:00 Asia/Dhaka',
86 'end' => '2026-08-16 23:59 Asia/Dhaka',
87 'text' => __(
88 'Summer Sale - Up to 50% OFF',
89 'ultimate-post'
90 ),
91 'utmKey' => 'summer_sale_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(array(
113 'utmKey' => 'sub_menu',
114 ));
115
116 foreach ( $offer_config as $offer ) {
117 $current_time = gmdate( 'U' );
118 $notice_start = gmdate( 'U', strtotime( $offer['start'] ) );
119 $notice_end = gmdate( 'U', strtotime( $offer['end'] ) );
120 if ( $current_time >= $notice_start && $current_time <= $notice_end ) {
121 $url = Xpo::generate_utm_link(
122 array(
123 'utmKey' => $offer['utmKey'],
124 )
125 );
126 $text = $offer['text'];
127 break;
128 }
129 }
130 }
131
132 $upgrade_link['ultp_pro'] = '<a style="color: #0062ff; font-weight: bold;" target="_blank" href="' . esc_url( $url ) . '">' . esc_html( $text ) . '</a>';
133 }
134
135 return array_merge( $setting_link, $links, $upgrade_link );
136 }
137
138
139 /**
140 * Add admin menu option page and submenus.
141 *
142 * @since v.1.0.0
143 * @return void No return value.
144 */
145 public static function menu_page_callback() {
146 $ultp_menu_icon = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA0OC4zIj4NCiAgPGRlZnM+DQogICAgPHN0eWxlPg0KICAgICAgLmNscy0xIHsNCiAgICAgICAgZmlsbDogI2E3YWFhZDsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICA8L2RlZnM+DQogIDx0aXRsZT5Qb3N0eCBJY29uIGNtcHJzc2QgU1ZHPC90aXRsZT4NCiAgPGc+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguODEsOXY4LjlIOC4xOUE2LjE5LDYuMTksMCwwLDAsMiwyMy43N2EzLjE2LDMuMTYsMCwwLDEtMi0yLjk0VjRBMy4xNiwzLjE2LDAsMCwxLDMuMTUuODVIMjBhMy4xOCwzLjE4LDAsMCwxLDMsMi4zMUE2LjIxLDYuMjEsMCwwLDAsMTguODEsOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDUsOVYyM0gzMS4xYTYuMjMsNi4yMywwLDAsMC00LjkzLTQuOTNBNS41NCw1LjU0LDAsMCwwLDI1LDE3Ljk0SDIxLjg1VjlBMy4xNSwzLjE1LDAsMCwxLDIzLjEzLDYuNWEzLjEyLDMuMTIsMCwwLDEsMS40My0uNThsLjA5LDBINDEuODNBMy4xNCwzLjE0LDAsMCwxLDQ1LDlaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjg1KSIvPg0KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUwLDI5LjE3VjQ2YTMuMTYsMy4xNiwwLDAsMS0zLjE1LDMuMTVIMzBhMy4xOCwzLjE4LDAsMCwxLTMtMi4zMUE2LjIyLDYuMjIsMCwwLDAsMzEuMjEsNDFWMjZINDYuODVhMy4zLDMuMywwLDAsMSwxLjE0LjIxQTMuMTYsMy4xNiwwLDAsMSw1MCwyOS4xN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjguMTYsMjQuMTNWNDFhMy4xMywzLjEzLDAsMCwxLTEuMjksMi41NCwzLDMsMCwwLDEtMS40Ny41OGwwLDBIOC4xOUEzLjE1LDMuMTUsMCwwLDEsNSw0MVYyNGEzLjE3LDMuMTcsMCwwLDEsMy4xNS0zSDI1YTMuMTIsMy4xMiwwLDAsMSwxLjE0LjIyLDMuMjQsMy4yNCwwLDAsMSwxLjksMi4xQTMuNjMsMy42MywwLDAsMSwyOC4xNiwyNC4xM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogIDwvZz4NCjwvc3ZnPg0K';
147 $menupage_cap = apply_filters( 'ultp_menu_page_capability', 'manage_options' );
148 add_menu_page(
149 __( 'PostX', 'ultimate-post' ),
150 __( 'PostX', 'ultimate-post' ),
151 $menupage_cap,
152 'ultp-settings',
153 array( self::class, 'ultp_dashboard' ),
154 $ultp_menu_icon,
155 58.5
156 );
157
158 add_submenu_page(
159 'ultp-settings',
160 __( 'PostX Dashboard', 'ultimate-post' ),
161 __( 'Getting Started', 'ultimate-post' ),
162 $menupage_cap,
163 'ultp-settings'
164 );
165
166 $menu_lists = array(
167 'startersites' => esc_html__( 'Starter Sites', 'ultimate-post' ),
168 'builder' => esc_html__( 'Site Builder', 'ultimate-post' ),
169 'saved-templates' => esc_html__( 'Saved Templates', 'ultimate-post' ),
170 'custom-font' => esc_html__( 'Custom Font', 'ultimate-post' ),
171 'addons' => esc_html__( 'Add-ons', 'ultimate-post' ),
172 'blocks' => esc_html__( 'Blocks', 'ultimate-post' ),
173 'settings' => esc_html__( 'Settings', 'ultimate-post' ),
174 );
175 if ( defined( 'ULTP_PRO_VER' ) ) {
176 $menu_lists['license'] = esc_html__( 'License ', 'ultimate-post' );
177 }
178
179 foreach ( $menu_lists as $key => $val ) {
180 add_submenu_page(
181 'ultp-settings',
182 $val,
183 $val,
184 $menupage_cap,
185 'ultp-settings#' . $key,
186 array( __CLASS__, 'render_main' )
187 );
188 }
189 add_submenu_page(
190 'ultp-settings',
191 esc_html__( 'Initial Setup', 'ultimate-post' ),
192 esc_html__( 'Initial Setup', 'ultimate-post' ),
193 $menupage_cap,
194 'ultp-setup-wizard',
195 array( __CLASS__, 'ultp_wizard_page' )
196 );
197
198 $pro_link = '';
199 $pro_link_text = '';
200
201 // Check if current date is between November 5th and December 10th
202 $current_date = current_time( 'Y-m-d' );
203 $start_date = date( 'Y' ) . '-01-01'; // January 1st of current year
204 $end_date = date( 'Y' ) . '-02-15'; // February 15th of current year
205 $menu_pro_text_period = ( $current_date >= $start_date && $current_date <= $end_date );
206
207 if ( ! Xpo::is_lc_active() ) {
208 $pro_link = Xpo::generate_utm_link(
209 array(
210 'utmKey' => 'sub_menu',
211 )
212 );
213 $pro_link_text = $menu_pro_text_period ? __( 'New Year Offer!', 'ultimate-post' ) : __( 'Upgrade to Pro', 'ultimate-post' );
214 } elseif ( Xpo::is_lc_expired() ) {
215 $license_key = Xpo::get_lc_key();
216 $pro_link = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key;
217 $pro_link_text = __( 'Renew License', 'ultimate-post' );
218 }
219
220 if ( ! empty( $pro_link ) ) {
221 ob_start();
222 ?>
223 <a href="<?php echo esc_url( $pro_link ); ?>" target="_blank" class="ultp-go-pro">
224 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
225 <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>
226 </svg>
227 <span><?php echo esc_html( $pro_link_text ); ?></span>
228 </a>
229 <?php
230 $submenu_content = ob_get_clean();
231
232 add_submenu_page(
233 'ultp-settings',
234 '',
235 $submenu_content,
236 'manage_options',
237 'ultp-pro',
238 array( self::class, 'handle_external_redirects' )
239 );
240 }
241
242 add_theme_page(
243 __( 'Starter Sites', 'ultimate-post' ),
244 __( 'Starter Sites', 'ultimate-post' ),
245 $menupage_cap,
246 'ultp-startersites',
247 array( self::class, 'handle_external_redirects' )
248 );
249 }
250
251 /**
252 * Sync addon-backed WordPress submenu items with addon enabled status.
253 *
254 * @since v.4.1.7
255 * @return void No return value.
256 */
257 public function sync_addon_submenu_visibility() {
258 $settings = ultimate_post()->get_setting();
259 $submenus = array(
260 'builder' => 'ultp_builder',
261 'saved-templates' => 'ultp_templates',
262 'custom-font' => 'ultp_custom_font',
263 );
264
265 foreach ( $submenus as $slug => $setting_key ) {
266 $submenus[ $slug ] = isset( $settings[ $setting_key ] ) && $settings[ $setting_key ] !== 'false';
267 }
268 ?>
269 <script>
270 ( function() {
271 const postxAddonSubmenus = <?php echo wp_json_encode( $submenus ); ?>;
272
273 Object.keys( postxAddonSubmenus ).forEach( function( slug ) {
274 const link = document.querySelector( '#adminmenu a[href*="page=ultp-settings#' + slug + '"]' );
275 const item = link ? link.closest( 'li' ) : null;
276
277 if ( ! item ) {
278 return;
279 }
280
281 item.id = 'postx-submenu-' + slug;
282 item.style.display = postxAddonSubmenus[ slug ] ? '' : 'none';
283 } );
284 }() );
285 </script>
286 <?php
287 }
288
289 /**
290 * Handle external redirects for menu and pro links.
291 *
292 * @since v.1.0.0
293 * @return void No return value.
294 */
295 public function handle_external_redirects() {
296 if (empty($_GET['page'])) { // @codingStandardsIgnoreLine
297 return;
298 }
299 $_page = sanitize_key( $_GET['page'] );
300 if ('ultp-startersites' === $_page) { // @codingStandardsIgnoreLine
301 exit( wp_safe_redirect( admin_url( 'admin.php?page=ultp-settings#startersites' ) ) );
302 } else if ('go_postx_pro' === $_page) { // @codingStandardsIgnoreLine
303 wp_redirect(
304 Xpo::generate_utm_link(
305 array(
306 'utmKey' => 'dashboard_go_pro',
307 )
308 )
309 );
310 die();
311 }
312 }
313
314 /**
315 * Render the wizard page.
316 *
317 * @since v.2.4.4
318 */
319 public static function ultp_wizard_page() {
320 ?>
321 <div class="ultp-wizard-page-wrap" id="ultp-wizard-page"></div>
322 <?php
323 }
324
325 /**
326 * Render the dashboard page.
327 *
328 * @since v.1.0.0
329 * @return void No return value.
330 */
331 public static function ultp_dashboard() {
332 echo '<div id="ultp-dashboard"></div>';
333 }
334
335 /**
336 * Remove all notifications from menu page.
337 *
338 * @since v.1.0.0
339 * @return void No return value.
340 */
341 public static function remove_all_notices() {
342 if (isset($_GET['page'])) { // @codingStandardsIgnoreLine
343 $page = sanitize_key($_GET['page']); // @codingStandardsIgnoreLine
344 if (
345 $page === 'ultp-settings' ||
346 $page === 'ultp-license' ||
347 $page === 'ultp-setup-wizard'
348 ) {
349 remove_all_actions( 'admin_notices' );
350 remove_all_actions( 'all_admin_notices' );
351 }
352 }
353 }
354 }
355