PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 1.0.3
Page Builder: Pagelayer – Drag and Drop website builder v1.0.3
2.2.1 2.2.0 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 trunk 0.9.0 0.9.1 0.9.2 0.9.3 0.9.4 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.0.2 1.0.3 1.0.4 1.0.5 All 129 releases
pagelayer / main / functions.php

functions.php in Page Builder: Pagelayer – Drag and Drop website builder 1.0.3, at main/functions.php

1,657 lines 41.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 //////////////////////////////////////////////////////////////
4 //===========================================================
5 // class.php
6 //===========================================================
7 // PAGELAYER
8 // Inspired by the DESIRE to be the BEST OF ALL
9 // ----------------------------------------------------------
10 // Started by: Pulkit Gupta
11 // Date: 23rd Jan 2017
12 // Time: 23:00 hrs
13 // Site: http://pagelayer.com/wordpress (PAGELAYER)
14 // ----------------------------------------------------------
15 // Please Read the Terms of use at http://pagelayer.com/tos
16 // ----------------------------------------------------------
17 //===========================================================
18 // (c)Pagelayer Team
19 //===========================================================
20 //////////////////////////////////////////////////////////////
21
22 // Are we being accessed directly ?
23 if(!defined('PAGELAYER_VERSION')) {
24 exit('Hacking Attempt !');
25 }
26
27 // Get the client IP
28 function _pagelayer_getip(){
29 if(isset($_SERVER["REMOTE_ADDR"])){
30 return $_SERVER["REMOTE_ADDR"];
31 }elseif(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
32 return $_SERVER["HTTP_X_FORWARDED_FOR"];
33 }elseif(isset($_SERVER["HTTP_CLIENT_IP"])){
34 return $_SERVER["HTTP_CLIENT_IP"];
35 }
36 }
37
38 // Get the client IP
39 function pagelayer_getip(){
40
41 global $pagelayer;
42
43 // Just so that we have something
44 $ip = _pagelayer_getip();
45
46 $pagelayer['ip_method'] = (int) @$pagelayer['ip_method'];
47
48 if(isset($_SERVER["REMOTE_ADDR"])){
49 $ip = $_SERVER["REMOTE_ADDR"];
50 }
51
52 if(isset($_SERVER["HTTP_X_FORWARDED_FOR"]) && @$pagelayer['ip_method'] == 1){
53 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
54 }
55
56 if(isset($_SERVER["HTTP_CLIENT_IP"]) && @$pagelayer['ip_method'] == 2){
57 $ip = $_SERVER["HTTP_CLIENT_IP"];
58 }
59
60 // Hacking fix for X-Forwarded-For
61 if(!pagelayer_valid_ip($ip)){
62 return '';
63 }
64
65 return $ip;
66
67 }
68
69 // Execute a select query and return an array
70 function pagelayer_selectquery($query, $array = 0){
71 global $wpdb;
72
73 $result = $wpdb->get_results($query, 'ARRAY_A');
74
75 if(empty($array)){
76 return current($result);
77 }else{
78 return $result;
79 }
80 }
81
82 // Check if an IP is valid
83 function pagelayer_valid_ip($ip){
84
85 // IPv6
86 if(pagelayer_valid_ipv6($ip)){
87 return true;
88 }
89
90 // IPv4
91 if(!ip2long($ip)){
92 return false;
93 }
94
95 return true;
96 }
97
98 function pagelayer_valid_ipv6($ip){
99
100 $pattern = '/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/';
101
102 if(!preg_match($pattern, $ip)){
103 return false;
104 }
105
106 return true;
107
108 }
109
110 // Check if a field is posted via POST else return default value
111 function pagelayer_optpost($name, $default = ''){
112
113 if(!empty($_POST[$name])){
114 return pagelayer_inputsec(pagelayer_htmlizer(trim($_POST[$name])));
115 }
116
117 return $default;
118 }
119
120 // Check if a field is posted via GET else return default value
121 function pagelayer_optget($name, $default = ''){
122
123 if(!empty($_GET[$name])){
124 return pagelayer_inputsec(pagelayer_htmlizer(trim($_GET[$name])));
125 }
126
127 return $default;
128 }
129
130 // Check if a field is posted via GET or POST else return default value
131 function pagelayer_optreq($name, $default = ''){
132
133 if(!empty($_REQUEST[$name])){
134 return pagelayer_inputsec(pagelayer_htmlizer(trim($_REQUEST[$name])));
135 }
136
137 return $default;
138 }
139
140 // For filling in posted values
141 function pagelayer_POSTval($name, $default = ''){
142
143 return (!empty($_POST) ? (!isset($_POST[$name]) ? '' : $_POST[$name]) : $default);
144
145 }
146
147 function pagelayer_POSTchecked($name, $default = false){
148
149 return (!empty($_POST) ? (isset($_POST[$name]) ? 'checked="checked"' : '') : (!empty($default) ? 'checked="checked"' : ''));
150
151 }
152
153 function pagelayer_POSTselect($name, $value, $default = false){
154
155 if(empty($_POST)){
156 if(!empty($default)){
157 return 'selected="selected"';
158 }
159 }else{
160 if(isset($_POST[$name])){
161 if(trim($_POST[$name]) == $value){
162 return 'selected="selected"';
163 }
164 }
165 }
166
167 }
168
169 function pagelayer_inputsec($string){
170
171 if(!get_magic_quotes_gpc()){
172
173 $string = addslashes($string);
174
175 }else{
176
177 $string = stripslashes($string);
178 $string = addslashes($string);
179
180 }
181
182 // This is to replace ` which can cause the command to be executed in exec()
183 $string = str_replace('`', '\`', $string);
184
185 return $string;
186
187 }
188
189 function pagelayer_htmlizer($string){
190
191 $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
192
193 preg_match_all('/(&amp;#(\d{1,7}|x[0-9a-fA-F]{1,6});)/', $string, $matches);//r_print($matches);
194
195 foreach($matches[1] as $mk => $mv){
196 $tmp_m = pagelayer_entity_check($matches[2][$mk]);
197 $string = str_replace($matches[1][$mk], $tmp_m, $string);
198 }
199
200 return $string;
201
202 }
203
204 function pagelayer_entity_check($string){
205
206 //Convert Hexadecimal to Decimal
207 $num = ((substr($string, 0, 1) === 'x') ? hexdec(substr($string, 1)) : (int) $string);
208
209 //Squares and Spaces - return nothing
210 $string = (($num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num < 0x20) ? '' : '&#'.$num.';');
211
212 return $string;
213
214 }
215
216 // Check if a checkbox is selected
217 function pagelayer_is_checked($post){
218
219 if(!empty($_POST[$post])){
220 return true;
221 }
222 return false;
223 }
224
225 // Reoort an error
226 function pagelayer_report_error($error = array()){
227
228 if(empty($error)){
229 return true;
230 }
231
232 $error_string = '<b>Please fix the below error(s) :</b> <br />';
233
234 foreach($error as $ek => $ev){
235 $error_string .= '* '.$ev.'<br />';
236 }
237
238 echo '<div id="message" class="error"><p>'
239 . __pl($error_string)
240 . '</p></div>';
241 }
242
243 // Report a notice
244 function pagelayer_report_notice($notice = array()){
245
246 global $wp_version;
247
248 if(empty($notice)){
249 return true;
250 }
251
252 // Which class do we have to use ?
253 if(version_compare($wp_version, '3.8', '<')){
254 $notice_class = 'updated';
255 }else{
256 $notice_class = 'updated';
257 }
258
259 $notice_string = '<b>Please check the below notice(s) :</b> <br />';
260
261 foreach($notice as $ek => $ev){
262 $notice_string .= '* '.$ev.'<br />';
263 }
264
265 echo '<div id="message" class="'.$notice_class.'"><p>'
266 . __pl($notice_string)
267 . '</p></div>';
268 }
269
270 // Convert an objext to array
271 function pagelayer_objectToArray($d){
272
273 if(is_object($d)){
274 $d = get_object_vars($d);
275 }
276
277 if(is_array($d)){
278 return array_map(__FUNCTION__, $d); // recursive
279 }elseif(is_object($d)){
280 return pagelayer_objectToArray($d);
281 }else{
282 return $d;
283 }
284 }
285
286 // Sanitize variables
287 function pagelayer_sanitize_variables($variables = array()){
288
289 if(is_array($variables)){
290 foreach($variables as $k => $v){
291 $variables[$k] = trim($v);
292 $variables[$k] = escapeshellcmd($v);
293 }
294 }else{
295 $variables = escapeshellcmd(trim($variables));
296 }
297
298 return $variables;
299 }
300
301 // Is multisite ?
302 function pagelayer_is_multisite() {
303
304 if(function_exists('get_site_option') && function_exists('is_multisite') && is_multisite()){
305 return true;
306 }
307
308 return false;
309 }
310
311 // Generate a random string
312 function pagelayer_RandomString($length = 10){
313 $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
314 $charactersLength = strlen($characters);
315 $randomString = '';
316 for($i = 0; $i < $length; $i++){
317 $randomString .= $characters[rand(0, $charactersLength - 1)];
318 }
319 return $randomString;
320 }
321
322 function pagelayer_print($array){
323
324 echo '<pre>';
325 print_r($array);
326 echo '</pre>';
327
328 }
329
330 function pagelayer_cleanpath($path){
331 $path = str_replace('\\\\', '/', $path);
332 $path = str_replace('\\', '/', $path);
333 $path = str_replace('//', '/', $path);
334 return rtrim($path, '/');
335 }
336
337 // Returns the Numeric Value of results Per Page
338 function pagelayer_get_page($get = 'page', $resperpage = 50){
339
340 $resperpage = (!empty($_REQUEST['reslen']) && is_numeric($_REQUEST['reslen']) ? (int) pagelayer_optreq('reslen') : $resperpage);
341
342 if(pagelayer_optget($get)){
343 $pg = (int) pagelayer_optget($get);
344 $pg = $pg - 1;
345 $page = ($pg * $resperpage);
346 $page = ($page <= 0 ? 0 : $page);
347 }else{
348 $page = 0;
349 }
350 return $page;
351 }
352
353 // Are we editing from the Admin panel ?
354 function pagelayer_is_editing($force = false){
355
356 global $post, $pagelayer;
357
358 if(!empty($force)){
359 return true;
360 }
361
362 if(!is_admin()){
363 return false;
364 }
365
366 $current_file = basename($_SERVER['PHP_SELF']);
367
368 $type = get_post_type();
369 //echo $type;return false;
370 //$page = pagelayer_optreq('page');
371
372 // Are we in the live editor mode OR is this a post which is supported
373 if((pagelayer_supported_type($type) && in_array($current_file, array('post.php', 'post-new.php'))) || pagelayer_is_live()){
374 return true;
375 }else{
376 return false;
377 }
378
379 }
380
381 // Is the given post type editable by us ?
382 function pagelayer_supported_type($type){
383
384 global $pagelayer;
385
386 $type = trim($type);
387
388 if(in_array($type, $pagelayer->settings['post_types'])){
389 return true;
390 }
391
392 return false;
393
394 }
395
396 function pagelayer_shortlink($id){
397 $link = wp_get_shortlink($id);
398 $link .= substr_count($link, '?') > 0 ? '' : '?';
399 return $link;
400 }
401
402 // Pagelayer live link
403 function pagelayer_livelink($id){
404 return pagelayer_shortlink($id).'&pagelayer-live=1';
405 }
406
407 // Are we in live mode ?
408 function pagelayer_is_live(){
409
410 global $post;
411
412 // Are we seeing the post ?
413 if(!isset($post) || !isset($post->ID) || empty($post->ID)){
414 return false;
415 }
416
417 // Is it the live mode ?
418 if(pagelayer_optreq('pagelayer-live')){
419 return true;
420 }
421
422 return false;
423
424 }
425
426 // Are we in live IFRAME mode ?
427 function pagelayer_is_live_iframe(){
428
429 // Are we seeing the post ?
430 if(!pagelayer_is_live()){
431 return false;
432 }
433
434 // Is it the live mode ?
435 if(pagelayer_optreq('pagelayer-iframe')){
436 return true;
437 }
438
439 return false;
440
441 }
442
443 // Can the current user edit the post ?
444 function pagelayer_user_can_edit($post = NULL){
445
446 global $wp_the_query, $current_user;
447
448 if(!isset($post) || empty($post) || $post === NULL){
449 global $post;
450 }
451
452 wp_get_current_user();
453
454 if(isset($post) && is_object($post) && isset($post->ID) && isset($post->post_author) && isset($current_user) && is_object($current_user) && isset($current_user->ID) && (current_user_can('edit_others_posts', $post->ID) || ($post->post_author == $current_user->ID))){
455 return true;
456 }
457
458 return false;
459
460 }
461
462 // Language sting function
463 function __pl($key){
464
465 global $pagelayer;
466
467 if(!empty($pagelayer->l[$key])){
468 return $pagelayer->l[$key];
469 }
470
471 return $key;
472
473 }
474
475 // Give the list of icon sources
476 function pagelayer_icon_sources(){
477 return array();
478 }
479
480 // Loads the shortcodes
481 function pagelayer_load_shortcodes(){
482
483 include_once(PAGELAYER_DIR.'/main/shortcode_functions.php');
484 if(defined('PAGELAYER_PREMIUM')){
485 include_once(PAGELAYER_DIR.'/main/premium_functions.php');
486 }
487 include_once(PAGELAYER_DIR.'/main/shortcodes.php');
488
489 // pQuery
490 include_once(PAGELAYER_DIR.'/lib/pquery/IQuery.php');
491 include_once(PAGELAYER_DIR.'/lib/pquery/gan_formatter.php');
492 include_once(PAGELAYER_DIR.'/lib/pquery/gan_node_html.php');
493 include_once(PAGELAYER_DIR.'/lib/pquery/gan_tokenizer.php');
494 include_once(PAGELAYER_DIR.'/lib/pquery/gan_parser_html.php');
495 include_once(PAGELAYER_DIR.'/lib/pquery/gan_selector_html.php');
496 include_once(PAGELAYER_DIR.'/lib/pquery/gan_xml2array.php');
497 include_once(PAGELAYER_DIR.'/lib/pquery/pQuery.php');
498
499 // Apply filter to load custom widgets
500 do_action('pagelayer_load_custom_widgets');
501
502 }
503
504 // Add the shortcodes to the pagelayer list
505 function pagelayer_add_shortcode($tag, $params = array()){
506
507 global $pagelayer;
508
509 // Is there a handler function ?
510 if(!empty($params['func'])){
511
512 if($tag == 'pl_row'){
513 $inner_tag = 'pl_inner_row';
514 add_shortcode($inner_tag, 'pagelayer_render_shortcode');
515 }
516
517 if($tag == 'pl_col'){
518 $inner_tag = 'pl_inner_col';
519 add_shortcode($inner_tag, 'pagelayer_render_shortcode');
520 }
521
522 add_shortcode($tag, 'pagelayer_render_shortcode');//$params['func']);
523 //unset($params['func']);
524 }
525
526 // Is there a group ?
527 if(empty($params['group'])){
528 $params['group'] = 'misc';
529 }
530
531 // Add the advanced styling group
532 $params['options'] = [
533 'ele_bg_styles' => __pl('ele_bg_styles'),
534 'ele_styles' => __pl('ele_styles'),
535 'border_styles' => __pl('border_styles'),
536 'position_styles' => __pl('position_styles'),
537 'animation_styles' => __pl('animation_styles'),
538 'responsive_styles' => __pl('responsive_styles'),
539 'custom_styles' => __pl('custom_styles'),
540 ];
541
542 if(!empty($params['skip_props_cat'])){
543 foreach($params['skip_props_cat'] as $k => $v){
544 unset($params['options'][$v]);
545 }
546 }
547
548 // Are the settings there which hold the params ?
549 if(empty($params['settings'])){
550 $params['settings'] = [
551 'params' => $params['name'],
552 ];
553 }
554
555 // Disable the style options
556 if(!empty($params['styles'])){
557 $params['settings'] = array_merge($params['settings'], $params['styles']);
558 unset($params['styles']);
559 }
560
561 /*// The following is for testing only
562 $r = [];
563 foreach($pagelayer->styles as $k => $v){
564 foreach($v as $kk => $vv){
565 $r[$kk] = $kk;
566 }
567 }
568 //print_r($r);die();
569
570 foreach($params['settings'] as $k => $v){
571 if(empty($params[$k])) continue;
572 foreach($params[$k] as $kk => $vv){
573 if(!empty($r[$kk])){
574 echo 'Duplicate KEY '.$kk.' in Shortcode '.$tag."<br>";
575 }
576 }
577 }
578 //die();*/
579
580 // Insert the shortcode
581 $pagelayer->shortcodes[$tag] = $params;
582 $pagelayer->groups[$params['group']][] = $tag;
583
584 }
585
586 // Returns the Image values
587 function pagelayer_image($id){
588
589 global $pagelayer;
590
591 $ret = [];
592
593 // External image ?
594 if(pagelayer_is_external_img($id)){
595
596 $ret['full-url'] = $id;
597
598 // Attachment
599 }elseif(!empty($id)){
600
601 $id = (int) @$id;
602
603 $image = get_post($id);
604
605 // Is there an attachment which is an image ?
606 if(!empty($image) && $image->post_type == 'attachment' && wp_attachment_is_image($id)){
607
608 // Need to export necessary media
609 if(!empty($pagelayer->export_mode)){
610 $pagelayer->media_to_export[] = $id;
611 }
612
613 $sizes = get_intermediate_image_sizes();
614 array_unshift($sizes, 'full');
615
616 foreach($sizes as $size){
617 $src = wp_get_attachment_image_src($id, $size);
618 $ret[$size.'-url'] = $src[0];
619 }
620
621 // Title and Alt
622 $title = esc_attr($image->post_title);
623 $alt = get_post_meta($id, '_wp_attachment_image_alt', true);
624 $alt = empty($alt) ? $image->post_excerpt : $alt;
625 $alt = empty($alt) ? $image->post_title : $alt;
626 $alt = empty($alt) ? '' : trim(strip_tags($alt));
627 $link = get_attachment_link($id);
628 $caption = wp_get_attachment_caption($id);
629 $caption = !empty($caption) ? $caption : '';
630
631 $ret['alt'] = $alt;
632 $ret['title'] = $title;
633 $ret['link'] = $link;
634 $ret['caption'] = $caption;
635
636 }
637
638 }
639
640 // No image
641 if(empty($ret['full-url'])){
642 $ret['full-url'] = PAGELAYER_URL.'/images/default-image.png';
643 }
644
645 $ret['url'] = $ret['full-url'];
646
647 $ret = apply_filters('pagelayer_image', $ret);
648
649 return $ret;
650
651 }
652
653 // Checks if the given parameter is an external link or a wp attachment id
654 function pagelayer_is_external_img($img = ''){
655
656 if(empty($img)){
657 return false;
658 }
659
660 if(preg_match('#http://#is', $img) || preg_match('#https://#is', $img) || preg_match('#^{{#is', $img)){
661 return true;
662 }
663
664 return false;
665
666 }
667
668 // Returns the attachment url
669 function pagelayer_attachment($id){
670
671 $ret = [];
672
673 // External url ?
674 if(pagelayer_is_external_img($id)){
675
676 $ret['url'] = $id;
677
678 // Attachment
679 }elseif(!empty($id)){
680
681 // Need to export necessary media
682 if(!empty($pagelayer->export_mode)){
683 $pagelayer->media_to_export[] = $id;
684 }
685
686 $ret['url'] = wp_get_attachment_url($id);
687
688 }
689
690 $ret = apply_filters('pagelayer_attachment', $ret);
691
692 return $ret;
693
694 }
695
696 // Convert the regular URL of a Video to a Embed URL
697 // Todo : Check
698 function pagelayer_video_url($source){
699
700 if (!empty($source)) {
701 $source = filter_var($source, FILTER_SANITIZE_URL);
702 $source = str_replace('&amp;', '&', $source);
703 $url = parse_url($source);
704 $videoSite ='';
705
706 $youtubeRegExp = '/youtube\.com|youtu\.be/is';
707 $vimeoRegExp = '/vimeo\.com/is';
708
709 if (preg_match($youtubeRegExp, $source)) {
710 $videoSite = 'youtube';
711 } else if (preg_match($vimeoRegExp, $source)) {
712 $videoSite = 'vimeo';
713 }
714
715 switch ($videoSite) {
716 case 'youtube':
717
718 if (preg_match('/youtube\.com/is', $source)) {
719
720 if (preg_match('/watch/is', $source)) {
721 parse_str($url['query'], $parameters);
722
723 if (isset($parameters['v']) && !empty($parameters['v'])) {
724 $videoId = $parameters['v'];
725 }
726
727 } else if (preg_match('/embed/is', $url['path'])) {
728 $path = explode('/', $url['path']);
729 if (isset($path[2]) && !empty($path[2])) {
730 $videoId = $path[2];
731 }
732 }
733
734 } else if (preg_match('/youtu\.be/is', $url['host'])) {
735 $path = explode('/', $url['path']);
736
737 if (isset($path[1]) && !empty($path[1])) {
738 $videoId = $path[1];
739 }
740
741 }
742
743 return '//youtube.com/embed/'.$videoId;
744
745 break;
746 case 'vimeo':
747
748 if (preg_match('/player\.vimeo\.com/is', $url['host']) && preg_match('/video/is', $url['path'])) {
749 $path = explode('/', $url['path']);
750
751 if (isset($path[2]) && !empty($path[2])) {
752 $videoId = $path[2];
753 }
754
755 } else if (preg_match('/vimeo\.com/is', $url['host'])) {
756 $path = explode('/', $url['path']);
757
758 if (isset($path[1]) && !empty($path[1])) {
759 $videoId = $path[1];
760 }
761
762 }
763
764 return '//player.vimeo.com/video/'.$videoId;
765
766 break;
767 default:
768
769 return $source;
770
771 }
772
773 }
774 }
775
776
777 // As per the JS specification
778 function pagelayer_escapeHTML($str){
779
780 $replace = [
781 ']' => '&#93;',
782 '[' => '&#91;',
783 //'=' => '&#61;',
784 '<' => '&lt;',
785 '>' => '&gt;',
786 '"' => '&quot;',
787 //'&' => '&amp;',
788 '\'' => '&#39;'
789 ];
790
791 $str = str_replace(array_keys($replace), array_values($replace), $str);
792
793 return $str;
794 }
795
796 // As per the JS specification
797 function pagelayer_unescapeHTML($str){
798 $replace = [
799 '#93' => ']',
800 '#91' => '[',
801 //'#61' => '=',
802 'lt' => '<',
803 'gt' => '>',
804 'quot' => '"',
805 //'amp' => '&',
806 '#39' => '\''
807 ];
808
809 foreach($replace as $k => $v){
810 $str = str_replace('&'.$k.';', $v, $str);
811 }
812 return $str;
813 }
814
815 // Show promo notice on dashboard
816 function pagelayer_show_promo(){
817
818 global $pagelayer_promo_opts;
819 $opts = $pagelayer_promo_opts;
820
821 echo '<style>
822 .pagelayer_promo_button {
823 background-color: #4CAF50; /* Green */
824 border: none;
825 color: white;
826 padding: 6px 10px;
827 text-align: center;
828 text-decoration: none;
829 display: inline-block;
830 font-size: 13px;
831 margin: 4px 2px;
832 -webkit-transition-duration: 0.4s; /* Safari */
833 transition-duration: 0.4s;
834 cursor: pointer;
835 }
836 .pagelayer_promo_button:focus,
837 .pagelayer_promo_button:hover{
838 border: none;
839 color: white;
840 box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
841 color: white;
842 }
843 .pagelayer_promo_buy {
844 color: white;
845 padding: 8px 12px;
846 font-size: 14px;
847 }
848 .pagelayer_promo_button1 {
849 color: white;
850 background-color: #4CAF50;
851 border:3px solid #4CAF50;
852 }
853 .pagelayer_promo_button1:hover {
854 border:3px solid #4CAF50;
855 }
856 .pagelayer_promo_button2 {
857 color: white;
858 background-color: #0085ba;
859 }
860 .pagelayer_promo_button3 {
861 color: white;
862 background-color: #365899;
863 }
864 .pagelayer_promo_button4 {
865 color: white;
866 background-color: rgb(66, 184, 221);
867 }
868 .pagelayer_promo-close{
869 float:right;
870 text-decoration:none;
871 margin: 5px 10px 0px 0px;
872 }
873 .pagelayer_promo-close:hover{
874 color: red;
875 }
876 </style>
877 <script type="application/javascript">
878 jQuery(document).ready(function(){
879 jQuery("#pagelayer_promo .pagelayer_promo-close").click(function(){
880 var data;
881 jQuery("#pagelayer_promo").hide();
882 // Save this preference
883 jQuery.post("'.admin_url('?pagelayer_promo=0').'", data, function(response) {
884 //alert(response);
885 });
886 });
887 });
888 </script>
889
890 <div class="notice notice-success" id="pagelayer_promo" style="min-height:90px">
891 <a class="pagelayer_promo-close" href="javascript:" aria-label="Dismiss this Notice">
892 <span class="dashicons dashicons-dismiss"></span> Dismiss
893 </a>';
894
895 if(!empty($opts['image'])){
896 echo '<a href="'.$opts['website'].'"><img src="'.$opts['image'].'" style="float:left; margin:10px 20px 10px 10px" width="67" /></a>';
897 }
898
899 echo '
900 <p style="font-size:13px">We are glad you like <a href="'.$opts['website'].'"><b>Pagelayer</b></a> and have been using it since the past few days. It is time to take the next step !</p>
901 <p>
902 '.(empty($opts['pro_url']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_buy" target="_blank" href="'.$opts['pro_url'].'">Buy Pagelayer Pro</a>').'
903 '.(empty($opts['rating']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button2" target="_blank" href="'.$opts['rating'].'">Rate it 5�
904 \'s</a>').'
905 '.(empty($opts['facebook']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button3" target="_blank" href="'.$opts['facebook'].'"><span class="dashicons dashicons-thumbs-up"></span> Facebook</a>').'
906 '.(empty($opts['twitter']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button4" target="_blank" href="'.$opts['twitter'].'"><span class="dashicons dashicons-twitter"></span> Tweet</a>').'
907 '.(empty($opts['website']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button4" target="_blank" href="'.$opts['website'].'">Visit our website</a>').'
908 </p>
909 <p style="font-size:13px"><a href="'.$opts['pro_url'].'"><b>Pagelayer Pro</b></a> has many more features like 60+ widgets, 400+ sections, Theme Builder, WooCommerce Builder, Theme Creator and Exporter, Form Builder, Popup Builder, etc.';
910
911 if(date('Ymd') <= 20200331){
912 echo '<br><span style="font-size: 14px"><b>Promotional Offer</b></span> : If you buy <a href="'.$opts['pro_url'].'"><b>Pagelayer Pro</b></a> before <b>31st March, 2020</b> then you will get an additional year free and your license will expire on <b>31st March, 2022</b>.';
913 }
914
915 echo '</p></div>';
916
917 }
918
919 // Are we to show a promo ?
920 function pagelayer_maybe_promo($opts){
921
922 global $pagelayer_promo_opts;
923
924 // There must be an interval
925 if(empty($opts['interval'])){
926 return false;
927 }
928
929 // Are we to show a promo
930 $opt_name = 'pagelayer_promo_time';
931 $promo_time = get_option($opt_name);
932
933 // First time access
934 if(empty($promo_time)){
935 update_option($opt_name, time() + (!empty($opts['after']) ? $opts['after'] * 86400 : 0));
936 $promo_time = get_option($opt_name);
937 }
938
939 // Is there interval elapsed
940 if(time() > $promo_time){
941 $pagelayer_promo_opts = $opts;
942 add_action('admin_notices', 'pagelayer_show_promo');
943 }
944
945 // Are we to disable the promo
946 if(isset($_GET['pagelayer_promo']) && (int)$_GET['pagelayer_promo'] == 0){
947 update_option($opt_name, time() + ($opts['interval'] * 86400));
948 die('DONE');
949 }
950
951 }
952
953 // Bread Crumbs with links
954 function pagelayer_get_breadcrumb(){
955
956 // Home page
957 $ret = '<a href="'.home_url().'" rel="nofollow">{{home}}</a>';
958
959 // Is Front page
960 if(is_front_page()){
961 return $ret;
962
963 // Is search query
964 }elseif(is_search()){
965 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b><b class="pagelayer-breadcrumb-prefix" if="{{search_prefix}}">{{search_prefix}}</b>';
966 $ret .= '<em>';
967 $ret .= get_search_query();
968 $ret .= '</em>';
969
970 //Is category or single post
971 }elseif(is_category() || is_single()){
972
973 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
974 $categories = get_the_category();
975 $separator = ' ';
976 $output = '';
977 if(!empty($categories)){
978 $ret .= get_category_parents($categories[0], true, ' <b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b> ');
979 }
980 if(is_single()) {
981 /* if (empty($categories)){
982 $ret .= ' <b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b> ';
983 } */
984 $ret .= get_the_title();
985 }
986
987 // Is page
988 }elseif(is_page()){
989 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
990 $ret .= get_the_title();
991 }else{
992 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
993 $ret .= wp_title('', false );
994 }
995
996 // wooCommerce Integration left
997
998 return $ret;
999 }
1000
1001 // Portfolio Posts
1002 function pagelayer_widget_posts($args){
1003
1004 $r = new \WP_Query($args);
1005
1006 $ret = '';
1007 if ( $r->have_posts() ){
1008
1009 if($args['filter_by'] != 'none' && $args['post_type'] == 'post'){
1010 $ret .= '<div class="pagelayer-postfolio-filter">';
1011
1012 $data_filter = ( $args['filter_by'] == 'category' ? get_categories() : get_tags() );
1013
1014 if(!empty($data_filter)){
1015
1016 $ret .= '<div class="pagelayer-postfolio-btn" data-filter="all">'.__pl('All').'</div>';
1017
1018 foreach($data_filter as $filter) {
1019 $ret .= '<div class="pagelayer-postfolio-btn" data-filter="'.$filter->name.'">' . $filter->name . '</div>';
1020 }
1021
1022 }
1023
1024 $ret .= '</div>';
1025 }
1026
1027 $ret .= '<div class="pagelayer-postfolio-container">';
1028
1029 while ( $r->have_posts() ) : $r->the_post();
1030 $post_meta = ( $args['filter_by'] == 'category' ? get_the_category() : get_the_tags() );
1031 $meta_attr = '';
1032 if($post_meta){
1033
1034 $meta_array = array();
1035 foreach( $post_meta as $meta ){
1036 $meta_array[] = $meta->name;
1037 }
1038 $meta_attr .= ' data-category="'.implode(' ', $meta_array).'"';
1039 }
1040
1041 $ret .= '<div class="pagelayer-postfolio-thumb"'.(has_post_thumbnail() ? ' style="background:url('.get_the_post_thumbnail_url().')"' : ''). $meta_attr .'>';
1042 $ret .= '<a href="'.esc_url( get_permalink() ).'" rel="bookmark">';
1043 $ret .= '<div class="pagelayer-postfolio-content">';
1044 $ret .= '<h4 class="pagelayer-entry-title">'.get_the_title().'</h4>';
1045 $ret .= '</div></a></div>';
1046
1047 endwhile;
1048
1049 $ret .= '</div>';
1050
1051 }
1052
1053 return $ret;
1054 }
1055
1056 // List all available sizes of images registered on WordPress
1057 function pagelayer_image_sizes(){
1058
1059 $sizes = array();
1060 $sizes = get_intermediate_image_sizes();
1061 $ret = array();
1062 foreach($sizes as $size){
1063 $ret[$size] = __pl($size);
1064 }
1065
1066 return $ret;
1067 }
1068
1069 function pagelayer_posts($params, $args = []){
1070
1071 // If args is empty
1072 if(empty($args)){
1073 $args = array(
1074 'post_type' => $params['post_type'],
1075 'posts_per_page' => $params['posts_per_page'],
1076 'order' => $params['order']
1077 );
1078
1079 if($params['exc_length']){
1080 $exc_length = (int) $params['exc_length'];
1081 add_filter( 'excerpt_length', function($length) use($exc_length){
1082 return $exc_length;
1083 }, 999 );
1084 }
1085
1086 if($params['term']){
1087
1088 $term = explode(':', $params['term']);
1089 //pagelayer_print($term);
1090 if($term[0] == 'category'){
1091 $args['category_name'] = $term[1];
1092 }
1093 if($term[0] == 'post_tag'){
1094 $args['tag'] = $term[1];
1095 }
1096 }
1097
1098 if($params['exc_term']){
1099
1100 $term = explode(':', $params['exc_term']);
1101 //pagelayer_print($term);
1102 if($term[0] == 'category'){
1103 $args['category__not_in'] = $term[2];
1104 }
1105 if($term[0] == 'post_tag'){
1106 $args['tag__not_in'] = $term[2];
1107 }
1108 }
1109
1110 if($params['author_name']){
1111 $author_name = explode(':', $params['author_name']);
1112 $args['author_name'] = $author_name[0];
1113 }
1114
1115 if($params['exc_author']){
1116 $exc_author = explode(':', $params['exc_author']);
1117 $args['author'] = '-'.$exc_author[1];
1118 }
1119
1120 if(!empty($params['offset'])){
1121 $args['offset'] = $params['offset'];
1122 }
1123
1124 if(!empty($params['ignore_sticky'])){
1125 $args['ignore_sticky_posts'] = $params['ignore_sticky'];
1126 }
1127
1128 if(!empty($params['orderby'])){
1129 $args['orderby'] = $params['orderby'];
1130 }
1131
1132 if($params['by_period']){
1133 $date_arg = array();
1134 switch($params['by_period']){
1135 case 'last_day':
1136 $date_arg['day'] = date('j')-1;
1137 break;
1138 case 'last_week':
1139 $date_arg['week'] = date('W')-1;
1140 break;
1141 case 'last_month':
1142 $date_arg['month'] = date('n')-1;
1143 break;
1144 case 'last_year':
1145 $date_arg['year'] = date('Y')-1;
1146 break;
1147 case 'custom':
1148 $date_arg['before'] = $params['before_date'];
1149 $date_arg['after'] = $params['after_date'];
1150 break;
1151 }
1152 $args['date_query'] = array(
1153 $date_arg
1154 );
1155 }
1156 }
1157 //pagelayer_print($args);
1158
1159 $postsquery = new WP_Query($args);
1160 $data = '';
1161
1162 if(!$postsquery->have_posts()){
1163 return '<h3>Something went wrong, Please give proper inputs!</h3>';
1164 }
1165
1166 while($postsquery->have_posts()) : $postsquery->the_post();
1167 $data .= '<div class="pagelayer-wposts-col">
1168 <div class="pagelayer-wposts-post">
1169 <div class="pagelayer-wposts-featured">';
1170 $data .= '<a href="'. get_the_permalink() .'">';
1171
1172 if(isset($params['show_thumb']) && has_post_thumbnail( $postsquery->ID )){
1173 $data .= '<div class="pagelayer-wposts-thumb"'.(has_post_thumbnail() ? ' style="background:url('.get_the_post_thumbnail_url($postsquery->ID,$params['thumb_size']).')"' : '').'></div>';
1174 }
1175 /* if($params['show_thumb'] && has_post_thumbnail( $postsquery->ID )){
1176 $data .= get_the_post_thumbnail_url($postsquery->ID,$params['thumb_size']);
1177 } */
1178 $data .= '</a></div>
1179 <div class="pagelayer-wposts-content">';
1180
1181 if(isset($params['show_title'])){
1182 $data .= '<a href="'.esc_url( get_permalink() ).'" rel="bookmark"><div class="pagelayer-wposts-title">'. get_the_title().'</div></a>';
1183 }
1184
1185 $data .= '<div class="pagelayer-wposts-meta">';
1186 $sep = '';
1187 if(isset($params['meta_sep'])){
1188 $sep = '<b class="pagelayer-wposts-sep">'.$params['meta_sep'].'</b>';
1189 }
1190 if(isset($params['author'])){
1191 $data .= '<span class="pagelayer-wposts-author">By <a class="pagelayer-wposts-author-url" href="'.esc_url(get_author_posts_url(get_the_author_meta('ID'))).'">'.esc_html(get_the_author()).'</a></span>'.$sep;
1192 }
1193 if(isset($params['date'])){
1194 $data .= '<span class="pagelayer-wposts-date"><time class="pagelayer-wposts-entry-date published updated" datetime="'.get_the_date('c').'"><span class="date-d">'.get_the_date('j').'</span><span class="date-my">'.get_the_date('M, y').'</span></time></span>'.$sep;
1195 }
1196 if(isset($params['category'])){
1197 $category = get_the_category();
1198 $singlecategory = '';
1199 foreach( $category as $cat ){
1200 $singlecategory .= '<a href="' . get_tag_link( $cat->term_id ) . '">'. $cat->name .'</a>';
1201 }
1202 $data .= '<span class="pagelayer-wposts-category">' . $singlecategory . '</span>'.$sep;
1203 }
1204 if(isset($params['tags'])){
1205 $tags = get_the_tags();
1206 $singletag = '';
1207 if(!empty($tags)){
1208 foreach( $tags as $tag ){
1209 $singletag .= '<a href="' . get_tag_link( $tag->term_id ) . '">'. $tag->name .'</a>';
1210 }
1211 if(!empty($singletag)){
1212 $data .= '<span class="pagelayer-wposts-tags">'.$singletag.'</span>'.$sep;
1213 }
1214 }
1215
1216 }
1217 if(isset($params['comments'])){
1218 $data .= '<span class="pagelayer-wposts-comments"><i class="far fa-comment" /><a href="' . esc_url( get_permalink() ) . '">' . esc_html(get_comments_number()) . '</a></span>'.$sep;
1219 }
1220
1221 $data .= '</div>';
1222
1223 if(isset($params['show_content'])){
1224 $data .= '<div class="pagelayer-wposts-excerpt">';
1225 if($params['show_content'] == 'excerpt'){
1226 $data .= do_shortcode(get_the_excerpt());
1227 }elseif($params['show_content'] == 'full'){
1228 $data .= do_shortcode(get_the_content());
1229 }
1230 $data .= '</div>';
1231 }
1232
1233 if(isset($params['show_more'])){
1234 $data .= '<a class="pagelayer-wposts-more" href="'. get_the_permalink().'">'.$params['more'].'</a>';
1235 }
1236
1237 //$data .= '<div class="pagelayer-wposts-date"><p>'.get_the_date().'</p></div>';
1238 $data .= '</div></div></div>';
1239 endwhile;
1240
1241 return $data;
1242 }
1243
1244 // Get Post Revision
1245 function pagelayer_get_post_revision_by_id($postID){
1246
1247 // Insert the post revision into the database
1248 $post_revisions = array();
1249 $reviews = wp_get_post_revisions($postID);
1250
1251 foreach($reviews as $values){
1252
1253 $date_format = date_i18n('j-M @ H:i', strtotime( $values->post_modified ) );
1254 $user_meta = get_userdata($values->post_author);
1255
1256 if ( false !== strpos( $values->post_name, 'autosave' ) ) {
1257 $type = 'autosave';
1258 } else {
1259 $type = 'revision';
1260 }
1261
1262 $post_tmp_data = array(
1263 'ID' => $values->ID,
1264 'post_author_name' => $user_meta->data->display_name,
1265 'post_author_url' => get_avatar_url($values->post_author),
1266 'post_date' => $date_format,
1267 'post_date_ago' => human_time_diff(strtotime($values->post_modified), current_time( 'timestamp' )) . ' ago ',
1268 'post_type' => $type,
1269 );
1270
1271 $post_revisions[] = $post_tmp_data;
1272 }
1273
1274 return $post_revisions;
1275 }
1276
1277 // Gets author data
1278 function pagelayer_author_data($postID){
1279
1280 $authorID = get_post_field('post_author', $postID);
1281 $data['display_name'] = get_the_author_meta( 'display_name' , $authorID );
1282 $data['description'] = get_the_author_meta( 'description' , $authorID );
1283 $data['user_url'] = get_author_posts_url( $authorID , '' );
1284 $data['avatar'] = get_avatar_url( $authorID );
1285
1286 return $data;
1287 }
1288
1289 // Posts Slider
1290 function pagelayer_posts_slider($params){
1291
1292 $args = array();
1293
1294 if(isset($params['post']['post_type'])){
1295 $args['post_type'] = $params['post']['post_type'];
1296 }
1297
1298 if(isset($params['post']['category'])){
1299 $args['category_name'] = $params['post']['category'];
1300 }
1301
1302 if(isset($params['post']['tags'])){
1303 $args['tag'] = $params['post']['tags'];
1304 }
1305
1306 if(isset($params['post']['order_by'])){
1307 $args['orderby'] = $params['post']['order_by'];
1308 }
1309
1310 if(isset($params['post']['sort_order'])){
1311 $args['order'] = $params['post']['sort_order'];
1312 }
1313
1314 if(isset($params['post']['post_count'])){
1315 $args['posts_per_page'] = $params['post']['post_count'];
1316 }
1317
1318 $data = '';
1319 $postsquery = new WP_Query($args);
1320 if ( $postsquery->have_posts() ){
1321 while ( $postsquery->have_posts() ) : $postsquery->the_post();
1322 $data .= '<li class="pagelayer-posts-slider-col">
1323 <div class="pagelayer-posts-slider-post">
1324 <div class="pagelayer-posts-slider-featured-img">';
1325 $data .= '<a href="'. get_the_permalink() .'">';
1326 if(has_post_thumbnail( $postsquery->ID ) ){
1327 if($params['post']['image_size'] == "full" || $params['post']['image_size'] == "custom" ){
1328 $image = wp_get_attachment_image_src( get_post_thumbnail_id( $postsquery->ID ), 'single-post-thumbnail' );
1329 $data .= '<img class="pagelayer-img" src="'.$image[0].'" class="pagelayer-posts-slider-img">';
1330 }else if($params['post']['image_size'] == "thumbnail"){
1331 $data .= get_the_post_thumbnail();
1332 }
1333 }
1334 $data .= '</a></div>
1335 <div class="pagelayer-posts-slider-content">';
1336 $data .= '<p class="pagelayer-posts-slider-title">'. get_the_title().'</p>';
1337 $data .= '<div class="pagelayer-posts-slider-excerpt">';
1338 if($params['post']['show_excerpt'] == "true"){
1339 if(has_excerpt()){
1340 $excerpt = get_the_excerpt();
1341 $data .= do_shortcode($excerpt);
1342 }
1343 }
1344 $data .= '</div>';
1345 $data .= '<a class="pagelayer-posts-slider-link" href="'. get_the_permalink().'">Read More</a>';
1346 $data .= '<div class="pagelayer-post-slider-date"><p>'.get_the_date().'</p></div>';
1347 $data .= '</div></div></li>';
1348 endwhile;
1349 }
1350 return $data;
1351 }
1352
1353 // Gets the site logo URLs
1354 function pagelayer_site_logo(){
1355
1356 if(get_theme_mod('custom_logo')){
1357 $logo_id = get_theme_mod('custom_logo');
1358 return pagelayer_image($logo_id);
1359 }
1360
1361 return NULL;
1362 }
1363
1364 // Create select options
1365 function pagelayer_create_sel_options( $opt_array , $selected = ''){
1366 $options = '';
1367 foreach($opt_array as $x => $val){
1368
1369 // Single item
1370 if(is_string($opt_array[$x])){
1371 $options .= pagelayer_sel_option($x, $val, $selected);
1372
1373 // Groups
1374 }else{
1375
1376 // If Label is there, then its a normal option
1377 if(array_key_exists('label', $opt_array[$x])){
1378 $options .= pagelayer_sel_option($x, $opt_array[$x]['label'], $selected);
1379
1380 // Optgroups
1381 } else{
1382 $options .= '<optgroup label="'. $x .'">';
1383 $options .= pagelayer_create_sel_options($opt_array[$x], $selected);
1384 $options .= '</optgroup>';
1385 }
1386 }
1387 }
1388
1389 return $options;
1390 }
1391
1392 // Create option HTML
1393 function pagelayer_sel_option($val, $lang, $selected){
1394 return '<option value="'. $val .'" '. (($val != $selected) ? '' : 'selected="selected"') .' >'. $lang .'</option>';
1395 }
1396
1397 // Get values from multi-dimensional array by key
1398 function pagelayer_multi_array_search(&$array, $key){
1399
1400 if(!is_array($array)){
1401 return false;
1402 }
1403
1404 foreach ($array as $k => $v) {
1405
1406 if($k == $key){
1407 return $v;
1408 }
1409
1410 if (is_array($v)) {
1411 $found = pagelayer_multi_array_search($v, $key);
1412 if(!empty($found)){
1413 return $found;
1414 }
1415 }
1416 }
1417
1418 return false;
1419 }
1420
1421 function pagelayer_get_post_term(){
1422
1423 $args = [
1424 'taxonomy' => array('category','post_tag'),
1425 'hide_empty' => false,
1426 ];
1427
1428 $terms = get_terms( $args );
1429
1430 $ret = array();
1431 foreach ( $terms as $term ) {
1432 $ret[$term->taxonomy.':'.$term->slug.':'.$term->term_taxonomy_id] = $term->taxonomy .': '. $term->name;
1433 }
1434 //pagelayer_print($terms);die();
1435 return $ret;
1436 }
1437
1438 function pagelayer_get_post_author(){
1439
1440 $args = [
1441 'who' => 'authors',
1442 'fields' => [
1443 'ID',
1444 'display_name',
1445 'user_nicename',
1446 ]
1447 ];
1448
1449 $authors = new \WP_User_Query( $args );
1450
1451 $ret = array();
1452 foreach ( $authors->get_results() as $author ) {
1453 $ret[$author->user_nicename.':'.$author->ID] = $author->display_name;
1454 }
1455 //pagelayer_print($authors->get_results());die();
1456 return $ret;
1457 }
1458
1459 // Gets the registered post types
1460 function pagelayer_get_public_post_types( $args = [] ) {
1461
1462 global $pagelayer;
1463
1464 $post_type_args = [
1465 'public' => true,
1466 ];
1467
1468 $post_type_args = wp_parse_args( $post_type_args, $args );
1469
1470 $_post_types = get_post_types( $post_type_args, 'objects' );
1471
1472 $post_types = array();
1473
1474 foreach ( $_post_types as $post_type => $object ) {
1475
1476 if($post_type == $pagelayer->builder['name']){
1477 continue;
1478 }
1479
1480 $post_types[ $post_type ] = $object->label;
1481 }
1482 //print_r($post_types);
1483
1484 return $post_types;
1485 }
1486
1487 // Simply echo and dir
1488 function pagelayer_json_output(&$done){
1489
1490 echo json_encode($done);
1491 wp_die();
1492
1493 }
1494
1495 // Get the current query for render the product
1496 function pagelayer_shortcode_current_query($query_args, $atts, $type){
1497 global $wp_query;
1498
1499 if($type == 'pagelayer_current_query'){
1500
1501 if ( ! is_page( wc_get_page_id( 'shop' ) ) ) {
1502 $query_args = $wp_query->query_vars;
1503 }
1504
1505 add_action( "woocommerce_shortcode_before_{$type}_loop", function () {
1506 wc_set_loop_prop( 'is_shortcode', false );
1507 } );
1508
1509 if(!empty($atts['paginate'])){
1510 $page = get_query_var( 'paged', 1 );
1511
1512 if( 1 < $page ) {
1513 $query_args['paged'] = $page;
1514 }
1515 }
1516
1517 // Always query only IDs
1518 $query_args['fields'] = 'ids';
1519
1520 }
1521
1522 return $query_args;
1523 }
1524
1525 function pagelayer_export_content($content){
1526
1527 // Just call do_shortcode so we can get list of media files to export
1528 //do_shortcode($content);
1529
1530 $theme_url = preg_replace('/http(s?):\/\//is', '', get_stylesheet_directory_uri());
1531
1532 $content = preg_replace('/http(s?):\/\/'.preg_quote($theme_url, '/').'/is', '{{theme_url}}', $content);
1533
1534 // Apply a filter
1535 $content = apply_filters('pagelayer_export_content', $content);
1536
1537 return $content;
1538
1539 }
1540
1541 // Insert a post which is a Pagelayer Post
1542 function pagelayer_insert_content($post, &$ret){
1543
1544 // Replace Vars
1545 $template_vars = pagelayer_template_vars();
1546 foreach($template_vars as $key => $val){
1547 $post['post_content'] = str_replace($key, $val, $post['post_content']);
1548 }
1549
1550 //pagelayer_print($post);die();
1551
1552 // Add slashes for safe insert
1553 $post['post_content'] = wp_slash($post['post_content']);
1554
1555 // Now insert / update the post
1556 $ret = wp_insert_post($post);
1557
1558 // Did we save the post ?
1559 if(empty($ret) || is_wp_error($ret)){
1560 return false;
1561 }
1562
1563 // Convert to pagelayer accessed post
1564 if(!add_post_meta($ret, 'pagelayer-data', time(), true)){
1565 update_post_meta($ret, 'pagelayer-data', time());
1566 }
1567
1568 return $ret;
1569
1570 }
1571
1572 // Gets the list of enabled fonts
1573 function pagelayer_enabled_icons(){
1574
1575 $stored_icons = get_option('pagelayer_icons_set');
1576 if(empty($stored_icons)){
1577 update_option('pagelayer_icons_set', ['font-awesome5']);
1578 $stored_icons = get_option('pagelayer_icons_set');
1579 }
1580
1581 return $stored_icons;
1582
1583 }
1584
1585 // Install the Pro version
1586 function pagelayer_install_pro(){
1587
1588 global $pagelayer;
1589
1590 // Include the necessary stuff
1591 include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
1592
1593 // Includes necessary for Plugin_Upgrader and Plugin_Installer_Skin
1594 include_once( ABSPATH . 'wp-admin/includes/file.php' );
1595 include_once( ABSPATH . 'wp-admin/includes/misc.php' );
1596 include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
1597
1598 // Filter to prevent the activate text
1599 add_filter('install_plugin_complete_actions', 'pagelayer_install_plugin_complete_actions', 10, 3);
1600
1601 $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( ) );
1602 $installed = $upgrader->install(PAGELAYER_API.'download.php?version=latest&license='.$pagelayer->license['license']);
1603
1604 if ( !is_wp_error( $installed ) && $installed ) {
1605 echo 'Activating Pagelayer Pro !';
1606 $activate = activate_plugin(PAGELAYER_PRO_BASE);
1607
1608 if ( is_null($activate) ) {
1609 echo '<div id="message" class="updated"><p>'. __('Done! Pagelayer Pro is now installed and activated.', 'pagelayer'). '</p></div><br />';
1610 echo '<br><br><b>Done! Pagelayer Pro is now installed and activated.</b>';
1611 }
1612 }
1613
1614 return $installed;
1615
1616 }
1617
1618 // Prevent pro activate text for installer
1619 function pagelayer_install_plugin_complete_actions($install_actions, $api, $plugin_file){
1620
1621 if($plugin_file == PAGELAYER_PRO_BASE){
1622 return array();
1623 }
1624
1625 return $install_actions;
1626 }
1627
1628 // Load license data
1629 function pagelayer_load_license(){
1630
1631 global $pagelayer;
1632
1633 // Load license
1634 $pagelayer->license = get_option('pagelayer_license');
1635
1636 // Update license details as well
1637 if(!empty($pagelayer->license) && (time() - @$pagelayer->license['last_update']) >= 86400){
1638
1639 $resp = wp_remote_get(PAGELAYER_API.'license.php?license='.$pagelayer->license['license']);
1640
1641 // Did we get a response ?
1642 if(is_array($resp)){
1643
1644 $tosave = json_decode($resp['body'], true);
1645
1646 // Is it the license ?
1647 if(!empty($tosave['license'])){
1648 $tosave['last_update'] = time();
1649 update_option('pagelayer_license', $tosave);
1650 }
1651
1652 }
1653
1654 }
1655
1656 }
1657