PluginProbe
Post Grid Gutenberg Blocks – PostX / 5.0.19
Post Grid Gutenberg Blocks – PostX v5.0.19
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.19, at classes/Options.php

358 lines 11.4 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( 'in_admin_header', array( $this, 'remove_all_notices' ) );
35 add_filter( 'plugin_row_meta', array( $this, 'plugin_settings_meta' ), 10, 2 );
36 add_filter( 'plugin_action_links_' . ULTP_BASE, array( $this, 'plugin_action_links_callback' ) );
37 }
38
39
40 /**
41 * Adds extra links to the plugin row meta on the plugins page.
42 *
43 * @param array $links Existing plugin meta links.
44 * @param string $file Plugin file path.
45 * @return array Modified plugin meta links.
46 */
47 public function plugin_settings_meta( $links, $file ) {
48 if ( strpos( $file, 'ultimate-post.php' ) !== false ) {
49 $new_links = array(
50 'ultp_docs' => '<a href="https://wpxpo.com/docs/" target="_blank">' . esc_html__( 'Docs', 'ultimate-post' ) . '</a>',
51 'ultp_tutorial' => '<a href="https://www.youtube.com/watch?v=JZxIflYKOuM&list=PLPidnGLSR4qcAwVwIjMo1OVaqXqjUp_s4" target="_blank">' . esc_html__( 'Tutorials', 'ultimate-post' ) . '</a>',
52 'ultp_support' => '<a href="' . esc_url(
53 Xpo::generate_utm_link(
54 array(
55 'url' => 'https://www.wpxpo.com/contact/',
56 'utmKey' => 'plugin_dir_support',
57 )
58 )
59 ) . '" target="_blank">' . esc_html__( 'Support', 'ultimate-post' ) . '</a>',
60 );
61 $links = array_merge( $links, $new_links );
62 }
63 return $links;
64 }
65
66 /**
67 * Adds quick action links below the plugin name.
68 *
69 * @param array $links Default plugin action links.
70 * @return array Modified plugin action links.
71 */
72 public function plugin_action_links_callback( $links ) {
73 $offer_config = array(
74 array(
75 'start' => '2026-02-19 00:00 Asia/Dhaka',
76 'end' => '2026-02-23 23:59 Asia/Dhaka',
77 'text' => __(
78 'Flash Sale - Up to 45% OFF',
79 'ultimate-post'
80 ),
81 'utmKey' => 'flash_sale_meta',
82 ),
83 array(
84 'start' => '2026-03-16 00:00 Asia/Dhaka',
85 'end' => '2026-04-14 23:59 Asia/Dhaka',
86 'text' => __(
87 'Spring Sale - Up to 50% OFF',
88 'ultimate-post'
89 ),
90 'utmKey' => 'spring_sale_meta',
91 ),
92
93 // Flash sale
94 array(
95 'start' => '2026-05-07 00:00 Asia/Dhaka',
96 'end' => '2026-05-21 23:59 Asia/Dhaka',
97 'text' => __(
98 'Flash Sale - Up to 45% OFF',
99 'ultimate-post'
100 ),
101 'utmKey' => 'flash_sale_meta',
102 ),
103
104 // Surprise Sale
105 array(
106 'start' => '2026-05-22 00:00 Asia/Dhaka',
107 'end' => '2026-06-01 23:59 Asia/Dhaka',
108 'text' => __(
109 'Surprise Sale - Up to 50% OFF',
110 'ultimate-post'
111 ),
112 'utmKey' => 'surprise_sale_meta',
113 ),
114
115 // Massive Sale
116 array(
117 'start' => '2026-06-02 00:00 Asia/Dhaka',
118 'end' => '2026-06-20 23:59 Asia/Dhaka',
119 'text' => __(
120 'Massive Sale - Up to 50% OFF',
121 'ultimate-post'
122 ),
123 'utmKey' => 'massive_sale_meta',
124 ),
125
126 // Final hours sale
127 array(
128 'start' => '2026-06-21 00:00 Asia/Dhaka',
129 'end' => '2026-06-30 23:59 Asia/Dhaka',
130 'text' => __(
131 'Final Hours Sale - Up to 50% OFF',
132 'ultimate-post'
133 ),
134 'utmKey' => 'final_hour_meta',
135 ),
136 );
137
138 $setting_link = array(
139 'ultp_options' => '<a href="' . esc_url( admin_url( 'admin.php?page=ultp-settings#startersites' ) ) . '">' . esc_html__( 'Starter Sites', 'ultimate-post' ) . '</a>',
140 );
141
142 $upgrade_link = array();
143
144 // Free user or expired license user.
145 if ( ! defined( 'ULTP_PRO_VER' ) || Xpo::is_lc_expired() ) {
146
147 $license_key = Xpo::get_lc_key() ?? '';
148
149 if ( Xpo::is_lc_expired() ) {
150 $text = esc_html__( 'Renew License', 'ultimate-post' );
151 $url = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key;
152 } else {
153
154 $text = esc_html__( 'Upgrade to Pro', 'ultimate-post' );
155 $url = Xpo::generate_utm_link();
156
157 foreach ( $offer_config as $offer ) {
158 $current_time = gmdate( 'U' );
159 $notice_start = gmdate( 'U', strtotime( $offer['start'] ) );
160 $notice_end = gmdate( 'U', strtotime( $offer['end'] ) );
161 if ( $current_time >= $notice_start && $current_time <= $notice_end ) {
162 $url = Xpo::generate_utm_link(
163 array(
164 'utmKey' => $offer['utmKey'],
165 )
166 );
167 $text = $offer['text'];
168 break;
169 }
170 }
171 }
172
173 $upgrade_link['ultp_pro'] = '<a style="color: #0062ff; font-weight: bold;" target="_blank" href="' . esc_url( $url ) . '">' . esc_html( $text ) . '</a>';
174 }
175
176 return array_merge( $setting_link, $links, $upgrade_link );
177 }
178
179
180 /**
181 * Add admin menu option page and submenus.
182 *
183 * @since v.1.0.0
184 * @return void No return value.
185 */
186 public static function menu_page_callback() {
187 $ultp_menu_icon = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA0OC4zIj4NCiAgPGRlZnM+DQogICAgPHN0eWxlPg0KICAgICAgLmNscy0xIHsNCiAgICAgICAgZmlsbDogI2E3YWFhZDsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICA8L2RlZnM+DQogIDx0aXRsZT5Qb3N0eCBJY29uIGNtcHJzc2QgU1ZHPC90aXRsZT4NCiAgPGc+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguODEsOXY4LjlIOC4xOUE2LjE5LDYuMTksMCwwLDAsMiwyMy43N2EzLjE2LDMuMTYsMCwwLDEtMi0yLjk0VjRBMy4xNiwzLjE2LDAsMCwxLDMuMTUuODVIMjBhMy4xOCwzLjE4LDAsMCwxLDMsMi4zMUE2LjIxLDYuMjEsMCwwLDAsMTguODEsOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDUsOVYyM0gzMS4xYTYuMjMsNi4yMywwLDAsMC00LjkzLTQuOTNBNS41NCw1LjU0LDAsMCwwLDI1LDE3Ljk0SDIxLjg1VjlBMy4xNSwzLjE1LDAsMCwxLDIzLjEzLDYuNWEzLjEyLDMuMTIsMCwwLDEsMS40My0uNThsLjA5LDBINDEuODNBMy4xNCwzLjE0LDAsMCwxLDQ1LDlaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjg1KSIvPg0KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUwLDI5LjE3VjQ2YTMuMTYsMy4xNiwwLDAsMS0zLjE1LDMuMTVIMzBhMy4xOCwzLjE4LDAsMCwxLTMtMi4zMUE2LjIyLDYuMjIsMCwwLDAsMzEuMjEsNDFWMjZINDYuODVhMy4zLDMuMywwLDAsMSwxLjE0LjIxQTMuMTYsMy4xNiwwLDAsMSw1MCwyOS4xN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjguMTYsMjQuMTNWNDFhMy4xMywzLjEzLDAsMCwxLTEuMjksMi41NCwzLDMsMCwwLDEtMS40Ny41OGwwLDBIOC4xOUEzLjE1LDMuMTUsMCwwLDEsNSw0MVYyNGEzLjE3LDMuMTcsMCwwLDEsMy4xNS0zSDI1YTMuMTIsMy4xMiwwLDAsMSwxLjE0LjIyLDMuMjQsMy4yNCwwLDAsMSwxLjksMi4xQTMuNjMsMy42MywwLDAsMSwyOC4xNiwyNC4xM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTAuODUpIi8+DQogIDwvZz4NCjwvc3ZnPg0K';
188 $menupage_cap = apply_filters( 'ultp_menu_page_capability', 'manage_options' );
189 add_menu_page(
190 __( 'PostX', 'ultimate-post' ),
191 __( 'PostX', 'ultimate-post' ),
192 $menupage_cap,
193 'ultp-settings',
194 array( self::class, 'ultp_dashboard' ),
195 $ultp_menu_icon,
196 58.5
197 );
198
199 add_submenu_page(
200 'ultp-settings',
201 __( 'PostX Dashboard', 'ultimate-post' ),
202 __( 'Getting Started', 'ultimate-post' ),
203 $menupage_cap,
204 'ultp-settings'
205 );
206
207 $menu_lists = array(
208 'startersites' => esc_html__( 'Starter Sites', 'ultimate-post' ),
209 'builder' => esc_html__( 'Site Builder', 'ultimate-post' ),
210 'saved-templates' => esc_html__( 'Saved Templates', 'ultimate-post' ),
211 'custom-font' => esc_html__( 'Custom Font', 'ultimate-post' ),
212 'addons' => esc_html__( 'Add-ons', 'ultimate-post' ),
213 'blocks' => esc_html__( 'Blocks', 'ultimate-post' ),
214 'settings' => esc_html__( 'Settings', 'ultimate-post' ),
215 );
216 if ( defined( 'ULTP_PRO_VER' ) ) {
217 $menu_lists['license'] = esc_html__( 'License ', 'ultimate-post' );
218 }
219
220 foreach ( $menu_lists as $key => $val ) {
221 add_submenu_page(
222 'ultp-settings',
223 $val,
224 $val,
225 $menupage_cap,
226 'ultp-settings#' . $key,
227 array( __CLASS__, 'render_main' )
228 );
229 }
230 add_submenu_page(
231 'ultp-settings',
232 esc_html__( 'Initial Setup', 'ultimate-post' ),
233 esc_html__( 'Initial Setup', 'ultimate-post' ),
234 $menupage_cap,
235 'ultp-setup-wizard',
236 array( __CLASS__, 'ultp_wizard_page' )
237 );
238
239 $pro_link = '';
240 $pro_link_text = '';
241
242 // Check if current date is between November 5th and December 10th
243 $current_date = current_time( 'Y-m-d' );
244 $start_date = date( 'Y' ) . '-01-01'; // January 1st of current year
245 $end_date = date( 'Y' ) . '-02-15'; // February 15th of current year
246 $menu_pro_text_period = ( $current_date >= $start_date && $current_date <= $end_date );
247
248 if ( ! Xpo::is_lc_active() ) {
249 $pro_link = Xpo::generate_utm_link(
250 array(
251 'utmKey' => 'sub_menu',
252 )
253 );
254 $pro_link_text = $menu_pro_text_period ? __( 'New Year Offer!', 'ultimate-post' ) : __( 'Upgrade to Pro', 'ultimate-post' );
255 } elseif ( Xpo::is_lc_expired() ) {
256 $license_key = Xpo::get_lc_key();
257 $pro_link = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key;
258 $pro_link_text = __( 'Renew License', 'ultimate-post' );
259 }
260
261 if ( ! empty( $pro_link ) ) {
262 ob_start();
263 ?>
264 <a href="<?php echo esc_url( $pro_link ); ?>" target="_blank" class="ultp-go-pro">
265 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
266 <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>
267 </svg>
268 <span><?php echo esc_html( $pro_link_text ); ?></span>
269 </a>
270 <?php
271 $submenu_content = ob_get_clean();
272
273 add_submenu_page(
274 'ultp-settings',
275 '',
276 $submenu_content,
277 'manage_options',
278 'ultp-pro',
279 array( self::class, 'handle_external_redirects' )
280 );
281 }
282
283 add_theme_page(
284 __( 'Starter Sites', 'ultimate-post' ),
285 __( 'Starter Sites', 'ultimate-post' ),
286 $menupage_cap,
287 'ultp-startersites',
288 array( self::class, 'handle_external_redirects' )
289 );
290 }
291
292 /**
293 * Handle external redirects for menu and pro links.
294 *
295 * @since v.1.0.0
296 * @return void No return value.
297 */
298 public function handle_external_redirects() {
299 if (empty($_GET['page'])) { // @codingStandardsIgnoreLine
300 return;
301 }
302 $_page = sanitize_key( $_GET['page'] );
303 if ('ultp-startersites' === $_page) { // @codingStandardsIgnoreLine
304 exit( wp_safe_redirect( admin_url( 'admin.php?page=ultp-settings#startersites' ) ) );
305 } else if ('go_postx_pro' === $_page) { // @codingStandardsIgnoreLine
306 wp_redirect(
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