PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 1.0.4
Page Builder: Pagelayer – Drag and Drop website builder v1.0.4
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.4, at main/functions.php

1,745 lines 43.2 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['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 // First preference to full url
641 if(!empty($ret['full-url'])){
642 $ret['url'] = $ret['full-url'];
643 }
644
645 // No image
646 if(empty($ret['url'])){
647 $ret['url'] = PAGELAYER_URL.'/images/default-image.png';
648 }
649
650 $ret = apply_filters('pagelayer_image', $ret);
651
652 return $ret;
653
654 }
655
656 // Checks if the given parameter is an external link or a wp attachment id
657 function pagelayer_is_external_img($img = ''){
658
659 if(empty($img)){
660 return false;
661 }
662
663 if(preg_match('#http://#is', $img) || preg_match('#https://#is', $img) || preg_match('#^{{#is', $img)){
664 return true;
665 }
666
667 return false;
668
669 }
670
671 // Returns the attachment url
672 function pagelayer_attachment($id){
673
674 $ret = [];
675
676 // External url ?
677 if(pagelayer_is_external_img($id)){
678
679 $ret['url'] = $id;
680
681 // Attachment
682 }elseif(!empty($id)){
683
684 // Need to export necessary media
685 if(!empty($pagelayer->export_mode)){
686 $pagelayer->media_to_export[] = $id;
687 }
688
689 $ret['url'] = wp_get_attachment_url($id);
690
691 }
692
693 $ret = apply_filters('pagelayer_attachment', $ret);
694
695 return $ret;
696
697 }
698
699 // Convert the regular URL of a Video to a Embed URL
700 // Todo : Check
701 function pagelayer_video_url($source){
702
703 if (!empty($source)) {
704 $source = filter_var($source, FILTER_SANITIZE_URL);
705 $source = str_replace('&amp;', '&', $source);
706 $url = parse_url($source);
707 $videoSite ='';
708
709 $youtubeRegExp = '/youtube\.com|youtu\.be/is';
710 $vimeoRegExp = '/vimeo\.com/is';
711
712 if (preg_match($youtubeRegExp, $source)) {
713 $videoSite = 'youtube';
714 } else if (preg_match($vimeoRegExp, $source)) {
715 $videoSite = 'vimeo';
716 }
717
718 switch ($videoSite) {
719 case 'youtube':
720
721 if (preg_match('/youtube\.com/is', $source)) {
722
723 if (preg_match('/watch/is', $source)) {
724 parse_str($url['query'], $parameters);
725
726 if (isset($parameters['v']) && !empty($parameters['v'])) {
727 $videoId = $parameters['v'];
728 }
729
730 } else if (preg_match('/embed/is', $url['path'])) {
731 $path = explode('/', $url['path']);
732 if (isset($path[2]) && !empty($path[2])) {
733 $videoId = $path[2];
734 }
735 }
736
737 } else if (preg_match('/youtu\.be/is', $url['host'])) {
738 $path = explode('/', $url['path']);
739
740 if (isset($path[1]) && !empty($path[1])) {
741 $videoId = $path[1];
742 }
743
744 }
745
746 return '//youtube.com/embed/'.$videoId;
747
748 break;
749 case 'vimeo':
750
751 if (preg_match('/player\.vimeo\.com/is', $url['host']) && preg_match('/video/is', $url['path'])) {
752 $path = explode('/', $url['path']);
753
754 if (isset($path[2]) && !empty($path[2])) {
755 $videoId = $path[2];
756 }
757
758 } else if (preg_match('/vimeo\.com/is', $url['host'])) {
759 $path = explode('/', $url['path']);
760
761 if (isset($path[1]) && !empty($path[1])) {
762 $videoId = $path[1];
763 }
764
765 }
766
767 return '//player.vimeo.com/video/'.$videoId;
768
769 break;
770 default:
771
772 return $source;
773
774 }
775
776 }
777 }
778
779
780 // As per the JS specification
781 function pagelayer_escapeHTML($str){
782
783 $replace = [
784 ']' => '&#93;',
785 '[' => '&#91;',
786 //'=' => '&#61;',
787 '<' => '&lt;',
788 '>' => '&gt;',
789 '"' => '&quot;',
790 //'&' => '&amp;',
791 '\'' => '&#39;'
792 ];
793
794 $str = str_replace(array_keys($replace), array_values($replace), $str);
795
796 return $str;
797 }
798
799 // As per the JS specification
800 function pagelayer_unescapeHTML($str){
801 $replace = [
802 '#93' => ']',
803 '#91' => '[',
804 //'#61' => '=',
805 'lt' => '<',
806 'gt' => '>',
807 'quot' => '"',
808 //'amp' => '&',
809 '#39' => '\''
810 ];
811
812 foreach($replace as $k => $v){
813 $str = str_replace('&'.$k.';', $v, $str);
814 }
815 return $str;
816 }
817
818 // Show promo notice on dashboard
819 function pagelayer_show_promo(){
820
821 global $pagelayer_promo_opts;
822 $opts = $pagelayer_promo_opts;
823
824 echo '<style>
825 .pagelayer_promo_button {
826 background-color: #4CAF50; /* Green */
827 border: none;
828 color: white;
829 padding: 6px 10px;
830 text-align: center;
831 text-decoration: none;
832 display: inline-block;
833 font-size: 13px;
834 margin: 4px 2px;
835 -webkit-transition-duration: 0.4s; /* Safari */
836 transition-duration: 0.4s;
837 cursor: pointer;
838 }
839 .pagelayer_promo_button:focus,
840 .pagelayer_promo_button:hover{
841 border: none;
842 color: white;
843 box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
844 color: white;
845 }
846 .pagelayer_promo_buy {
847 color: white;
848 padding: 8px 12px;
849 font-size: 14px;
850 }
851 .pagelayer_promo_button1 {
852 color: white;
853 background-color: #4CAF50;
854 border:3px solid #4CAF50;
855 }
856 .pagelayer_promo_button1:hover {
857 border:3px solid #4CAF50;
858 }
859 .pagelayer_promo_button2 {
860 color: white;
861 background-color: #0085ba;
862 }
863 .pagelayer_promo_button3 {
864 color: white;
865 background-color: #365899;
866 }
867 .pagelayer_promo_button4 {
868 color: white;
869 background-color: rgb(66, 184, 221);
870 }
871 .pagelayer_promo-close{
872 float:right;
873 text-decoration:none;
874 margin: 5px 10px 0px 0px;
875 }
876 .pagelayer_promo-close:hover{
877 color: red;
878 }
879 </style>
880 <script type="application/javascript">
881 jQuery(document).ready(function(){
882 jQuery("#pagelayer_promo .pagelayer_promo-close").click(function(){
883 var data;
884 jQuery("#pagelayer_promo").hide();
885 // Save this preference
886 jQuery.post("'.admin_url('?pagelayer_promo=0').'", data, function(response) {
887 //alert(response);
888 });
889 });
890 });
891 </script>
892
893 <div class="notice notice-success" id="pagelayer_promo" style="min-height:90px">
894 <a class="pagelayer_promo-close" href="javascript:" aria-label="Dismiss this Notice">
895 <span class="dashicons dashicons-dismiss"></span> Dismiss
896 </a>';
897
898 if(!empty($opts['image'])){
899 echo '<a href="'.$opts['website'].'"><img src="'.$opts['image'].'" style="float:left; margin:10px 20px 10px 10px" width="67" /></a>';
900 }
901
902 echo '
903 <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>
904 <p>
905 '.(empty($opts['pro_url']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_buy" target="_blank" href="'.$opts['pro_url'].'">Buy Pagelayer Pro</a>').'
906 '.(empty($opts['rating']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button2" target="_blank" href="'.$opts['rating'].'">Rate it 5�
907 \'s</a>').'
908 '.(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>').'
909 '.(empty($opts['twitter']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button4" target="_blank" href="'.$opts['twitter'].'"><span class="dashicons dashicons-twitter"></span> Tweet</a>').'
910 '.(empty($opts['website']) ? '' : '<a class="pagelayer_promo_button pagelayer_promo_button4" target="_blank" href="'.$opts['website'].'">Visit our website</a>').'
911 </p>
912 <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.';
913
914 if(date('Ymd') <= 20200331){
915 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>.';
916 }
917
918 echo '</p></div>';
919
920 }
921
922 // Are we to show a promo ?
923 function pagelayer_maybe_promo($opts){
924
925 global $pagelayer_promo_opts;
926
927 // There must be an interval
928 if(empty($opts['interval'])){
929 return false;
930 }
931
932 // Are we to show a promo
933 $opt_name = 'pagelayer_promo_time';
934 $promo_time = get_option($opt_name);
935
936 // First time access
937 if(empty($promo_time)){
938 update_option($opt_name, time() + (!empty($opts['after']) ? $opts['after'] * 86400 : 0));
939 $promo_time = get_option($opt_name);
940 }
941
942 // Is there interval elapsed
943 if(time() > $promo_time){
944 $pagelayer_promo_opts = $opts;
945 add_action('admin_notices', 'pagelayer_show_promo');
946 }
947
948 // Are we to disable the promo
949 if(isset($_GET['pagelayer_promo']) && (int)$_GET['pagelayer_promo'] == 0){
950 update_option($opt_name, time() + ($opts['interval'] * 86400));
951 die('DONE');
952 }
953
954 }
955
956 // Bread Crumbs with links
957 function pagelayer_get_breadcrumb(){
958
959 // Home page
960 $ret = '<a href="'.home_url().'" rel="nofollow">{{home}}</a>';
961
962 // Is Front page
963 if(is_front_page()){
964 return $ret;
965
966 // Is search query
967 }elseif(is_search()){
968 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b><b class="pagelayer-breadcrumb-prefix" if="{{search_prefix}}">{{search_prefix}}</b>';
969 $ret .= '<em>';
970 $ret .= get_search_query();
971 $ret .= '</em>';
972
973 //Is category or single post
974 }elseif(is_category() || is_single()){
975
976 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
977 $categories = get_the_category();
978 $separator = ' ';
979 $output = '';
980 if(!empty($categories)){
981 $ret .= get_category_parents($categories[0], true, ' <b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b> ');
982 }
983 if(is_single()) {
984 /* if (empty($categories)){
985 $ret .= ' <b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b> ';
986 } */
987 $ret .= get_the_title();
988 }
989
990 // Is page
991 }elseif(is_page()){
992 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
993 $ret .= get_the_title();
994 }else{
995 $ret .= '<b class="pagelayer-breadcrumb-sep" if="{{separator}}">{{separator}}</b>';
996 $ret .= wp_title('', false );
997 }
998
999 // wooCommerce Integration left
1000
1001 return $ret;
1002 }
1003
1004 // Portfolio Posts
1005 function pagelayer_widget_posts($args){
1006
1007 $r = new \WP_Query($args);
1008
1009 $ret = '';
1010 if ( $r->have_posts() ){
1011
1012 if($args['filter_by'] != 'none' && $args['post_type'] == 'post'){
1013 $ret .= '<div class="pagelayer-postfolio-filter">';
1014
1015 $data_filter = ( $args['filter_by'] == 'category' ? get_categories() : get_tags() );
1016
1017 if(!empty($data_filter)){
1018
1019 $ret .= '<div class="pagelayer-postfolio-btn" data-filter="all">'.__pl('All').'</div>';
1020
1021 foreach($data_filter as $filter) {
1022 $ret .= '<div class="pagelayer-postfolio-btn" data-filter="'.$filter->name.'">' . $filter->name . '</div>';
1023 }
1024
1025 }
1026
1027 $ret .= '</div>';
1028 }
1029
1030 $ret .= '<div class="pagelayer-postfolio-container">';
1031
1032 while ( $r->have_posts() ) : $r->the_post();
1033 $post_meta = ( $args['filter_by'] == 'category' ? get_the_category() : get_the_tags() );
1034 $meta_attr = '';
1035 if($post_meta){
1036
1037 $meta_array = array();
1038 foreach( $post_meta as $meta ){
1039 $meta_array[] = $meta->name;
1040 }
1041 $meta_attr .= ' data-category="'.implode(' ', $meta_array).'"';
1042 }
1043
1044 $ret .= '<div class="pagelayer-postfolio-thumb"'.(has_post_thumbnail() ? ' style="background:url('.get_the_post_thumbnail_url().')"' : ''). $meta_attr .'>';
1045 $ret .= '<a href="'.esc_url( get_permalink() ).'" rel="bookmark">';
1046 $ret .= '<div class="pagelayer-postfolio-content">';
1047 $ret .= '<h4 class="pagelayer-entry-title">'.get_the_title().'</h4>';
1048 $ret .= '</div></a></div>';
1049
1050 endwhile;
1051
1052 $ret .= '</div>';
1053
1054 }
1055
1056 return $ret;
1057 }
1058
1059 // List all available sizes of images registered on WordPress
1060 function pagelayer_image_sizes(){
1061
1062 $sizes = array();
1063 $sizes = get_intermediate_image_sizes();
1064 $ret = array();
1065 foreach($sizes as $size){
1066 $ret[$size] = __pl($size);
1067 }
1068
1069 return $ret;
1070 }
1071
1072 function pagelayer_remove_excerpt_more($more){
1073 return '';
1074 }
1075
1076 function pagelayer_posts($params, $args = []){
1077
1078 // If args is empty
1079 if(empty($args)){
1080 $args = array(
1081 'post_type' => $params['post_type'],
1082 'posts_per_page' => $params['posts_per_page'],
1083 'order' => $params['order']
1084 );
1085
1086 if($params['exc_length']){
1087 $exc_length = (int) $params['exc_length'];
1088 add_filter( 'excerpt_length', function($length) use($exc_length){
1089 return $exc_length;
1090 }, 999 );
1091 }
1092
1093 add_filter('excerpt_more', 'pagelayer_remove_excerpt_more', 999);
1094
1095 if($params['term']){
1096
1097 $term = explode(':', $params['term']);
1098 //pagelayer_print($term);
1099 if($term[0] == 'category'){
1100 $args['category_name'] = $term[1];
1101 }
1102 if($term[0] == 'post_tag'){
1103 $args['tag'] = $term[1];
1104 }
1105 }
1106
1107 if($params['exc_term']){
1108
1109 $term = explode(':', $params['exc_term']);
1110 //pagelayer_print($term);
1111 if($term[0] == 'category'){
1112 $args['category__not_in'] = $term[2];
1113 }
1114 if($term[0] == 'post_tag'){
1115 $args['tag__not_in'] = $term[2];
1116 }
1117 }
1118
1119 if($params['author_name']){
1120 $author_name = explode(':', $params['author_name']);
1121 $args['author_name'] = $author_name[0];
1122 }
1123
1124 if($params['exc_author']){
1125 $exc_author = explode(':', $params['exc_author']);
1126 $args['author'] = '-'.$exc_author[1];
1127 }
1128
1129 if(!empty($params['offset'])){
1130 $args['offset'] = $params['offset'];
1131 }
1132
1133 if(!empty($params['ignore_sticky'])){
1134 $args['ignore_sticky_posts'] = $params['ignore_sticky'];
1135 }
1136
1137 if(!empty($params['orderby'])){
1138 $args['orderby'] = $params['orderby'];
1139 }
1140
1141 if($params['by_period']){
1142 $date_arg = array();
1143 switch($params['by_period']){
1144 case 'last_day':
1145 $date_arg['day'] = date('j')-1;
1146 break;
1147 case 'last_week':
1148 $date_arg['week'] = date('W')-1;
1149 break;
1150 case 'last_month':
1151 $date_arg['month'] = date('n')-1;
1152 break;
1153 case 'last_year':
1154 $date_arg['year'] = date('Y')-1;
1155 break;
1156 case 'custom':
1157 $date_arg['before'] = $params['before_date'];
1158 $date_arg['after'] = $params['after_date'];
1159 break;
1160 }
1161 $args['date_query'] = array(
1162 $date_arg
1163 );
1164 }
1165 }
1166 //pagelayer_print($args);
1167
1168 $postsquery = new WP_Query($args);
1169 $data = '';
1170
1171 if(!$postsquery->have_posts()){
1172 return '<h3>Something went wrong, Please give proper inputs!</h3>';
1173 }
1174
1175 while($postsquery->have_posts()) : $postsquery->the_post();
1176 $data .= '<div class="pagelayer-wposts-col">
1177 <div class="pagelayer-wposts-post">
1178 <div class="pagelayer-wposts-featured">';
1179 $data .= '<a href="'. get_the_permalink() .'">';
1180
1181 if(isset($params['show_thumb']) && has_post_thumbnail( $postsquery->ID )){
1182 $data .= '<div class="pagelayer-wposts-thumb"'.(has_post_thumbnail() ? ' style="background:url('.get_the_post_thumbnail_url($postsquery->ID,$params['thumb_size']).')"' : '').'></div>';
1183 }
1184 /* if($params['show_thumb'] && has_post_thumbnail( $postsquery->ID )){
1185 $data .= get_the_post_thumbnail_url($postsquery->ID,$params['thumb_size']);
1186 } */
1187 $data .= '</a></div>
1188 <div class="pagelayer-wposts-content">';
1189
1190 if(isset($params['show_title'])){
1191 $data .= '<a href="'.esc_url( get_permalink() ).'" rel="bookmark"><div class="pagelayer-wposts-title">'. get_the_title().'</div></a>';
1192 }
1193
1194 $data .= '<div class="pagelayer-wposts-meta">';
1195 $sep = '';
1196 if(isset($params['meta_sep'])){
1197 $sep = '<b class="pagelayer-wposts-sep">'.$params['meta_sep'].'</b>';
1198 }
1199 if(isset($params['author'])){
1200 $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;
1201 }
1202 if(isset($params['date'])){
1203 $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;
1204 }
1205 if(isset($params['category'])){
1206 $category = get_the_category();
1207 $singlecategory = '';
1208 foreach( $category as $cat ){
1209 $singlecategory .= '<a href="' . get_tag_link( $cat->term_id ) . '">'. $cat->name .'</a>';
1210 }
1211 $data .= '<span class="pagelayer-wposts-category">' . $singlecategory . '</span>'.$sep;
1212 }
1213 if(isset($params['tags'])){
1214 $tags = get_the_tags();
1215 $singletag = '';
1216 if(!empty($tags)){
1217 foreach( $tags as $tag ){
1218 $singletag .= '<a href="' . get_tag_link( $tag->term_id ) . '">'. $tag->name .'</a>';
1219 }
1220 if(!empty($singletag)){
1221 $data .= '<span class="pagelayer-wposts-tags">'.$singletag.'</span>'.$sep;
1222 }
1223 }
1224
1225 }
1226 if(isset($params['comments'])){
1227 $data .= '<span class="pagelayer-wposts-comments"><i class="far fa-comment"></i><a href="' . esc_url( get_permalink() ) . '">' . esc_html(get_comments_number()) . '</a></span>'.$sep;
1228 }
1229
1230 $data .= '</div>';
1231
1232 if(isset($params['show_content'])){
1233 $data .= '<div class="pagelayer-wposts-excerpt">';
1234 if($params['show_content'] == 'excerpt'){
1235 $data .= do_shortcode(get_the_excerpt());
1236 }elseif($params['show_content'] == 'full'){
1237 $data .= do_shortcode(get_the_content());
1238 }
1239 $data .= '</div>';
1240 }
1241
1242 if(isset($params['show_more'])){
1243 $data .= '<div class="pagelayer-wposts-mdiv"><a class="pagelayer-wposts-more pagelayer-btn-holder pagelayer-ele-link '.$params['btn_type'].' '.$params['size'].' '.$params['icon_position'].'" href="'. get_the_permalink().'">';
1244
1245 if($params['icon']){
1246 $data .= '<i class="'.$params['icon'].' pagelayer-btn-icon"></i>';
1247 }
1248
1249 if($params['more']){
1250 $data .= '<span class="pagelayer-btn-text">'.$params['more'].'</span>';
1251 }
1252
1253 if($params['icon']){
1254 $data .= '<i class="'.$params['icon'].' pagelayer-btn-icon"></i>';
1255 }
1256
1257 $data .= '</a></div>';
1258
1259 //$data .= '<a class="pagelayer-wposts-more" href="'. get_the_permalink().'">'.$params['more'].'</a>';
1260 }
1261
1262 //$data .= '<div class="pagelayer-wposts-date"><p>'.get_the_date().'</p></div>';
1263 $data .= '</div></div></div>';
1264 endwhile;
1265
1266 return $data;
1267 }
1268
1269 // Get Post Revision
1270 function pagelayer_get_post_revision_by_id($postID){
1271
1272 // Insert the post revision into the database
1273 $post_revisions = array();
1274 $reviews = wp_get_post_revisions($postID);
1275
1276 foreach($reviews as $values){
1277
1278 $date_format = date_i18n('j-M @ H:i', strtotime( $values->post_modified ) );
1279 $user_meta = get_userdata($values->post_author);
1280
1281 if ( false !== strpos( $values->post_name, 'autosave' ) ) {
1282 $type = 'autosave';
1283 } else {
1284 $type = 'revision';
1285 }
1286
1287 $post_tmp_data = array(
1288 'ID' => $values->ID,
1289 'post_author_name' => $user_meta->data->display_name,
1290 'post_author_url' => get_avatar_url($values->post_author),
1291 'post_date' => $date_format,
1292 'post_date_ago' => human_time_diff(strtotime($values->post_modified), current_time( 'timestamp' )) . ' ago ',
1293 'post_type' => $type,
1294 );
1295
1296 $post_revisions[] = $post_tmp_data;
1297 }
1298
1299 return $post_revisions;
1300 }
1301
1302 // Gets author data
1303 function pagelayer_author_data($postID){
1304
1305 $authorID = get_post_field('post_author', $postID);
1306 $data['display_name'] = get_the_author_meta( 'display_name' , $authorID );
1307 $data['description'] = get_the_author_meta( 'description' , $authorID );
1308 $data['user_url'] = get_author_posts_url( $authorID , '' );
1309 $data['avatar'] = get_avatar_url( $authorID );
1310
1311 return $data;
1312 }
1313
1314 // Posts Slider
1315 function pagelayer_posts_slider($params){
1316
1317 $args = array();
1318
1319 if(isset($params['post']['post_type'])){
1320 $args['post_type'] = $params['post']['post_type'];
1321 }
1322
1323 if(isset($params['post']['category'])){
1324 $args['category_name'] = $params['post']['category'];
1325 }
1326
1327 if(isset($params['post']['tags'])){
1328 $args['tag'] = $params['post']['tags'];
1329 }
1330
1331 if(isset($params['post']['order_by'])){
1332 $args['orderby'] = $params['post']['order_by'];
1333 }
1334
1335 if(isset($params['post']['sort_order'])){
1336 $args['order'] = $params['post']['sort_order'];
1337 }
1338
1339 if(isset($params['post']['post_count'])){
1340 $args['posts_per_page'] = $params['post']['post_count'];
1341 }
1342
1343 $data = '';
1344 $postsquery = new WP_Query($args);
1345 if ( $postsquery->have_posts() ){
1346 while ( $postsquery->have_posts() ) : $postsquery->the_post();
1347 $data .= '<li class="pagelayer-posts-slider-col">
1348 <div class="pagelayer-posts-slider-post">
1349 <div class="pagelayer-posts-slider-featured-img">';
1350 $data .= '<a href="'. get_the_permalink() .'">';
1351 if(has_post_thumbnail( $postsquery->ID ) ){
1352 if($params['post']['image_size'] == "full" || $params['post']['image_size'] == "custom" ){
1353 $image = wp_get_attachment_image_src( get_post_thumbnail_id( $postsquery->ID ), 'single-post-thumbnail' );
1354 $data .= '<img class="pagelayer-img" src="'.$image[0].'" class="pagelayer-posts-slider-img">';
1355 }else if($params['post']['image_size'] == "thumbnail"){
1356 $data .= get_the_post_thumbnail();
1357 }
1358 }
1359 $data .= '</a></div>
1360 <div class="pagelayer-posts-slider-content">';
1361 $data .= '<p class="pagelayer-posts-slider-title">'. get_the_title().'</p>';
1362 $data .= '<div class="pagelayer-posts-slider-excerpt">';
1363 if($params['post']['show_excerpt'] == "true"){
1364 if(has_excerpt()){
1365 $excerpt = get_the_excerpt();
1366 $data .= do_shortcode($excerpt);
1367 }
1368 }
1369 $data .= '</div>';
1370 $data .= '<a class="pagelayer-posts-slider-link" href="'. get_the_permalink().'">Read More</a>';
1371 $data .= '<div class="pagelayer-post-slider-date"><p>'.get_the_date().'</p></div>';
1372 $data .= '</div></div></li>';
1373 endwhile;
1374 }
1375 return $data;
1376 }
1377
1378 // Gets the site logo URLs
1379 function pagelayer_site_logo(){
1380
1381 if(get_theme_mod('custom_logo')){
1382 $logo_id = get_theme_mod('custom_logo');
1383 return pagelayer_image($logo_id);
1384 }
1385
1386 return NULL;
1387 }
1388
1389 // Create select options
1390 function pagelayer_create_sel_options( $opt_array , $selected = ''){
1391 $options = '';
1392 foreach($opt_array as $x => $val){
1393
1394 // Single item
1395 if(is_string($opt_array[$x])){
1396 $options .= pagelayer_sel_option($x, $val, $selected);
1397
1398 // Groups
1399 }else{
1400
1401 // If Label is there, then its a normal option
1402 if(array_key_exists('label', $opt_array[$x])){
1403 $options .= pagelayer_sel_option($x, $opt_array[$x]['label'], $selected);
1404
1405 // Optgroups
1406 } else{
1407 $options .= '<optgroup label="'. $x .'">';
1408 $options .= pagelayer_create_sel_options($opt_array[$x], $selected);
1409 $options .= '</optgroup>';
1410 }
1411 }
1412 }
1413
1414 return $options;
1415 }
1416
1417 // Create option HTML
1418 function pagelayer_sel_option($val, $lang, $selected){
1419 return '<option value="'. $val .'" '. (($val != $selected) ? '' : 'selected="selected"') .' >'. $lang .'</option>';
1420 }
1421
1422 // Get values from multi-dimensional array by key
1423 function pagelayer_multi_array_search(&$array, $key){
1424
1425 if(!is_array($array)){
1426 return false;
1427 }
1428
1429 foreach ($array as $k => $v) {
1430
1431 if($k == $key){
1432 return $v;
1433 }
1434
1435 if (is_array($v)) {
1436 $found = pagelayer_multi_array_search($v, $key);
1437 if(!empty($found)){
1438 return $found;
1439 }
1440 }
1441 }
1442
1443 return false;
1444 }
1445
1446 function pagelayer_get_post_term(){
1447
1448 $args = [
1449 'taxonomy' => array('category','post_tag'),
1450 'hide_empty' => false,
1451 ];
1452
1453 $terms = get_terms( $args );
1454
1455 $ret = array();
1456 foreach ( $terms as $term ) {
1457 $ret[$term->taxonomy.':'.$term->slug.':'.$term->term_taxonomy_id] = $term->taxonomy .': '. $term->name;
1458 }
1459 //pagelayer_print($terms);die();
1460 return $ret;
1461 }
1462
1463 function pagelayer_get_post_author(){
1464
1465 $args = [
1466 'who' => 'authors',
1467 'fields' => [
1468 'ID',
1469 'display_name',
1470 'user_nicename',
1471 ]
1472 ];
1473
1474 $authors = new \WP_User_Query( $args );
1475
1476 $ret = array();
1477 foreach ( $authors->get_results() as $author ) {
1478 $ret[$author->user_nicename.':'.$author->ID] = $author->display_name;
1479 }
1480 //pagelayer_print($authors->get_results());die();
1481 return $ret;
1482 }
1483
1484 // Gets the registered post types
1485 function pagelayer_get_public_post_types( $args = [] ) {
1486
1487 global $pagelayer;
1488
1489 $post_type_args = [
1490 'public' => true,
1491 ];
1492
1493 $post_type_args = wp_parse_args( $post_type_args, $args );
1494
1495 $_post_types = get_post_types( $post_type_args, 'objects' );
1496
1497 $post_types = array();
1498
1499 foreach ( $_post_types as $post_type => $object ) {
1500
1501 if($post_type == $pagelayer->builder['name']){
1502 continue;
1503 }
1504
1505 $post_types[ $post_type ] = $object->label;
1506 }
1507 //print_r($post_types);
1508
1509 return $post_types;
1510 }
1511
1512 // Simply echo and dir
1513 function pagelayer_json_output(&$done){
1514
1515 echo json_encode($done);
1516 wp_die();
1517
1518 }
1519
1520 // Get the current query for render the product
1521 function pagelayer_shortcode_current_query($query_args, $atts, $type){
1522 global $wp_query;
1523
1524 if($type == 'pagelayer_current_query'){
1525
1526 if ( ! is_page( wc_get_page_id( 'shop' ) ) ) {
1527 $query_args = $wp_query->query_vars;
1528 }
1529
1530 add_action( "woocommerce_shortcode_before_{$type}_loop", function () {
1531 wc_set_loop_prop( 'is_shortcode', false );
1532 } );
1533
1534 if(!empty($atts['paginate'])){
1535 $page = get_query_var( 'paged', 1 );
1536
1537 if( 1 < $page ) {
1538 $query_args['paged'] = $page;
1539 }
1540 }
1541
1542 // Always query only IDs
1543 $query_args['fields'] = 'ids';
1544
1545 }
1546
1547 return $query_args;
1548 }
1549
1550 function pagelayer_export_content($content){
1551
1552 // Just call do_shortcode so we can get list of media files to export
1553 //do_shortcode($content);
1554
1555 $theme_url = preg_replace('/http(s?):\/\//is', '', get_stylesheet_directory_uri());
1556
1557 $content = preg_replace('/http(s?):\/\/'.preg_quote($theme_url, '/').'/is', '{{theme_url}}', $content);
1558
1559 // Apply a filter
1560 $content = apply_filters('pagelayer_export_content', $content);
1561
1562 return $content;
1563
1564 }
1565
1566 // Insert a post which is a Pagelayer Post
1567 function pagelayer_insert_content($post, &$ret){
1568
1569 // Replace Vars
1570 $template_vars = pagelayer_template_vars();
1571 foreach($template_vars as $key => $val){
1572 $post['post_content'] = str_replace($key, $val, $post['post_content']);
1573 }
1574
1575 //pagelayer_print($post);die();
1576
1577 // Add slashes for safe insert
1578 $post['post_content'] = wp_slash($post['post_content']);
1579
1580 // Now insert / update the post
1581 $ret = wp_insert_post($post);
1582
1583 // Did we save the post ?
1584 if(empty($ret) || is_wp_error($ret)){
1585 return false;
1586 }
1587
1588 // Convert to pagelayer accessed post
1589 if(!add_post_meta($ret, 'pagelayer-data', time(), true)){
1590 update_post_meta($ret, 'pagelayer-data', time());
1591 }
1592
1593 return $ret;
1594
1595 }
1596
1597 // Gets the list of enabled fonts
1598 function pagelayer_enabled_icons(){
1599
1600 $stored_icons = get_option('pagelayer_icons_set');
1601 if(empty($stored_icons)){
1602 update_option('pagelayer_icons_set', ['font-awesome5']);
1603 $stored_icons = get_option('pagelayer_icons_set');
1604 }
1605
1606 return $stored_icons;
1607
1608 }
1609
1610 // Install the Pro version
1611 function pagelayer_install_pro(){
1612
1613 global $pagelayer;
1614
1615 // Include the necessary stuff
1616 include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
1617
1618 // Includes necessary for Plugin_Upgrader and Plugin_Installer_Skin
1619 include_once( ABSPATH . 'wp-admin/includes/file.php' );
1620 include_once( ABSPATH . 'wp-admin/includes/misc.php' );
1621 include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
1622
1623 // Filter to prevent the activate text
1624 add_filter('install_plugin_complete_actions', 'pagelayer_install_plugin_complete_actions', 10, 3);
1625
1626 $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( ) );
1627 $installed = $upgrader->install(PAGELAYER_API.'download.php?version=latest&license='.$pagelayer->license['license']);
1628
1629 if ( !is_wp_error( $installed ) && $installed ) {
1630 echo 'Activating Pagelayer Pro !';
1631 $activate = activate_plugin(PAGELAYER_PRO_BASE);
1632
1633 if ( is_null($activate) ) {
1634 echo '<div id="message" class="updated"><p>'. __('Done! Pagelayer Pro is now installed and activated.', 'pagelayer'). '</p></div><br />';
1635 echo '<br><br><b>Done! Pagelayer Pro is now installed and activated.</b>';
1636 }
1637 }
1638
1639 return $installed;
1640
1641 }
1642
1643 // Prevent pro activate text for installer
1644 function pagelayer_install_plugin_complete_actions($install_actions, $api, $plugin_file){
1645
1646 if($plugin_file == PAGELAYER_PRO_BASE){
1647 return array();
1648 }
1649
1650 return $install_actions;
1651 }
1652
1653 // Load license data
1654 function pagelayer_load_license(){
1655
1656 global $pagelayer;
1657
1658 // Load license
1659 $pagelayer->license = get_option('pagelayer_license');
1660
1661 // Update license details as well
1662 if(!empty($pagelayer->license) && (time() - @$pagelayer->license['last_update']) >= 86400){
1663
1664 $resp = wp_remote_get(PAGELAYER_API.'license.php?license='.$pagelayer->license['license']);
1665
1666 // Did we get a response ?
1667 if(is_array($resp)){
1668
1669 $tosave = json_decode($resp['body'], true);
1670
1671 // Is it the license ?
1672 if(!empty($tosave['license'])){
1673 $tosave['last_update'] = time();
1674 update_option('pagelayer_license', $tosave);
1675 }
1676
1677 }
1678
1679 }
1680
1681 }
1682
1683 // Handle hexa to rgba and also remove alpha which is ff
1684 function pagelayer_hex8_to_rgba($val){
1685
1686 // If opacity is ff then discard ff
1687 if(preg_match('/^#([a-f0-9]{6})ff$/is', $val)){
1688 return substr($val, 0, 7);
1689 }
1690
1691 // Lets handle the RGB+opacity
1692 if(preg_match('/#([a-f0-9]{8})$/is', $val)){
1693 $val = pagelayer_hex2rgba($val);
1694 }
1695
1696 return $val;
1697
1698 }
1699
1700 // Convert to RGBA from HEX
1701 function pagelayer_hex2rgba($color){
1702
1703 //Return if no color provided
1704 if(empty($color)){
1705 return;
1706 }
1707
1708 //Sanitize $color if "#" is provided
1709 if ($color[0] == '#'){
1710 $color = substr( $color, 1 );
1711 }
1712
1713 //Check if color has 6 or 3 characters and get values
1714 if (strlen($color) == 8) {
1715 $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
1716 $alpha = $color[6] . $color[7];
1717 //$alpha = '';
1718 } elseif (strlen($color) == 6) {
1719 $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
1720 } elseif ( strlen( $color ) == 3 ) {
1721 $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
1722 } else {
1723 return;
1724 }
1725
1726 //Convert hexadec to rgb
1727 $rgb = array_map('hexdec', $hex);
1728
1729 //Check if opacity is set(rgba or rgb)
1730 if($alpha){
1731
1732 $alpha = number_format((float)hexdec($alpha) / 255, 2, '.', '');
1733 //print_r($alpha);
1734 if(abs($alpha) > 1){
1735 $alpha = 1.0;
1736 }
1737 $output = 'rgba('.implode(",",$rgb).','.$alpha.')';
1738 } else {
1739 $output = 'rgb('.implode(",",$rgb).')';
1740 }
1741
1742 //Return rgb(a) color string
1743 return $output;
1744 }
1745