관리-도구
편집 파일: init.php
<?php // We need the ABSPATH if (!defined('ABSPATH')) exit; define('PAGELAYER_BASE', plugin_basename(PAGELAYER_FILE)); define('PAGELAYER_PREMIUM_BASE', 'pagelayer-pro/pagelayer-pro.php'); define('PAGELAYER_VERSION', '1.8.5'); define('PAGELAYER_DIR', dirname(PAGELAYER_FILE)); define('PAGELAYER_SLUG', 'pagelayer'); define('PAGELAYER_URL', plugins_url('', PAGELAYER_FILE)); define('PAGELAYER_CSS', PAGELAYER_URL.'/css'); define('PAGELAYER_JS', PAGELAYER_URL.'/js'); define('PAGELAYER_PRO_PRICE_URL', 'https://pagelayer.com/pricing?from=plugin'); define('PAGELAYER_WWW_URL', 'https://pagelayer.com/'); define('PAGELAYER_DOCS', 'https://pagelayer.com/docs/'); define('PAGELAYER_API', 'https://api.pagelayer.com/'); define('PAGELAYER_SC_PREFIX', 'pl'); define('PAGELAYER_YOUTUBE_BG', 'https://www.youtube.com/watch?v=Csa6rvCWmLU'); define('PAGELAYER_CMS_NAME', defined('SITEPAD') ? 'SitePad' : 'WordPress'); define('PAGELAYER_BLOCK_PREFIX', defined('SITEPAD') ? 'sp' : 'wp'); define('PAGELAYER_CMS_DIR_PREFIX', defined('SITEPAD') ? 'site' : 'wp'); define('PAGELAYER_DEV', file_exists(dirname(__FILE__).'/dev.php') ? 1 : 0); define('PAGELAYER_FONT_POST_TYPE', 'pagelayer-fonts'); include_once(PAGELAYER_DIR.'/main/functions.php'); include_once(PAGELAYER_DIR.'/main/class.php'); function pagelayer_died(){ print_r(error_get_last()); } //register_shutdown_function('pagelayer_died'); // Ok so we are now ready to go register_activation_hook(PAGELAYER_FILE, 'pagelayer_activation'); // Is called when the ADMIN enables the plugin function pagelayer_activation(){ global $wpdb; $sql = array(); /*$sql[] = "DROP TABLE IF EXISTS `".$wpdb->prefix."pagelayer_logs`"; foreach($sql as $sk => $sv){ $wpdb->query($sv); }*/ add_option('pagelayer_version', PAGELAYER_VERSION); add_option('pagelayer_options', array()); } // Checks if we are to update ? function pagelayer_update_check(){ global $wpdb; $sql = array(); $current_version = get_option('pagelayer_version'); $version = (int) str_replace('.', '', $current_version); // No update required if($current_version == PAGELAYER_VERSION){ return true; } // Is it first run ? if(empty($current_version)){ // Reinstall pagelayer_activation(); // Trick the following if conditions to not run $version = (int) str_replace('.', '', PAGELAYER_VERSION); } // Backward compatibility of global typography if(version_compare($current_version, '1.7.0', '<') && !defined('SITEPAD')){ // Set the array $_pagelayer = new PageLayer(); $post_types = array('' => __('Global')); $exclude = [ 'attachment', 'pagelayer-template' ]; $pt_objects = get_post_types(['public' => true,], 'objects'); foreach( $pt_objects as $pt_slug => $type ){ if ( in_array( $pt_slug, $exclude ) ) { continue; } $post_types[$pt_slug] = $type->labels->name; } foreach($post_types as $sk => $sv){ $post_type = empty($sk) ? '' : '_'.$sk; // Load CSS settings foreach($_pagelayer->css_settings as $k => $params){ foreach($_pagelayer->screens as $sck => $scv){ $suffix = (!empty($scv) ? '_'.$scv : ''); $setting = empty($params['key']) ? 'pagelayer_'.$k.'_css'.$post_type : $params['key'].$post_type; $tmp = get_option($setting.$suffix); if(empty($tmp) || empty($tmp['global-font'])){ continue; } // Do empty typo if global set foreach($tmp as $tk => $tv){ if(!in_array($tk, $_pagelayer->typo_props)){ continue; } $tmp[$tk] = ''; } // Update settings update_option($setting.$suffix, $tmp); } } } } // Show changelog notice if(version_compare($current_version, '1.8.1', '<') && !defined('SITEPAD')){ update_option('pagelayer_changelog_notice', 1); } // Save the new Version update_option('pagelayer_version', PAGELAYER_VERSION); } // Add the action to load the plugin add_action('plugins_loaded', 'pagelayer_load_plugin'); // The function that will be called when the plugin is loaded function pagelayer_load_plugin(){ global $pagelayer; // Check if the installed version is outdated pagelayer_update_check(); // Set the array $pagelayer = new PageLayer(); if(empty($pagelayer->BRAND_TEXT)){ $pagelayer->BRAND_TEXT = 'Pagelayer'; } if(empty($pagelayer->LOGO)){ $pagelayer->LOGO = PAGELAYER_URL.'/images/pagelayer-logo-40.png'; } // Load license pagelayer_load_license(); // Is there any ACTION set ? $pagelayer->action = pagelayer_optreq('pagelayer-action'); $tablet_breakpoint = get_option('pagelayer_tablet_breakpoint'); $mobile_breakpoint = get_option('pagelayer_mobile_breakpoint'); // Load settings $pagelayer->settings['post_types'] = empty(get_option('pl_support_ept')) ? ['post', 'page'] : get_option('pl_support_ept'); $pagelayer->settings['enable_giver'] = get_option('pagelayer_enable_giver'); $pagelayer->settings['max_width'] = (int) (empty(get_option('pagelayer_content_width')) ? 1170 : get_option('pagelayer_content_width')); $pagelayer->settings['tablet_breakpoint'] = (int) (empty($tablet_breakpoint) ? 780 : $tablet_breakpoint); $pagelayer->settings['mobile_breakpoint'] = (int) (empty($mobile_breakpoint) ? 360 : $mobile_breakpoint); $pagelayer->settings['sidebar'] = get_option('pagelayer_sidebar'); $pagelayer->settings['body_font'] = get_option('pagelayer_body_font'); $pagelayer->settings['color'] = get_option('pagelayer_color'); // Any custom types $pagelayer->settings['post_types'] = apply_filters('pagelayer_supported_post_type', $pagelayer->settings['post_types']); // Load the language load_plugin_textdomain('pagelayer', false, PAGELAYER_SLUG.'/languages/'); // Load our array for builder pagelayer_builder_array(); // Its premium if(!defined('PAGELAYER_PREMIUM')){ // Show the promo pagelayer_maybe_promo([ 'after' => 1,// In days 'interval' => 30,// In days 'pro_url' => PAGELAYER_PRO_PRICE_URL, 'rating' => 'https://wordpress.org/plugins/pagelayer/#reviews', 'twitter' => 'https://twitter.com/pagelayer?status='.rawurlencode('I love #Pagelayer Site Builder by @pagelayer team for my #WordPress site - '.home_url()), 'facebook' => 'https://www.facebook.com/pagelayer', 'website' => PAGELAYER_WWW_URL, 'image' => PAGELAYER_URL.'/images/pagelayer-logo-256.png' ]); } // Are we to disable the getting started promo if(current_user_can('activate_plugins') && isset($_GET['pagelayer-getting-started']) && (int)$_GET['pagelayer-getting-started'] == 0){ check_ajax_referer('pagelayer_getting_started_nonce', 'pagelayer_nonce'); update_option('pagelayer_getting_started', time()); die('DONE'); } // Show the getting started video option $seen = get_option('pagelayer_getting_started'); if(empty($seen) && !empty($_GET['page']) && $_GET['page'] != 'pagelayer_getting_started'){ add_action('admin_notices', 'pagelayer_getting_started_notice'); } // Are we to disable the changelog notice if(current_user_can('activate_plugins') && isset($_GET['pagelayer-changelog-notice']) && (int)$_GET['pagelayer-changelog-notice'] == 0){ check_ajax_referer('pagelayer_changelog_nonce', 'pagelayer_nonce'); update_option('pagelayer_changelog_notice', 0); die('DONE'); } // Show the changelog notice $changelog = get_option('pagelayer_changelog_notice'); if(!empty($changelog)){ add_action('admin_notices', 'pagelayer_show_changelog_notice'); } include_once(PAGELAYER_DIR.'/main/customizer.php'); if(class_exists('WooCommerce')){ include_once(PAGELAYER_DIR.'/main/woocommerce.php'); } } // This adds the left menu in WordPress Admin page add_action('admin_menu', 'pagelayer_admin_menu', 5); // Shows the admin menu of Pagelayer function pagelayer_admin_menu() { global $wp_version, $pagelayer; $capability = 'activate_plugins';// TODO : Capability for accessing this page // Add the menu page add_menu_page(__('Pagelayer Editor'), __('Pagelayer'), $capability, 'pagelayer', 'pagelayer_page_handler', PAGELAYER_URL.'/images/pagelayer-logo-19.png'); // Settings Page add_submenu_page('pagelayer', __('Pagelayer Editor'), __('Settings'), $capability, 'pagelayer', 'pagelayer_page_handler'); // Meta Settings Page add_submenu_page('admin.php', __('Meta Settings'), __('Meta Settings'), 'edit_posts', 'pagelayer_meta_setting', 'pagelayer_meta_handler'); // UI Settings add_submenu_page('pagelayer', __('Website Settings'), __('Website Settings'), $capability, 'pagelayer_website_settings', 'pagelayer_website_page'); // Add new template add_submenu_page('pagelayer', __('Theme Templates'), __('Theme Templates'), $capability, 'edit.php?post_type=pagelayer-template'); // Add new template Link //add_submenu_page('pagelayer', __('Add New Template'), __('Add New Template'), $capability, 'edit.php?post_type=pagelayer-template#new'); // Add new template add_submenu_page('pagelayer', __('Add New Template'), __('Add New Template'), $capability, 'pagelayer_template_wizard', 'pagelayer_builder_template_wizard'); // Export Feature if(defined('PAGELAYER_PREMIUM')){ // Add new template add_submenu_page('pagelayer', __('Custom Fonts'), __('Custom Fonts'), $capability, 'edit.php?post_type='.PAGELAYER_FONT_POST_TYPE); // Export Theme add_submenu_page('pagelayer', __('Export Content into a Theme'), __('Export Theme'), $capability, 'pagelayer_template_export', 'pagelayer_builder_export'); // Import Theme add_submenu_page('pagelayer', __('Import content from a Theme'), __('Import Theme'), $capability, 'pagelayer_import', 'pagelayer_import_page'); } // Getting Started add_submenu_page('pagelayer', __('Getting Started'), __('Getting Started'), $capability, 'pagelayer_getting_started', 'pagelayer_getting_started'); // Its Free if(!defined('PAGELAYER_PREMIUM')){ // Go Pro link add_submenu_page('pagelayer', __('Pagelayer Go Pro'), __('Go Pro'), $capability, PAGELAYER_PRO_PRICE_URL); } // License Page add_submenu_page('pagelayer', __('Pagelayer Editor'), __('License'), $capability, 'pagelayer_license', 'pagelayer_license_page'); // Replace Media add_submenu_page('admin.php', __('Replace media', 'pagelayer'), __('Replace media', 'pagelayer'), 'upload_files', 'pagelayer_replace_media', 'pagelayer_replace_media'); } // This function will handle the Settings Pages in PageLayer function pagelayer_website_page(){ global $wp_version, $pagelayer; include_once(PAGELAYER_DIR.'/main/website.php'); pagelayer_website_settings(); } // Getting Started function pagelayer_getting_started(){ global $wp_version, $pagelayer; update_option('pagelayer_getting_started', time()); include_once(PAGELAYER_DIR.'/main/getting_started.php'); } // This function will handle the post_metas Pages in PageLayer function pagelayer_meta_handler(){ global $wp_version, $pagelayer; include_once(PAGELAYER_DIR.'/main/post_metas.php'); pagelayer_meta_page(); } // Pagelayer post meta page view handler add_action('admin_enqueue_scripts', 'pagelayer_post_meta_page'); function pagelayer_post_meta_page() { // Set Current screen $screen = get_current_screen(); $meta_id = 'admin_page_pagelayer_meta_setting'; if( !is_admin() || trim($screen->id) != $meta_id ) { return; } if(!isset($_REQUEST['post'])){ return; } // Remove all the notice hooks remove_all_actions('admin_notices'); remove_all_actions('all_admin_notices'); $_REQUEST['post'] = (int) $_REQUEST['post']; $post = get_post( $_REQUEST['post'] ); // Enqueue Scripts wp_enqueue_script( 'post' ); // Is support media $thumbnail_support = current_theme_supports( 'post-thumbnails', $post->post_type ) && post_type_supports( $post->post_type, 'thumbnail' ); if ( ! $thumbnail_support && 'attachment' === $post->post_type && $post->post_mime_type ) { if ( wp_attachment_is( 'audio', $post ) ) { $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); } elseif ( wp_attachment_is( 'video', $post ) ) { $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); } } if ( $thumbnail_support ) { add_thickbox(); wp_enqueue_media( array( 'post' => $post->ID ) ); } $meta_box_url = admin_url( 'post.php' ); $meta_box_url = add_query_arg( array( 'post' => $post->ID, 'action' => 'editpost', ), $meta_box_url ); echo '<style> .'.$meta_id.' #adminmenumain, .'.$meta_id.' #wpfooter, .'.$meta_id.' #wpadminbar{ display:none; } .'.$meta_id.' #wpcontent{ margin:auto; } </style> <script type="text/javascript"> function pagelayer_post_edit(jEle, e){ e.preventDefault(); var formData = new FormData( jQuery(jEle)[0] ); jQuery.ajax({ url: "'.$meta_box_url.'", type: "POST", data: formData, processData: false, contentType: false, cache:false, success:function(result){ //window.location.reload(); alert("Post meta has been updated successfully !"); }, error:function(result){ alert("There is an error while updating post meta !"); } }); } </script>'; } // Update post meta via gutenberg handler add_filter('sanitize_post_meta_pagelayer_header_code', 'pagelayer_sanitize_postmeta', 10, 2); add_filter('sanitize_post_meta_pagelayer_body_open_code', 'pagelayer_sanitize_postmeta', 10, 2); add_filter('sanitize_post_meta_pagelayer_footer_code', 'pagelayer_sanitize_postmeta', 10, 2); function pagelayer_sanitize_postmeta( $meta_value, $meta_key ) { // Sanitize Header, body and footer code if( in_array( $meta_key, array( 'pagelayer_header_code', 'pagelayer_body_open_code', 'pagelayer_footer_code' ) ) && !pagelayer_user_can_add_js_content() ){ return sanitize_textarea_field($meta_value); } return $meta_value; } // Pre post save handler add_filter( 'content_save_pre', 'pagelayer_content_save_pre' ); function pagelayer_content_save_pre($content){ if(pagelayer_user_can_add_js_content() || !pagelayer_has_blocks($content)){ return $content; } $blocks = parse_blocks( wp_unslash($content) ); $output = ''; foreach ( $blocks as $block ) { $block_name = $block['blockName']; // Is pagelayer block if ( is_string( $block_name ) && 0 === strpos( $block_name, 'pagelayer/' ) ) { $_block = pagelayer_sanitize_blocks_save_pre($block); $output .= serialize_block($_block); continue; } $output .= serialize_block($block); } return wp_slash($output); } // On post save handler add_action('save_post', 'pagelayer_save_post', 10, 3); function pagelayer_save_post( $post_id, $post, $update ) { if( !isset($_REQUEST['is_pagelayer_editor']) || !pagelayer_user_can_edit($post_id)){ return; } // Save Header, body and footer code $header_code = !empty($_REQUEST['pagelayer_header_code']) ? $_REQUEST['pagelayer_header_code'] : '' ; $body_code = !empty($_REQUEST['pagelayer_body_open_code']) ? $_REQUEST['pagelayer_body_open_code'] : '' ; $footer_code = !empty($_REQUEST['pagelayer_footer_code']) ? $_REQUEST['pagelayer_footer_code'] : '' ; // Set Custom header, body and footer code if(!empty($header_code)){ update_post_meta($post_id, 'pagelayer_header_code', $header_code); }else{ delete_post_meta($post_id, 'pagelayer_header_code'); } if(!empty($body_code)){ update_post_meta($post_id, 'pagelayer_body_open_code', $body_code); }else{ delete_post_meta($post_id, 'pagelayer_body_open_code'); } if(!empty($footer_code)){ update_post_meta($post_id, 'pagelayer_footer_code', $footer_code); }else{ delete_post_meta($post_id, 'pagelayer_footer_code'); } } // This function will handle the Settings Pages in PageLayer function pagelayer_page_handler(){ global $wp_version, $pagelayer; include_once(PAGELAYER_DIR.'/main/settings.php'); pagelayer_settings_page(); } // This function will handle the Settings Pages in PageLayer function pagelayer_license_page(){ global $wp_version, $pagelayer; include_once(PAGELAYER_DIR.'/main/license.php'); pagelayer_license(); } // Import Pagelayer Templates function pagelayer_import_page(){ global $wp_version, $pagelayer; include_once(PAGELAYER_DIR.'/main/import.php'); pagelayer_import(); } // Load the Live Body add_action('template_redirect', 'pagelayer_load_live_body', 4); function pagelayer_load_live_body(){ global $post; // If its not live editing then stop if(!pagelayer_is_live()){ return; } // If its the iFRAME then return if(pagelayer_is_live_iframe()){ return; } // Are you allowed to edit ? if(!pagelayer_user_can_edit($post->ID)){ return; } // Load the editor live body include_once(PAGELAYER_DIR.'/main/live-body.php'); pagelayer_live_body(); } // Add the JS and CSS for Posts and Pages when being viewed ONLY if there is our content called add_action('template_redirect', 'pagelayer_enqueue_frontend', 5); function pagelayer_enqueue_frontend($force = false){ global $post, $pagelayer; if(!empty($pagelayer->cache['enqueue_frontend'])){ return; } if(empty($post->ID) && empty($force)){ return; } $is_pagelayer = false; $is_audio = false; // This IF is for Archives mainly as $post->ID is only the first post in the archive // and we need to make sure that other posts are pagelayer or not if(!empty($GLOBALS['wp_query']->posts) && is_array($GLOBALS['wp_query']->posts)){ foreach($GLOBALS['wp_query']->posts as $v){ if(get_post_meta($v->ID , 'pagelayer-data')){ $is_pagelayer = true; } if(preg_match('/(\[pl_audio|pagelayer\/pl_audio)/is', $v->post_content)){ $is_audio = true; } } } // Enqueue the FRONTEND CSS if((!empty($post->ID) && get_post_meta($post->ID , 'pagelayer-data')) || pagelayer_has_blocks() || $is_pagelayer || $force){ // We dont need the auto <p> and <br> as they interfere with us remove_filter('the_content', 'wpautop'); // No need to add curly codes to the content remove_filter('the_content', 'wptexturize'); pagelayer_load_shortcodes(); // Load global colors and fonts pagelayer_load_global_palette(); $pagelayer->cache['enqueue_frontend'] = true; // Load the global styles add_action('wp_head', 'pagelayer_global_js', 2); $premium_js = apply_filters('pagelayer_add_give_js', ''); $premium_css = apply_filters('pagelayer_add_give_css', ''); // Load this For audio widget do_action('pagelayer_load_audio_widget', $is_audio); if(pagelayer_enable_giver()){ $write = ''; // Dev mode - Dynamic JS and CSS if(defined('PAGELAYER_DEV') && !empty(PAGELAYER_DEV)){ $write = '&write=1'; } // Enqueue our Editor's Frontend JS wp_register_script('pagelayer-frontend', PAGELAYER_JS.'/givejs.php?give=pagelayer-frontend.js,nivo-lightbox.min.js,wow.min.js,jquery-numerator.js,simpleParallax.min.js,owl.carousel.min.js&premium='.$premium_js.$write, array('jquery'), PAGELAYER_VERSION); // Get list of enabled icons $icons_css = ''; $icons = pagelayer_enabled_icons(); foreach($icons as $icon){ $icons_css .= ','.$icon.'.min.css'; } wp_register_style('pagelayer-frontend', PAGELAYER_CSS.'/givecss.php?give=pagelayer-frontend.css,nivo-lightbox.css,animate.min.css,owl.carousel.min.css,owl.theme.default.min.css'.$icons_css.'&premium='.$premium_css.$write, array(), PAGELAYER_VERSION); // Static Files }else{ wp_register_script('pagelayer-frontend', (empty($premium_js) ? PAGELAYER_JS : PAGELAYER_PRO_JS).'/combined.js', array('jquery'), PAGELAYER_VERSION); wp_register_style('pagelayer-frontend', PAGELAYER_CSS.'/combined'.(!empty($premium_js) ? '.premium' : '').'.css', array(), PAGELAYER_VERSION); } wp_enqueue_script('pagelayer-frontend'); wp_enqueue_style('pagelayer-frontend'); // Load the global styles add_action('wp_head', 'pagelayer_global_styles', 5); add_filter('body_class', 'pagelayer_body_class', 10, 2); // Load the global styles for gutenberg if(pagelayer_is_gutenberg_editor()){ add_action('admin_print_scripts', 'pagelayer_global_styles', 5); } // Load custom widgets do_action('pagelayer_custom_frontend_enqueue'); } } // Load the google and custom fonts add_action('wp_footer', 'pagelayer_enqueue_fonts', 5); function pagelayer_enqueue_fonts($suffix = '-header'){ global $pagelayer; if(empty($pagelayer->cache['enqueue_frontend'])){ return; } $url = []; $cst = []; foreach($pagelayer->css as $k => $set){ $font_family = @$set['font-family']; if(empty($font_family)){ $key = str_replace(['_mobile', '_tablet'], '', $k); $font_family = @$pagelayer->css[$key]['font-family']; } // Fetch body font if given if(!empty($font_family)){ pagelayer_load_font_family($font_family, @$set['font-weight'], @$set['font-style']); } } foreach($pagelayer->runtime_fonts as $font => $weights){ if(in_array($font, $pagelayer->system_fonts)){ continue; } if(strpos($font, '_plf')){ if(!in_array($font, $pagelayer->fonts_sent)){ $pagelayer->fonts_sent[] = $font; $cst[] = preg_replace('/_plf$/is', '', $font); } }else{ $v = $font.':'.implode(',', $weights); if(!in_array($v, $pagelayer->fonts_sent)){ $url[] = $v; $pagelayer->fonts_sent[] = $v; } } } // If no fonts are to be set, then we dont set if(!empty($url)){ $fonts_url = 'https://fonts.googleapis.com/css?family='.rawurlencode(implode('|', $url)); $fonts_url = apply_filters('pagelayer_google_fonts_url', $fonts_url); wp_register_style('pagelayer-google-font'.$suffix, $fonts_url, array(), PAGELAYER_VERSION); wp_enqueue_style('pagelayer-google-font'.$suffix); echo '<link rel="preload" href="'.$fonts_url.'" as="fetch" crossorigin="anonymous">'; } if(empty($cst)){ return; } $args = [ 'post_type' => PAGELAYER_FONT_POST_TYPE, 'status' => 'publish', 'post_name__in' => $cst ]; //var_dump($args); $query = get_posts($args); //var_dump($query); if(empty($query)){ return; } foreach($query as $font){ $meta_box_value = get_post_meta($font->ID, 'pagelayer_font_link', true); if(empty($meta_box_value)){ continue; } echo '<style id="'.$font->post_name.'_plf" >@font-face { font-family: "'.$font->post_name.'_plf"'.'; src: url("'.$meta_box_value.'"); font-weight: 100 200 300 400 500 600 700 800 900;}</style>'; } } // Load any header we have function pagelayer_global_js(){ global $pagelayer; $pagelayer_recaptch_lang = get_option('pagelayer_google_captcha_lang'); echo '<script> var pagelayer_ajaxurl = "'.admin_url( 'admin-ajax.php' ).'?"; var pagelayer_global_nonce = "'.wp_create_nonce('pagelayer_global').'"; var pagelayer_server_time = '.time().'; var pagelayer_is_live = "'.pagelayer_is_live().'"; var pagelayer_facebook_id = "'.get_option('pagelayer-fbapp-id').'"; var pagelayer_settings = '.json_encode($pagelayer->settings).'; var pagelayer_recaptch_lang = "'.(!empty($pagelayer_recaptch_lang) ? $pagelayer_recaptch_lang : '').'"; </script>'; } // We need to handle global styles function pagelayer_load_global_css(){ global $pagelayer; // Load CSS settings foreach($pagelayer->css_settings as $k => $params){ $tmp_desk = ''; foreach($pagelayer->screens as $sk => $sv){ $suffix = (!empty($sv) ? '_'.$sv : ''); $setting = empty($params['key']) ? 'pagelayer_'.$k.'_css' : $params['key']; $tmp = get_option($setting.$suffix); if($sk == 'desktop'){ $tmp_desk = $tmp; } $tmp = pagelayer_sanitize_global_style($tmp, $tmp_desk, $sk); if(empty($tmp)){ continue; } $pagelayer->css[$k.$suffix] = $tmp; } } // Backward compat for colors if(!empty($pagelayer->settings['color']['background']) && empty($pagelayer->css['body']['background-color'])){ $pagelayer->css['body']['background-color'] = $pagelayer->settings['color']['background']; } if(!empty($pagelayer->settings['color']['text']) && empty($pagelayer->css['body']['color'])){ $pagelayer->css['body']['color'] = $pagelayer->settings['color']['text']; } // Link Color if(!empty($pagelayer->settings['color']['link']) && empty($pagelayer->css['a']['color'])){ $pagelayer->css['a']['color'] = $pagelayer->settings['color']['link']; } // Link Hover Color if(!empty($pagelayer->settings['color']['link-hover']) && empty($pagelayer->css['a-hover']['color'])){ $pagelayer->css['a-hover']['color'] = $pagelayer->settings['color']['link-hover']; } // Headings Color if(!empty($pagelayer->settings['color']['heading'])){ $htmp = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; foreach($htmp as $k => $v){ if(empty($pagelayer->css[$v]['color'])){ $pagelayer->css[$v]['color'] = $pagelayer->settings['color']['heading']; } } } // Backward compat for body font if(!empty($pagelayer->settings['body_font'])){ $pagelayer->settings['body']['font-family'] = $pagelayer->settings['body_font']; } } // We need to handle global styles function pagelayer_global_styles(){ global $pagelayer, $post; // Load css from settings pagelayer_load_global_css(); $styles = '<style id="pagelayer-wow-animation-style" type="text/css">.pagelayer-wow{visibility: hidden;}</style> <style id="pagelayer-global-styles" type="text/css">'.PHP_EOL; $screen_style['tablet'] = ''; $screen_style['mobile'] = ''; // PX suffix $pxs = ['font-size', 'letter-spacing', 'word-spacing']; $arrays = ['padding', 'margin']; $styles .= ':root{'; // Set global colors foreach($pagelayer->global_colors as $gk => $gv){ $styles .= '--pagelayer-color-'.$gk.':'.$gv['value'].';'; } // Set global fonts foreach($pagelayer->global_fonts as $gk => $gv){ foreach($gv['value'] as $fk => $fv){ if(empty($fv)){ continue; } $unit = in_array($fk, $pxs) ? 'px' : ''; if(is_array($fv)){ foreach($fv as $mode => $mv){ if(empty($mv)){ continue; } $font_css = '--pagelayer-font-'.$gk.'-'.$fk.':'.$mv.$unit.';'; if($mode == 'tablet' || $mode == 'mobile'){ $screen_style[$mode] .= ':root{'.$font_css.'}'; continue; } $styles .= $font_css; } continue; } $styles .= '--pagelayer-font-'.$gk.'-'.$fk .':'.$fv.$unit.';'; } } $styles .= '}'.PHP_EOL; // Style for only child row holder $styles .= '.pagelayer-row-stretch-auto > .pagelayer-row-holder, .pagelayer-row-stretch-full > .pagelayer-row-holder.pagelayer-width-auto{ max-width: '.$pagelayer->settings['max_width'].'px; margin-left: auto; margin-right: auto;}'.PHP_EOL; if(!pagelayer_is_live() && !pagelayer_is_gutenberg_editor()){ // Set responsive value $styles .= '@media (min-width: '.($pagelayer->settings['tablet_breakpoint'] + 1).'px){ .pagelayer-hide-desktop{ display:none !important; } } @media (max-width: '.$pagelayer->settings['tablet_breakpoint'].'px) and (min-width: '.($pagelayer->settings['mobile_breakpoint'] + 1).'px){ .pagelayer-hide-tablet{ display:none !important; } .pagelayer-wp-menu-holder[data-drop_breakpoint="tablet"] .pagelayer-wp_menu-ul{ display:none; } } @media (max-width: '.$pagelayer->settings['mobile_breakpoint'].'px){ .pagelayer-hide-mobile{ display:none !important; } .pagelayer-wp-menu-holder[data-drop_breakpoint="mobile"] .pagelayer-wp_menu-ul{ display:none; } }'.PHP_EOL; } // Setup CSS as per post. This overright the global styles foreach($pagelayer->css_settings as $k => $params){ $tmp_desk = ''; foreach($pagelayer->screens as $sk => $sv){ $suffix = (!empty($sv) ? '_'.$sv : ''); $setting = empty($params['key']) ? 'pagelayer_'.$k.'_css_'.@$post->post_type : $params['key'].'_'.@$post->post_type; $tmp = get_option($setting.$suffix); if($sk == 'desktop'){ $tmp_desk = $tmp; } $tmp = pagelayer_sanitize_global_style($tmp, $tmp_desk, $sk); if(empty($tmp)){ continue; } if(!empty($pagelayer->css[$k.$suffix])){ $typo_on = false; $_typo = array(); $typo = $pagelayer->typo_props; // Check if all font properties are empty then we do not overright the global typo styles foreach($typo as $prop){ if(!empty($tmp[$prop])){ $typo_on = true; } $_typo[$prop] = empty($tmp[$prop]) ? '' : $tmp[$prop]; } foreach($tmp as $tkk => $tvv){ $tvv_is_empty = is_array($tvv) ? pagelayer_is_empty_array($tvv) : empty($tvv); // Skip update for empty value and if type is empty if($tvv_is_empty || in_array($tkk, $typo)){ continue; } $pagelayer->css[$k.$suffix][$tkk] = $tvv; } if($typo_on){ $pagelayer->css[$k.$suffix] = array_merge($pagelayer->css[$k.$suffix], $_typo); } continue; } $pagelayer->css[$k.$suffix] = $tmp; } } // If is not loaded then the pagelayer_parse_vars, pagelayer_css_render not working if(empty($pagelayer->customizer_params)){ pagelayer_load_shortcodes(); } // Customizer CSS foreach($pagelayer->customizer_params as $prop => $param){ if(empty($param['customizer_css']) || empty($param['css'])){ continue; } if(!is_array($param['css'])){ $param['css'] = array($param['css']); } $customize_el = array(); $customize_el['atts'] = $pagelayer->customizer_mods; // Get Image URL $attachment = ($param['type'] == 'image') ? pagelayer_image(@$pagelayer->customizer_mods[$prop]) : ''; if(!empty($attachment)){ foreach($attachment as $k => $v){ $customize_el['tmp'][$prop.'-'.$k] = $v; } } // Loop the modes and check for values foreach($pagelayer->screens as $sk => $sv){ $suffix = (!empty($sv) ? '_'.$sv : ''); $M_prop = $prop.$suffix; // Any value ? if(empty($pagelayer->customizer_mods[$M_prop])){ continue; } // Loop through foreach($param['css'] as $k => $v){ // Make the selector $selector = (!is_numeric($k) && !empty($k) ? $k : 'body.pagelayer-body'); // Make the CSS $customize_css = $selector.'{'. rtrim( trim( pagelayer_css_render($v, $pagelayer->customizer_mods[$M_prop], @$param['sep']) ), ';' ) .'}' ; $customize_css = pagelayer_parse_vars($customize_css, $customize_el); if($sk == 'tablet'){ $screen_style['tablet'] .= $customize_css; continue; } if($sk == 'mobile'){ $screen_style['mobile'] .= $customize_css; continue; } $styles .= $customize_css; } } } // Loop CSS settings foreach($pagelayer->css as $k => $v){ $r = []; foreach($pagelayer->css[$k] as $kk => $vv){ if(empty($vv)){ continue; } if(in_array($kk, $arrays)){ $unit = 'px'; if(!empty($vv['unit'])){ $unit = $vv['unit']; unset($vv['unit']); } $vv = array_filter($vv, function($value){ return !empty($value);}); if(empty($vv)){ continue; } $skel = [0, 0, 0, 0]; $vv = array_replace($skel, $vv); $vv = implode($unit.' ', $vv).$unit; } $r[] = $kk.':'.$vv.(in_array($kk, $pxs) && strripos($vv, 'var(') === false ? 'px' : ''); } if(empty($r)){ continue; } $matches = []; preg_match('/_(mobile|tablet)$/is', $k, $matches); $key = str_replace(['_mobile', '_tablet'], '', $k); $screen = @$matches[1]; //echo $key.' - '.$k;pagelayer_print($matches); $params = $pagelayer->css_settings[$key]; $sel = !isset($params['sel']) ? ($key == 'body' ? '' : $key) : $params['sel']; $style = 'body.pagelayer-body '.$sel.'{'.implode(';', $r)."}\n"; // Mobile or tablet ? if(!empty($screen)){ $screen_style[$screen] .= $style; }else{ $styles .= $style; } } // Tablet Styles $styles .= '@media (max-width: '.$pagelayer->settings['tablet_breakpoint'].'px){ [class^="pagelayer-offset-"], [class*=" pagelayer-offset-"] { margin-left: 0; } .pagelayer-row .pagelayer-col { margin-left: 0; width: 100%; } .pagelayer-row.pagelayer-gutters .pagelayer-col { margin-bottom: 16px; } .pagelayer-first-sm { order: -1; } .pagelayer-last-sm { order: 1; } '.$screen_style['tablet'].' }'.PHP_EOL; // Any mobile style ? if(!empty($screen_style['mobile'])){ $styles .= '@media (max-width: '.$pagelayer->settings['mobile_breakpoint'].'px){ '.$screen_style['mobile'].'}'.PHP_EOL; } $styles .= PHP_EOL.'</style>'; // Lets just build a temporary list of fonts so that we can add prefetch ! pagelayer_enqueue_fonts(); if(!empty($pagelayer->runtime_fonts)){ echo '<link rel="dns-prefetch" href="https://fonts.gstatic.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">'; } echo $styles; } function pagelayer_body_class($classes, $class){ $classes[] = 'pagelayer-body'; return $classes; } // Load the live editor if needed // Changed this hook wp_enqueue_scripts to Template_include to make block theme compatibility add_action('template_include', 'pagelayer_load_live'); function pagelayer_load_live($template){ global $post, $pagelayer; $pagelayer->load_live_errors = array(); // If its not live editing then stop if(!pagelayer_is_live_iframe($pagelayer->load_live_errors)){ // Is it the live mode then lets throw an error ? if(pagelayer_optreq('pagelayer-iframe')){ add_action('wp_head', 'pagelayer_load_live_errors', 999); } return $template; } // Are you allowed to edit ? if(!pagelayer_user_can_edit($post->ID)){ return $template; } // Load the editor class include_once(PAGELAYER_DIR.'/main/live.php'); // Call the constructor $pl_editor = new PageLayer_LiveEditor(); return $template; } // Show the live errors if any function pagelayer_load_live_errors(){ global $post, $pagelayer; // Any errors ? if(empty($pagelayer->load_live_errors)){ return; } echo '<script> alert("'.str_replace('"', '\\"', implode("\n", $pagelayer->load_live_errors)).'"); </script>'; } // If we are doing ajax and its a pagelayer ajax if(wp_doing_ajax()){ include_once(PAGELAYER_DIR.'/main/ajax.php'); } // Show the backend editor options add_action('edit_form_after_title', 'pagelayer_after_title', 10); function pagelayer_after_title(){ global $post; // Get the current screen $current_screen = get_current_screen(); // For gutenberg if(method_exists($current_screen, 'is_block_editor') && $current_screen->is_block_editor()){ // Add the code in the footer add_action('admin_footer', 'pagelayer_gutenberg_after_title'); return; } // Is pagelayer supposed to edit this ? if(!pagelayer_user_can_edit($post)){ return; } $link = pagelayer_shortlink($post->ID).'&pagelayer-live=1'; echo ' <div id="pagelayer-editor-button-row" style="margin-top:15px; display:inline-block;"> <a id="pagelayer-editor-button" href="'.$link.'" class="button button-primary button-large" style="height:auto; padding:4px 8px; font-size:13px; display:flex; align-items:center; width: max-content;"> <img src="'.PAGELAYER_URL.'/images/pagelayer-logo-40.png" width="22" style="margin-right:4px" /> <span>'.__('Edit with Pagelayer').'</span> </a> </div>'; } function pagelayer_gutenberg_after_title(){ global $post; // Is pagelayer supposed to edit this ? if(!pagelayer_user_can_edit($post)){ return; } $link = pagelayer_shortlink($post->ID).'&pagelayer-live=1'; echo ' <div id="pagelayer-editor-button-row" style="margin-left:15px; display:none"> <a id="pagelayer-editor-button" href="'.$link.'" class="button button-primary button-large" style="height:auto; padding:4px 8px; font-size:13px; display:flex; align-items:center;width: max-content;"> <img src="'.PAGELAYER_URL.'/images/pagelayer-logo-40.png" align="top" width="22" style="margin-right:4px"/> <span>'.__('Edit with Pagelayer').'</span> </a> </div> <script type="text/javascript"> jQuery(document).ready(function(){ var pagelayer_timer; var pagelayer_button = function(){ var button = jQuery("#pagelayer-editor-button-row"); var g = jQuery(".edit-post-header-toolbar"); if(g.length < 1){ return; } button.detach(); //console.log(button); g.parent().append(button); button.show(); clearInterval(pagelayer_timer); } pagelayer_timer = setInterval(pagelayer_button, 100); }); </script>'; } // Handle Old Slug URL redirect for live link add_filter( 'old_slug_redirect_url', 'pagelayer_old_slug_redirect', 10, 1); function pagelayer_old_slug_redirect($link){ if(pagelayer_optreq('pagelayer-live')){ $link = add_query_arg('pagelayer-live', '1', $link); } return $link; } // Clone Post add_action('admin_action_pagelayer_clone_post', 'pagelayer_clone_post'); function pagelayer_clone_post(){ // Nonce verification check_admin_referer('pagelayer-options'); if(!current_user_can('edit_posts')){ wp_die('You don\'t have access to clone this post.'); } // Get the original post id $post_id = (int) $_REQUEST['post']; $post = get_post( $post_id ); // If post data exists, create the post clone if(empty($post)){ wp_die('No post found'); } $current_user = wp_get_current_user(); $new_post_author = $current_user->ID; unset($post->ID); $post->post_author = $new_post_author; $post->post_name = ''; $post->post_status = 'draft'; $post->post_title = $post->post_title.' Clone'; $post->post_date = ''; $post->post_date_gmt = ''; $post->guid = ''; $new_post_id = wp_insert_post( $post ); if(empty($new_post_id)){ wp_die('Post creation failed, could not find original post: ' . $post_id); } // Get all current post terms and set them to the new post draft $taxonomies = get_object_taxonomies($post->post_type); foreach ($taxonomies as $taxonomy) { $post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs')); wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); } // Clone all post meta info $post_meta_infos = get_post_meta($post_id); if (count($post_meta_infos) > 0) { foreach ($post_meta_infos as $meta_key => $meta_value){ add_post_meta($new_post_id, $meta_key, wp_slash( maybe_unserialize($meta_value[0]) )); } } // Finally, redirect to the edit post screen for the new draft wp_redirect( get_edit_post_link($new_post_id, '') ); exit; } // Add the clone link to action list for post_row_actions add_filter('post_row_actions', 'pagelayer_clone_post_link', 10, 2); add_filter('page_row_actions', 'pagelayer_clone_post_link', 10, 2); function pagelayer_clone_post_link( $actions, $post ) { if (current_user_can('edit_posts') && $post->post_status !== 'trash' && !defined('SITEPAD') && get_option('pagelayer_disable_clone') != 1) { $actions['clone'] = '<a href="'.wp_nonce_url('admin.php?action=pagelayer_clone_post&post='.$post->ID, 'pagelayer-options') . '" rel="permalink">'.__( 'Clone', 'pagelayer') .'</a>'; } return $actions; } add_filter( 'post_row_actions', 'pagelayer_quick_link', 10, 2 ); add_filter( 'page_row_actions', 'pagelayer_quick_link', 10, 2 ); function pagelayer_quick_link($actions, $post){ global $pagelayer; // Some woocommerce pages are not having ID if(empty($post->ID)){ return $actions; } // Is pagelayer supposed to edit this ? if(!pagelayer_user_can_edit($post)){ return $actions; } $link = pagelayer_shortlink($post->ID).'&pagelayer-live=1'; $actions['pagelayer'] = '<a href="'.esc_url( $link ).'">'.__( 'Edit using Pagelayer', 'pagelayer') .'</a>'; return $actions; } // Add settings link on plugin page add_filter('plugin_action_links_pagelayer/pagelayer.php', 'pagelayer_plugin_action_links'); function pagelayer_plugin_action_links($links){ if(!defined('PAGELAYER_PREMIUM')){ $links[] = '<a href="'.PAGELAYER_PRO_PRICE_URL.'" style="color:#3db634;" target="_blank">'._x('Go Pro', 'Upgrade to Pagelayer Pro for many more features', 'pagelayer').'</a>'; } $settings_link = '<a href="admin.php?page=pagelayer">Settings</a>'; array_unshift($links, $settings_link); return $links; } // Add custom header add_action('wp_head', 'pagelayer_add_custom_head', 102); function pagelayer_add_custom_head(){ global $post; $global_code = wp_unslash( get_option('pagelayer_header_code') ); if(!empty($post)){ $header_code = get_post_meta($post->ID , 'pagelayer_header_code', true); } if(!empty($global_code)){ echo $global_code."\n"; } if(!empty($header_code)){ echo $header_code."\n"; } } // Add custom body add_action('wp_body_open', 'pagelayer_body_open'); function pagelayer_body_open(){ global $post; $global_code = wp_unslash( get_option('pagelayer_body_open_code') ); if(!empty($post)){ $body_code = get_post_meta($post->ID , 'pagelayer_body_open_code', true); } if(!empty($global_code)){ echo $global_code."\n"; } if(!empty($body_code)){ echo $body_code."\n"; } } // Add custom footer add_action('wp_footer', 'pagelayer_add_custom_footer'); function pagelayer_add_custom_footer(){ global $post, $pagelayer; if(!empty($pagelayer->localScript)){ //Add local Script to variable to footer wp_register_script('pagelayer-localScript', false, true); wp_localize_script('pagelayer-localScript','pagelayer_local_scripts', $pagelayer->localScript); wp_enqueue_script( 'pagelayer-localScript'); } if($pagelayer->append_yt_api){ wp_register_script('pagelayer-youtube-script',"https://www.youtube.com/iframe_api", array(), PAGELAYER_VERSION, true); wp_enqueue_script('pagelayer-youtube-script'); } $global_code = wp_unslash( get_option('pagelayer_footer_code') ); if(!empty($post)){ $footer_code = get_post_meta($post->ID , 'pagelayer_footer_code', true); } if(!empty($global_code)){ echo $global_code."\n"; } if(!empty($footer_code)){ echo $footer_code."\n"; } } // Handle Logout Redirect here add_action('wp_logout', 'pagelayer_after_logout'); function pagelayer_after_logout($user_id){ // Get the URL $url = get_user_option('pagelayer_logout_url', $user_id); // Now blank it update_user_option($user_id, 'pagelayer_logout_url', ''); // We will redirect if we have the given item set. if(!empty($url)){ wp_redirect( $url ); exit(); } } // Replace Media $media_replace = get_option( 'pagelayer_disable_media_replace'); if(empty($media_replace)){ // Add URL to Replace Meda add_filter('media_row_actions', 'pagelayer_add_media_action', 10, 2); function pagelayer_add_media_action($actions, $post){ $url = admin_url('upload.php'); $url = add_query_arg(array( 'page' => 'pagelayer_replace_media', 'id' => $post->ID, ), $url); $actions['pagelayer_replace_media'] = '<a href="'.$url.'" rel="permalink">'.esc_html__('Replace media', 'pagelayer').'</a>'; return $actions; } } // Replace Media Function function pagelayer_replace_media(){ include_once(PAGELAYER_DIR.'/main/replace-media.php'); pagelayer_replace_page(); } // Hide admin bar add_action( 'init', 'pagelayer_hide_admin_bar'); function pagelayer_hide_admin_bar(){ // Is it the live mode ? if(!pagelayer_optreq('pagelayer-live', false) || !pagelayer_optreq('pagelayer-iframe', false)){ return false; } show_admin_bar(false); } // Check is gutenberg editor function pagelayer_is_gutenberg_editor(){ if(!function_exists('get_current_screen')){ return false; } $screen = get_current_screen(); if(empty($screen) || !method_exists($screen, 'is_block_editor')){ return false; } return $screen->is_block_editor(); } // Pagelayer Template Loading Mechanism include_once(PAGELAYER_DIR.'/main/template.php'); // Convert Pagelayer widgets to gutenberg block if(file_exists(PAGELAYER_DIR.'/main/blocks.php')){ include_once(PAGELAYER_DIR.'/main/blocks.php'); }