PluginProbe
Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets / 4.0.9
Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets v4.0.9
4.5.4 4.2.1 4.2.2 4.2.3 4.5.0 4.5.2 4.5.3 4.2.0 4.1.18 4.1.17 4.1.16 4.1.15 4.1.14 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.0.9 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 All 146 releases
ultimate-post-kit / admin / admin-biggopti.php

admin-biggopti.php in Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets 4.0.9, at admin/admin-biggopti.php

521 lines 15.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace UltimatePostKit;
4
5 /**
6 * Biggopties class
7 */
8 class Biggopties {
9
10 private static $biggopties = [];
11
12 private static $instance;
13
14 public static function get_instance() {
15 if (!isset(self::$instance)) {
16 self::$instance = new self;
17 }
18 return self::$instance;
19 }
20
21 public function __construct() {
22
23 // add_action('admin_notices', [$this, 'show_biggopties']);
24 add_action('wp_ajax_ultimate-post-kit-biggopties', [$this, 'dismiss']);
25
26 // AJAX endpoint to fetch API biggopties on demand (after page load)
27 add_action('wp_ajax_upk_fetch_api_biggopties', [$this, 'ajax_fetch_api_biggopties']);
28
29 }
30
31 /**
32 * Get Remote Biggopties Data from API
33 *
34 * @return array|mixed
35 */
36 private function get_api_biggopties_data() {
37
38 // 6-hour transient cache for API response
39 $transient_key = 'bdt_api_biggopties';
40 $cached = get_transient($transient_key);
41 if ($cached !== false && is_array($cached)) {
42 return $cached;
43 }
44
45 // API endpoint for biggopties - you can change this to your actual endpoint
46 $api_url = 'https://store.bdthemes.com/api/notices/api-data-records';
47
48 $response = wp_remote_get($api_url, [
49 'timeout' => 30,
50 'headers' => [
51 'Accept' => 'application/json',
52 'X-ALLOW-KEY' => 'bdthemes',
53 ],
54 ]);
55
56 if (is_wp_error($response)) {
57 return [];
58 }
59
60 $response_code = wp_remote_retrieve_response_code($response);
61
62 $response_body = wp_remote_retrieve_body($response);
63
64 $biggopties = json_decode($response_body);
65
66 if( isset($biggopties->api) && isset($biggopties->api->{'ultimate-post-kit'}) ) {
67 $data = $biggopties->api->{'ultimate-post-kit'};
68 if (is_array($data)) {
69 $ttl = apply_filters('bdt_api_biggopties_cache_ttl', 6 * HOUR_IN_SECONDS);
70 set_transient($transient_key, $data, $ttl);
71 return $data;
72 }
73 }
74
75 return [];
76 }
77
78 /**
79 * Check if a biggopti should be shown based on its enabled status and date range.
80 *
81 * @param object $biggopti The biggopti data from the API.
82 * @return bool True if the biggopti should be shown, false otherwise.
83 */
84 private function should_show_biggopti($biggopti) {
85 // Development override - set to true to bypass date checks for testing
86 $development_mode = false; // Set to true to bypass date checks
87
88 if ($development_mode) {
89 return true;
90 }
91
92 // Check if the biggopti is enabled
93 if (!isset($biggopti->is_enabled) || !$biggopti->is_enabled) {
94 return false;
95 }
96
97 // Check plugin compatibility
98 if (!$this->is_biggopti_compatible_with_plugin($biggopti)) {
99 return false;
100 }
101
102 // Check if the biggopti has a start date and end date
103 if (!isset($biggopti->start_date) || !isset($biggopti->end_date)) {
104 return false;
105 }
106
107 // Get timezone from biggopti or default to UTC
108 $timezone = isset($biggopti->timezone) ? $biggopti->timezone : 'UTC';
109
110 // Create DateTime objects with proper timezone (using global namespace)
111 $start_date = new \DateTime($biggopti->start_date, new \DateTimeZone($timezone));
112 $end_date = new \DateTime($biggopti->end_date, new \DateTimeZone($timezone));
113 $current_date = new \DateTime('now', new \DateTimeZone($timezone));
114
115 // Convert to timestamps for comparison
116 $start_timestamp = $start_date->getTimestamp();
117 $end_timestamp = $end_date->getTimestamp();
118 $current_timestamp = $current_date->getTimestamp();
119
120 // Check if the current date is within the start and end dates
121 if ($current_timestamp < $start_timestamp || $current_timestamp > $end_timestamp) {
122 return false;
123 }
124
125 // Check if biggopti should be visible after a certain time
126 if (isset($biggopti->visible_after) && $biggopti->visible_after > 0) {
127 $visible_after_timestamp = $start_timestamp + $biggopti->visible_after;
128 if ($current_timestamp < $visible_after_timestamp) {
129 return false;
130 }
131 }
132
133 return true;
134 }
135
136 /**
137 * Check if a biggopti is compatible with the current plugin installation
138 *
139 * @param object $biggopti The biggopti data from the API.
140 * @return bool True if the biggopti should be shown, false otherwise.
141 */
142 private function is_biggopti_compatible_with_plugin($biggopti) {
143 // Get current plugin info
144 $current_plugin_slug = $this->get_current_plugin_slug();
145 $is_pro_active = function_exists('_is_upk_pro_activated') ? _is_upk_pro_activated() : false;
146 $is_lite_active = $current_plugin_slug === 'ultimate-post-kit';
147 $is_pro_plugin = $current_plugin_slug === 'ultimate-post-kit-pro';
148
149 // Get client targets, default to ['both'] if not set or not an array
150 $client_targets = (isset($biggopti->client_targets) && is_array($biggopti->client_targets))
151 ? $biggopti->client_targets
152 : ['both'];
153
154 // Determine if this is targeted at Pro users
155 $pro_targeted = in_array('pro', $client_targets, true);
156
157 // Ensure client_targets is always an array
158 if (!is_array($client_targets)) {
159 $client_targets = [$client_targets];
160 }
161
162 // Handle pro_targeted parameter (only for free version)
163 if ($pro_targeted && $is_lite_active) {
164 // If pro_targeted is true, only show if pro is NOT active
165 $should_show = !$is_pro_active;
166 return $should_show;
167 }
168
169 // Check if any of the client targets match current plugin status
170 foreach ($client_targets as $target) {
171 $target = trim($target); // Clean up any whitespace
172
173 switch ($target) {
174 case 'pro':
175 // Pro-only biggopties: show only if pro is active
176 if ($is_pro_active) {
177 return true;
178 }
179 break;
180
181 case 'free':
182 if ($is_lite_active) {
183 return true;
184 }
185 break;
186 }
187 }
188
189 return false;
190 }
191
192 /**
193 * Get current plugin slug
194 *
195 * @return string
196 */
197 private function get_current_plugin_slug() {
198 // Get plugin basename from current file
199 $plugin_file = plugin_basename(BDTUPK__FILE__);
200
201 // Extract plugin slug from basename
202 $plugin_slug = dirname($plugin_file);
203
204 return $plugin_slug;
205 }
206
207 /**
208 * Render API biggopti HTML
209 *
210 * @param object $biggopti
211 * @return string
212 */
213 private function render_api_biggopti($biggopti) {
214 ob_start();
215
216 // Add custom CSS if provided
217 if (isset($biggopti->custom_css) && !empty($biggopti->custom_css)) {
218 echo '<style>' . wp_kses_post($biggopti->custom_css) . '</style>';
219 }
220
221 // Prepare background styles
222 $background_style = '';
223 $wrapper_classes = 'bdt-biggopti-wrapper';
224
225 if (isset($biggopti->background_color) && !empty($biggopti->background_color)) {
226 $background_style .= 'background-color: ' . esc_attr($biggopti->background_color) . ';';
227 }
228
229 if (isset($biggopti->image) && !empty($biggopti->image)) {
230 $background_style .= 'background-image: url(' . esc_url($biggopti->image) . ');';
231 $wrapper_classes .= ' has-background-image';
232 }
233
234 ?>
235 <div class="<?php echo esc_attr($wrapper_classes); ?>" <?php echo $background_style ? 'style="' . $background_style . '"' : ''; ?>>
236
237
238 <?php $title = (isset($biggopti->title) && !empty($biggopti->title)) ? $biggopti->title : ''; ?>
239
240 <div class="bdt-api-biggopti-content">
241 <div class="bdt-plugin-logo-wrapper">
242 <img height="auto" width="40" src="<?php echo esc_url(BDTUPK_ASSETS_URL); ?>images/logo.svg" alt="Ultimate Post Kit Logo">
243 </div>
244
245 <div class="bdt-biggopti-content">
246 <div class="bdt-biggopti-content-inner">
247 <?php if (isset($biggopti->logo) && !empty($biggopti->logo)) : ?>
248 <div class="bdt-biggopti-logo-wrapper">
249 <img width="100" src="<?php echo esc_url($biggopti->logo); ?>" alt="Logo">
250 </div>
251 <?php endif; ?>
252 <div class="bdt-biggopti-title-description">
253 <?php if (isset($title) && !empty($title)) : ?>
254 <h2 class="bdt-biggopti-title"><?php echo wp_kses_post($title); ?></h2>
255 <?php endif; ?>
256
257 <?php if (isset($biggopti->content) && !empty($biggopti->content)) : ?>
258 <div class="bdt-biggopti-html-content">
259 <?php echo wp_kses_post($biggopti->content); ?>
260 </div>
261 <?php endif; ?>
262 </div>
263 </div>
264
265 <div class="bdt-biggopti-content-right">
266 <?php
267 // Only show countdown if it's enabled, has an end date, and the end date is in the future
268 $show_countdown = isset($biggopti->show_countdown) && $biggopti->show_countdown && isset($biggopti->end_date);
269 if ($show_countdown) {
270 $end_timestamp = strtotime($biggopti->end_date);
271 $current_timestamp = current_time('timestamp');
272 $show_countdown = $end_timestamp > $current_timestamp;
273 }
274 ?>
275 <?php if ($show_countdown) : ?>
276 <div class="bdt-biggopti-countdown" data-end-date="<?php echo esc_attr($biggopti->end_date); ?>" data-timezone="<?php echo esc_attr($biggopti->timezone ? $biggopti->timezone : 'UTC'); ?>">
277 <div class="countdown-timer">Loading...</div>
278 </div>
279 <?php endif; ?>
280
281 <?php if (isset($biggopti->link) && !empty($biggopti->link)) : ?>
282 <div class="bdt-biggopti-btn">
283 <a href="<?php echo esc_url($biggopti->link); ?>" target="_blank">
284 <div class="nm-biggopti-btn">
285 <?php echo isset($biggopti->button_text) ? esc_html($biggopti->button_text) : 'Read More'; ?>
286 <span class="dashicons dashicons-arrow-right-alt"></span>
287 </div>
288 </a>
289 </div>
290 <?php endif; ?>
291 </div>
292 </div>
293 </div>
294 </div>
295 <?php
296 return ob_get_clean();
297 }
298
299 public static function add_biggopti($args = []) {
300 if (is_array($args)) {
301 self::$biggopties[] = $args;
302 }
303 }
304
305 /**
306 * AJAX: Build and return API biggopties HTML for dynamic injection
307 */
308 public function ajax_fetch_api_biggopties() {
309 $nonce = isset($_POST['_wpnonce']) ? sanitize_text_field($_POST['_wpnonce']) : '';
310 if (!wp_verify_nonce($nonce, 'ultimate-post-kit')) {
311 wp_send_json_error([ 'message' => 'invalid_nonce' ]);
312 }
313
314 if (!current_user_can('manage_options')) {
315 wp_send_json_error([ 'message' => 'forbidden' ]);
316 }
317
318 $biggopties = $this->get_api_biggopties_data();
319 $grouped_biggopties = [];
320
321 if (is_array($biggopties)) {
322 foreach ($biggopties as $index => $biggopti) {
323 if ($this->should_show_biggopti($biggopti)) {
324 $notice_class = isset($biggopti->notice_class) ? $biggopti->notice_class : 'default-' . $index;
325 if (!isset($grouped_biggopties[$notice_class])) {
326 $grouped_biggopties[$notice_class] = $biggopti;
327 }
328 }
329 }
330 }
331
332 // Build biggopties using the same pipeline as synchronous rendering
333 foreach ($grouped_biggopties as $notice_class => $biggopti) {
334 $biggopti_id = isset($biggopti->id) ? $notice_class : $biggopti->id;
335
336 self::add_biggopti([
337 'id' => 'api-biggopti-' . $biggopti_id,
338 'type' => isset($biggopti->type) ? $biggopti->type : 'info',
339 'category' => isset($biggopti->category) ? $biggopti->category : 'regular',
340 'dismissible' => true,
341 'html_message' => $this->render_api_biggopti($biggopti),
342 'dismissible-meta' => 'transient',
343 'dismissible-time' => isset($biggopti->end_date) ? max((new \DateTime($biggopti->end_date, new \DateTimeZone('UTC')))->getTimestamp() - time(), 0) : WEEK_IN_SECONDS,
344 ]);
345 }
346
347 ob_start();
348 $this->show_biggopties();
349 $markup = ob_get_clean();
350
351 wp_send_json_success([ 'html' => $markup ]);
352 }
353
354 /**
355 * Dismiss Biggopti.
356 */
357 public function dismiss() {
358 $nonce = (isset($_POST['_wpnonce'])) ? sanitize_text_field($_POST['_wpnonce']) : '';
359 $id = (isset($_POST['id'])) ? esc_attr($_POST['id']) : '';
360 $time = (isset($_POST['time'])) ? esc_attr($_POST['time']) : '';
361 $meta = (isset($_POST['meta'])) ? esc_attr($_POST['meta']) : '';
362
363 if ( ! wp_verify_nonce($nonce, 'ultimate-post-kit') ) {
364 wp_send_json_error();
365 }
366
367 if ( ! current_user_can('manage_options') ) {
368 wp_send_json_error();
369 }
370
371 /**
372 * Valid inputs?
373 */
374 if (!empty($id)) {
375 // Handle regular biggopties
376 if ('user' === $meta) {
377 update_user_meta(get_current_user_id(), $id, true);
378 } else {
379 set_transient($id, true, $time);
380 }
381
382 wp_send_json_success();
383 }
384
385 wp_send_json_error();
386 }
387
388 /**
389 * Biggopti Types
390 */
391 public function show_biggopties() {
392
393 $defaults = [
394 'id' => '',
395 'type' => 'info',
396 'category' => 'regular',
397 'show_if' => true,
398 'title' => '',
399 'message' => '',
400 'class' => 'ultimate-post-kit-biggopti',
401 'dismissible' => false,
402 'dismissible-meta' => 'transient',
403 'dismissible-time' => WEEK_IN_SECONDS,
404 'data' => '',
405 'action_link' => '',
406 ];
407
408 foreach (self::$biggopties as $key => $biggopti) {
409
410 $biggopti = wp_parse_args($biggopti, $defaults);
411
412 // Check if biggopti is for White Label
413 if (defined('BDTUPK_WL') && $biggopti['category'] === 'regular') {
414 continue;
415 }
416
417 $classes = ['biggopti'];
418
419 $classes[] = $biggopti['class'];
420 if (isset($biggopti['type'])) {
421 $classes[] = 'biggopti-' . $biggopti['type'];
422 }
423
424 // Is biggopti dismissible?
425 if (true === $biggopti['dismissible']) {
426 $classes[] = 'is-dismissible';
427
428 // Dismissable time.
429 $biggopti['data'] = ' dismissible-time=' . esc_attr($biggopti['dismissible-time']) . ' ';
430 }
431
432 // Biggopti ID.
433 $biggopti_id = 'bdt-admin-biggopti-' . $biggopti['id'];
434 $biggopti['id'] = $biggopti_id;
435 if (!isset($biggopti['id'])) {
436 $biggopti_id = 'bdt-admin-biggopti-' . $biggopti['id'];
437 $biggopti['id'] = $biggopti_id;
438 } else {
439 $biggopti_id = $biggopti['id'];
440 }
441
442 $biggopti['classes'] = implode(' ', $classes);
443
444 // User meta.
445 $biggopti['data'] .= ' dismissible-meta=' . esc_attr($biggopti['dismissible-meta']) . ' ';
446 if ('user' === $biggopti['dismissible-meta']) {
447 $expired = get_user_meta(get_current_user_id(), $biggopti_id, true);
448 } elseif ('transient' === $biggopti['dismissible-meta']) {
449 $expired = get_transient($biggopti_id);
450 }
451
452 // Biggopties visible after transient expire.
453 if (isset($biggopti['show_if'])) {
454
455 if (true === $biggopti['show_if']) {
456
457 // Is transient expired?
458 if (false === $expired || empty($expired)) {
459 self::biggopti_layout($biggopti);
460 }
461 }
462 } else {
463
464 // No transient biggopties.
465 self::biggopti_layout($biggopti);
466 }
467 }
468 }
469
470 /**
471 * New Biggopti Layout
472 * @param array $biggopti Biggopti biggopti_layout.
473 * @return void
474 * @since 6.11.3
475 */
476
477 public static function biggopti_layout($biggopti = []) {
478
479 if( isset($biggopti['html_message']) && ! empty($biggopti['html_message']) ) {
480 self::new_biggopti_layout($biggopti);
481 return;
482 }
483
484 ?>
485 <div id="<?php echo esc_attr($biggopti['id']); ?>" class="<?php echo esc_attr($biggopti['classes']); ?>" <?php echo esc_attr($biggopti['data']); ?>>
486 <div class="bdt-biggopti-wrapper">
487 <div class="bdt-biggopti-icon-wrapper">
488 <img height="25" width="25" src="<?php echo esc_url (BDTUPK_ASSETS_URL ); ?>images/logo.svg">
489 </div>
490
491 <div class="bdt-biggopti-content">
492 <?php if (isset($biggopti['title']) && !empty($biggopti['title'])) : ?>
493 <h2 class="bdt-biggopti-title"><?php echo wp_kses_post($biggopti['title']); ?></h2>
494 <?php endif; ?>
495
496 <p class="bdt-biggopti-text"><?php echo wp_kses_post($biggopti['message']); ?></p>
497
498 <?php if (isset($biggopti['action_link']) && !empty($biggopti['action_link'])) : ?>
499 <div class="bdt-biggopti-btn">
500 <a href="#">Renew Now</a>
501 </div>
502 <?php endif; ?>
503 </div>
504 </div>
505 </div>
506 <?php
507 }
508
509 public static function new_biggopti_layout( $biggopti = [] ) {
510 ?>
511 <div id="<?php echo esc_attr( $biggopti['id'] ); ?>" class="<?php echo esc_attr( $biggopti['classes'] ); ?>" <?php echo esc_attr( $biggopti['data'] ); ?>>
512 <?php
513 echo wp_kses_post( $biggopti['html_message'] );
514 ?>
515 </div>
516
517 <?php
518 }
519 }
520
521 Biggopties::get_instance();