'true' ), get_home_url() . '/'); } } /* ---------------------------------------------------- */ /* Define /* ---------------------------------------------------- */ define('YP_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('YP_PLUGIN_URL', plugin_dir_url(__FILE__)); // Define define('YP_VERSION', "7.6.1"); define('WTFV', TRUE); // Admin Settings Page include(YP_PLUGIN_DIR . 'admin/settings.php'); include(YP_PLUGIN_DIR . 'admin/lib/subscription-cancellation.php'); /* ---------------------------------------------------- */ /* Register YellowPencil Panel /* ---------------------------------------------------- */ function wyp_yellow_penci_bar() { $yellow_pencil_uri = wyp_get_uri(); // Get protocol $protocol = is_ssl() ? 'https' : 'http'; // Href $hrefA = $_GET['href']; // Update protocol. if(strstr($hrefA,'://') == true){ $hrefNew = explode("://",$hrefA); $hrefNew = $protocol.'://'.$hrefNew[1]; }elseif(strstr($hrefA,'://') == false){ $hrefNew = $protocol.'://'.$hrefA; } // Page Link $hrefNew = esc_url($hrefNew); // YP Rand, Not must $hrefNew = add_query_arg(array('wyp_rand' => rand(136900, 963100)), $hrefNew); // Creating LiveLink. Intval filter disabled on wyp_page_id because yp using alpa for some page types. $liveLink = add_query_arg(array('wyp_live_preview' => 'true', 'wyp_page_id' => $_GET['wyp_page_id'], 'wyp_page_type' => trim(wp_strip_all_tags($_GET['wyp_page_type'])), 'wyp_rand' => rand(136900, 963100)), $hrefNew); // if isset out, set wyp_out to live preview if(isset($_GET['wyp_out'])){ $liveLink = add_query_arg(array('wyp_out' => 'true'), $liveLink); } $liveLink = str_replace("&", "&", $liveLink); $liveLink = str_replace("&", "&", $liveLink); echo "
Saved
"; echo "
"; echo "
"; echo "
".wyp_customizing_options()."
No element selected
"; // Options include( YP_PLUGIN_DIR . 'editor/lib/properties.php' ); echo "
Select any element on the page to start making changes.
"; echo ""; echo "
"; // Editor panel echo "
"; } // Check if it is demo mode function wyp_check_demo_mode() { // Demo mode avaiable for just non-logout users. if (defined('WT_DEMO_MODE') && is_user_logged_in() == false) { define('YP_DEMO_MODE', TRUE); } } add_action("init", "wyp_check_demo_mode"); /* ---------------------------------------------------- */ /* Add animation ajax callback /* ---------------------------------------------------- */ function wyp_add_animation() { if (current_user_can("edit_theme_options") == true && check_admin_referer("wyp_editor_nonce")) { $css = wp_strip_all_tags($_POST['wyp_anim_data']); $name = wp_strip_all_tags($_POST['wyp_anim_name']); if (!update_option("yp_anim_" . $name, $css)) { add_option("yp_anim_" . $name, $css); } } wp_die(); } add_action('wp_ajax_wyp_add_animation', 'wyp_add_animation'); /* ---------------------------------------------------- */ /* Download from unsplash and upload to wp /* ---------------------------------------------------- */ function wyp_unsplash_api(){ // Let if(current_user_can("upload_files") && check_admin_referer("wyp_editor_nonce")){ global $wpdb; $attachments = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_title = '".esc_sql($_POST["wyp_id"])."' AND post_type = 'attachment' ", OBJECT); if($attachments){ $attachment_url = $attachments[0]->guid; die($attachment_url); } // The URL $url = $_POST["wyp_link"]."&.jpg"; // TMP $tmp = download_url($url, 60); // Error Check if(is_wp_error($tmp)){ die("There is a problem with downloading the image from the remote server. please increase the file upload size limit and try again."); } // Array $file_array = array(); // Name $file_array['name'] = $_POST["wyp_id"].".jpg"; $file_array['tmp_name'] = $tmp; // Error Check if ( is_wp_error( $tmp ) ) { wp_delete_file($file_array['tmp_name']); $file_array['tmp_name'] = ''; die("This image file seems to be invalid."); } // do the validation and storage stuff $id = media_handle_sideload($file_array, 0, $_POST["wyp_id"]); // If error storing permanently, unlink if (is_wp_error($id)){ wp_delete_file($file_array['tmp_name']); die("There is a problem with uploading the image to WordPress. please increase the file upload size limit and try again."); } // Print Result die(wp_get_attachment_url($id)); } } add_action('wp_ajax_wyp_unsplash_api', 'wyp_unsplash_api'); /* ---------------------------------------------------- */ /* Saving live option with ajax /* ---------------------------------------------------- */ function wyp_save_live_option() { // If User can edit theme options if (current_user_can("edit_theme_options") == true && check_admin_referer("wyp_editor_nonce")) { // Get Value $name = wp_strip_all_tags($_POST['wyp_option_name']); $value = wp_strip_all_tags($_POST['wyp_option_value']); // Update Option with yp_op_ prefix if (!update_option("yp_op_" . $name, $value)) { add_option("yp_op_" . $name, $value); } } // Die wp_die(); } add_action('wp_ajax_wyp_live_save_option', 'wyp_save_live_option'); /* ---------------------------------------------------- */ /* Reading live options /* ---------------------------------------------------- */ function wyp_get_live_option($name){ // IF Pro and hides preimum options, show all if($name == "hide_premium_options" && defined("WTFV") == true){ return "false"; } // Database Option $option = get_option("yp_op_".$name); // If no option on database, read defaults if($option === null || $option === false){ // YP Defaults $defaultOption = array( 'fixed_right_panel' => false, 'fixed_left_bar' => true, 'hide_premium_options' => false, 'show_css_selector' => false, 'smart_responsive_technology' => true, 'smart_important_tag' => true, 'append_auto_comments' => true ); // Get after filters $data = apply_filters( 'yp_'.$name, $defaultOption[$name]); if($data){ return "true"; }else{ return "false"; } }else{ return $option; } } /* ---------------------------------------------------- */ /* Saving selector comments /* ---------------------------------------------------- */ function wyp_save_comments_option() { // Get nonce $nonce = $_REQUEST["_wpnonce"]; // If User can edit theme options if (current_user_can("edit_theme_options") == true && wp_verify_nonce($nonce, "wyp_editor_nonce")) { // Get Value $value = wp_strip_all_tags($_POST['wyp_selector_comments']); // IS Valid json_decode(wp_unslash($value)); if(json_last_error() === JSON_ERROR_NONE || empty($value)){ // Update Option with yp_op_ prefix if (!update_option("yp_selector_comments", $value)) { add_option("yp_selector_comments", $value); } }else{ wp_die("json_error"); } }else{ if(current_user_can("edit_theme_options") == true){ wp_die("nonce_error"); }else{ wp_die("authorized_error"); } } // Die wp_die(); } add_action('wp_ajax_wyp_save_comments_option', 'wyp_save_comments_option'); /* ---------------------------------------------------- */ /* Ajax check plugin license /* ---------------------------------------------------- */ function wyp_check_license() { if (current_user_can("edit_theme_options") == true && check_admin_referer("wyp_editor_nonce")) { $key = get_option("yp_purchase_code"); if($key === null || $key === false){ die("0"); }else{ die("1"); } } } add_action('wp_ajax_wyp_check_license', 'wyp_check_license'); /* ---------------------------------------------------- */ /* Delete Stylesheets /* ---------------------------------------------------- */ function wyp_delete_customization($type, $value) { if(current_user_can("edit_theme_options")){ // Specific single types if($value == "lostpassword" || $value == "register" || $value == "login" || $value == "home"){ $type = "TYPE"; } // delete global data. if($type == "GLOBAL"){ delete_option('wt_css'); delete_option('wt_styles'); } // delete Post type. if($type == "TYPE"){ $reset_type = trim(wp_strip_all_tags($value)); delete_option('wt_'.$value.'_css'); delete_option('wt_'.$value.'_styles'); } // delete by id. if($type == "ID"){ delete_post_meta(intval($value),'_wt_css'); delete_post_meta(intval($value),'_wt_styles'); } } } /* ---------------------------------------------------- */ /* Delete Stylesheets, animations with ajax /* ---------------------------------------------------- */ function wyp_delete_stylesheet_live() { if(current_user_can("edit_theme_options") == true && check_admin_referer('wyp_live_styles_delete_nonce')){ // delete global data. if(isset($_POST['wyp_reset_global'])){ delete_option('wt_css'); delete_option('wt_styles'); } // delete anim if(isset($_POST['wyp_delete_animate']) && empty($_POST['wyp_delete_animate']) == false){ delete_option(trim(wp_strip_all_tags(($_POST['wyp_delete_animate'])))); } // delete Post type. if(isset($_POST['wyp_reset_type']) && empty($_POST['wyp_reset_type']) == false){ $reset_type = trim( wp_strip_all_tags( $_POST['wyp_reset_type'] ) ); delete_option('wt_'.$reset_type.'_css'); delete_option('wt_'.$reset_type.'_styles'); } // delete by id. if(isset($_POST['wyp_reset_id']) && empty($_POST['wyp_reset_id']) == false){ delete_post_meta(intval($_POST['wyp_reset_id']),'_wt_css'); delete_post_meta(intval($_POST['wyp_reset_id']),'_wt_styles'); } // delete options if(isset($_POST['wyp_reset_options'])){ // Delete selector comment delete_option('yp_selector_comments'); // Settings page delete_option('yp-output-option'); delete_option('yp-draft-mode'); delete_option('yp-default-global'); // Delete all other options starts with yp_op_ global $wpdb; $prefix = "yp_op_"; $options = $wpdb->get_results($wpdb->prepare("SELECT option_name,option_value FROM {$wpdb->options} WHERE option_name LIKE %s", $prefix . '%'), ARRAY_A); if (!empty($options)) { foreach ($options as $v) { delete_option($v['option_name']); } } } // Get All CSS data as ready-to-use $output = wyp_get_export_css("create"); // Update custom.css file wyp_create_custom_css($output); } wp_die(); } add_action('wp_ajax_wyp_delete_stylesheet_live', 'wyp_delete_stylesheet_live'); /* ---------------------------------------------------- */ /* GET UPDATE API /* ---------------------------------------------------- */ $update_dir = YP_PLUGIN_DIR.'/admin/lib/update-support.php'; if(defined('YP_PRO_DIRECTORY') && file_exists($update_dir)){ require_once(YP_PLUGIN_DIR.'/admin/lib/update-support.php'); } /* ---------------------------------------------------- */ /* Delete some options when uninstall /* ---------------------------------------------------- */ if (function_exists('register_uninstall_hook')){ register_uninstall_hook(__FILE__, 'uninstall_yellow_pencil'); } /* ---------------------------------------------------- */ /* delete some options on uninstall /* ---------------------------------------------------- */ function uninstall_yellow_pencil() { delete_option('yp_purchase_code'); } /* ---------------------------------------------------- */ /* Add a customize link in wp plugins page /* ---------------------------------------------------- */ function wyp_plugin_action_links($links) { $links[] = 'Customize'; $links[] = 'Manage Customizations'; if(!defined("WTFV")){ $links[] = 'Go Pro'; } return $links; } add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), 'wyp_plugin_action_links' ); /* ---------------------------------------------------- */ /* Update default custom css directory for 7.2.2 /* ---------------------------------------------------- */ function wyp_new_custom_css_directory(){ $newCustom = get_option('yp_new_custom_CSS_dir'); // one time only. if($newCustom === false){ // by this point, the $wp_filesystem global should be working, so let's use it to create a file global $wp_filesystem; // Initialize the WP filesystem, no more using 'file-put-contents' function if (empty($wp_filesystem)) { require_once(ABSPATH . '/wp-admin/includes/file.php'); WP_Filesystem(); } // Delete all old custom-x.css files in plugin directory because anymore creating in uploads folder. $files = glob(YP_PLUGIN_DIR . 'custom-*.css'); // then delete old revisions before create new. foreach($files as $file){ $wp_filesystem->delete($file); } // Update custom css wyp_update_custom_css_callback(); // Add a option to define the changed. add_option("yp_new_custom_CSS_dir", "1"); } } add_action("init", "wyp_new_custom_css_directory"); /* ---------------------------------------------------- */ /* Get ID of rule /* ---------------------------------------------------- */ function wyp_css_id($css){ // No webkit $css = str_replace("-webkit-", "", $css); // Update transfrom parts if(strrpos($css, "-transform") !== false && $css != 'text-transform'){ $css = 'transform'; } // Update filter parts if(strrpos($css, "-filter") !== false){ $css = 'filter'; } // Update filter parts if(strrpos($css, "box-shadow-") !== false){ $css = 'box-shadow'; } // Return return $css; } /* ---------------------------------------------------- */ /* Get Font Families /* ---------------------------------------------------- */ function wyp_load_fonts() { $css = wyp_get_css(true); wyp_get_font_families($css, null); } /* ---------------------------------------------------- */ /* Update database for 7.0.0 */ /* ---------------------------------------------------- */ function wyp_database_update(){ $databaseUpdated = get_option('yp_700_db_updateX'); // one time only. if($databaseUpdated === false){ global $wpdb; // Find data in options $options = $wpdb->get_results("SELECT option_name,option_value FROM {$wpdb->options} WHERE option_name REGEXP '^wt_.*_?styles$'", ARRAY_A); // if array not empty if (!empty($options)) { // loop foreach ($options as $option) { // convert old data to new data $newData = wyp_convert_new_data($option['option_value']); // update update_option($option['option_name'], $newData); } } // Find data in metaOptions $metaOptions = $wpdb->get_results("SELECT post_id,meta_key,meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_wt_styles'", ARRAY_A); // if array not empty if (!empty($metaOptions)) { // loop foreach ($metaOptions as $option) { // convert old data to new data $newData = wyp_convert_new_data($option['meta_value']); // update update_post_meta($option['post_id'], $option['meta_key'], $newData); } } // add option for not convert again. add_option("yp_700_db_updateX", "1"); } } add_action("init", "wyp_database_update"); /* ---------------------------------------------------- */ /* Convert old data to new data 7.0.0 */ /* ---------------------------------------------------- */ function wyp_convert_new_data($data){ // empty if(empty($data)){ return $data; } // if not have a style tag if(strrpos($data, "'; // Print echo $return; // Animate library. if (strstr($onlyCSS, "animation-name:")) { wp_enqueue_style('yellow-pencil-animate', plugins_url('public/css/animate.css?wypver='.YP_VERSION.'', __FILE__)); } // Check if there any animation if (strstr($onlyCSS, "animation-name:") == true || strstr($onlyCSS, "animation-duration:") == true || strstr($onlyCSS, "animation-delay:") == true) { // Load library and jQuery wp_enqueue_script('yellow-pencil-library', plugins_url('public/js/animation-events.js?wypver='.YP_VERSION.'', __FILE__)); } } if(isset($_GET["yellow_pencil_frame"]) == false && isset($_GET['wyp_live_preview']) == false){ add_action('login_head', 'wyp_login_styles', 999999999); } /* ---------------------------------------------------- */ /* Getting CSS Codes /* ---------------------------------------------------- */ /* yp get css(false) : echo output CSS yp get css(true) : return just CSS Codes. */ function wyp_get_css($r = false) { $onlyCSS = ''; $get_type_option = ''; $get_post_meta = ''; global $wp_query; if (isset($wp_query->queried_object->ID)) { $id = @$wp_query->queried_object->ID; } else { $id = null; } if (class_exists('WooCommerce')) { if (is_shop()) { $id = wc_get_page_id('shop'); } } $get_option = get_option("wt_css"); // get post type $postType = get_post_type($id); // using "shop" type for shop page of woocommerce if (class_exists('WooCommerce')) { if (is_shop()) { $postType = "shop"; } } if ($id != null) { $get_post_meta = get_post_meta($id, '_wt_css', true); } if($postType != null){ $get_type_option = get_option("wt_" . $postType . "_css"); } if ($get_option == 'false') { $get_option = false; } if ($get_type_option == 'false') { $get_type_option = false; } if ($get_post_meta == 'false') { $get_post_meta = false; } if (empty($get_option) == false) { $onlyCSS .= $get_option; } // Load type and id only on singular pages if(is_singular()){ // dont load type on front and home page if(is_front_page() == false && is_home() == false){ if (empty($get_type_option) == false) { $onlyCSS .= $get_type_option; } } if (empty($get_post_meta) == false) { $onlyCSS .= $get_post_meta; } } // special for shop page of woocommerce if (class_exists('WooCommerce')) { if (is_shop()) { if (empty($get_type_option) == false) { $onlyCSS .= $get_type_option; } if (empty($get_post_meta) == false) { $onlyCSS .= $get_post_meta; } } } if (is_author()) { $onlyCSS .= get_option("wt_author_css"); } elseif (is_tag()) { $onlyCSS .= get_option("wt_tag_css"); } elseif (is_category()) { $onlyCSS .= get_option("wt_category_css"); } elseif (is_404()) { $onlyCSS .= get_option("wt_404_css"); } elseif (is_search()) { $onlyCSS .= get_option("wt_search_css"); } elseif (is_archive()) { $onlyCSS .= get_option("wt_archive_css"); } // home. if (is_front_page() && is_home()) { $onlyCSS .= get_option("wt_home_css"); } // blog if(get_option("show_on_front") == "page"){ $page_for_posts = get_option('page_for_posts'); }else{ $page_for_posts = 0; } // Don't load type on front and posts page if(is_home() && $page_for_posts != 0){ $get_post_meta = get_post_meta($page_for_posts, '_wt_css', true); $onlyCSS .= $get_post_meta; } // Get animations $all_options = wp_load_alloptions();foreach ($all_options as $name => $value) {if (stristr($name, 'yp_anim')) {$onlyCSS .= $value . str_replace("keyframes", "-webkit-keyframes", $value);}} // Delete CSS Comments $onlyCSS = preg_replace("!/\*[^*]*\*+([^/][^*]*\*+)*/!","", $onlyCSS); // Delete HTML tags from pure CSS $onlyCSS = wp_strip_all_tags($onlyCSS); if ($onlyCSS != '' && $r == false) { $return = ''; echo $return; } if ($r == true) { return $onlyCSS; } } // If is dynamic inline. if (get_option('yp-output-option') != 'external') { // Adding all CSS codes to Website if (isset($_GET['yellow_pencil_frame']) == false && isset($_GET['wyp_live_preview']) == false) { // Add action if not draft mode if(get_option('yp-draft-mode') != '1'){ add_action('wp_head', 'wyp_get_css', 999999999); } } } /* ---------------------------------------------------- */ /* Getting Live Preview CSS /* ---------------------------------------------------- */ function wyp_get_live_css() { // Get recent generated CSS codes. $css = get_option('yp_live_view_css_data'); $all_options = wp_load_alloptions();foreach ($all_options as $name => $value) {if (stristr($name, 'yp_anim')) {$css .= $value . str_replace("keyframes", "-webkit-keyframes", $value);}} if (empty($css)) { return $css; } return wp_unslash(wyp_auto_prefix($css)); } /* ---------------------------------------------------- */ /* Used for find page details by URL /* ---------------------------------------------------- */ function show_page_details() { // only allowed users can see it if(current_user_can("edit_theme_options") || defined('YP_DEMO_MODE')){ // getting informations $data = wyp_get_page_ids(); $page_id = $data[0]; $page_type = $data[1]; $edit_mode = $data[2]; // This adding all informations to head of the page, // the plugin will get these information with javascript functions // for open the target page in the editor echo ""; } } // Hook only if get wyp_get_details if(isset($_POST['wyp_get_details'])){ add_action('wp_head', 'show_page_details', 999999999); } /* ---------------------------------------------------- */ /* Getting fonts for live preview /* ---------------------------------------------------- */ function wyp_load_fonts_for_live() { $css = wyp_get_live_css(); wyp_get_font_families($css, null); } /* ---------------------------------------------------- */ /* Getting fonts for admin live /* ---------------------------------------------------- */ function wyp_load_fonts_for_admin_live() { $css = wyp_get_live_css(); wyp_get_font_families($css, null); } /* ---------------------------------------------------- */ /* Getting fonts for admin /* ---------------------------------------------------- */ function wyp_load_fonts_for_admin() { $css = wyp_login_styles(true); wyp_get_font_families($css, null); } /* ---------------------------------------------------- */ /* Generating Live Preview data /* ---------------------------------------------------- */ function wyp_get_live_preview() { $css = wyp_get_live_css(); if($GLOBALS['pagenow'] === 'wp-login.php'){ // Animate library. if (strstr($css, "animation-name:")) { wp_enqueue_style('yellow-pencil-animate', plugins_url('public/css/animate.css?wypver='.YP_VERSION.'', __FILE__)); } // Check if there any animation if (strstr($css, "animation-name:") == true || strstr($css, "animation-duration:") == true || strstr($css, "animation-delay:") == true) { // Load library and jQuery wp_enqueue_script('yellow-pencil-library', plugins_url('public/js/animation-events.js?wypver='.YP_VERSION.'', __FILE__)); } } if (empty($css) == false) { $css = preg_replace("!/\*[^*]*\*+([^/][^*]*\*+)*/!","", $css); // min $css = str_replace(array( "\n", "\r", "\t" ), '', $css); $css = ''; if ($css != '') { echo $css; } } } /* ---------------------------------------------------- */ /* Adding generated live preview CSS data To WP HEAD /* ---------------------------------------------------- */ if (isset($_GET['wyp_live_preview']) == true) { add_action('wp_head', 'wyp_get_live_preview', 999999999); add_action('login_head', 'wyp_get_live_preview', 999999999); add_action('init', 'wyp_out_mode', 999999999); } /* ---------------------------------------------------- */ /* Adding Prefix To Some CSS Rules /* ---------------------------------------------------- */ function wyp_auto_prefix($css) { // last 4 version of browsers // 06.03.2021 // clean ms and webkit if available $css = preg_replace('@\t(-webkit-|-ms-)(.*?):(.*?);@si', "", $css); // Webkit prefixes $webkit = array( "column-count", "backdrop-filter", "transform", "box-shadow", "filter", "animation-fill-mode", "animation-timing-function", "transition-property", "transition-duration", "transition-timing-function", "flex-direction", "justify-content", "align-items", "column-gap", "row-gap", "animation-duration", "animation-delay", "animation-name", "backface-visibility", "transform-origin", "animation-iteration-count", "transition-delay", "perspective", "flex", "box-sizing", "flex-grow", "background-clip" ); // Ms prefixes $ms = array( "transform", "flex-direction", "justify-content", "align-items", "align-content", "flex-wrap", "grid-template-columns", "grid-template-rows", "transform-origin", "align-self", "flex", "flex-basis", "flex-shrink", "flex-grow" ); // Webkit foreach ($webkit as $prefix) { if($prefix == "justify-content"){ $css = preg_replace('@(? 90){ $deg = 360 - ($deg - 90)."deg"; } // Update gradient $gradient = preg_replace("/linear-gradient\(([^,]+)/", $deg, "linear-gradient(".$gradient); // top, left etc }else{ // to left.. if(preg_match('/to /i', $direction)){ if($direction == "to left"){ $direction = "right"; }else if($direction == "to right"){ $direction = "left"; }else if($direction == "to top"){ $direction = "bottom"; }else if($direction == "to bottom"){ $direction = "top"; } // Update Gradient $gradient = preg_replace("/linear-gradient\(([^,]+)/", $direction, "linear-gradient(".$gradient); } } } } // Default no important $important = ""; // Checks important tag if(isset($match[6])){ $important = " ".$match[6]; } // Generate result gradient $result = $match[1].":-webkit-linear-gradient(".$gradient.")".$important.";\r\t"; $result .= $match[1].":-o-linear-gradient(".$gradient.")".$important.";\r\t"; $result .= $match[1].":linear-gradient(".$gradientOriginal.")".$important.";"; // return result return $result; } } // linear gradient support (-webkit-gradient is not supported) $css = preg_replace_callback("@(background-image|background)(\s+)?:(\s+)?linear-gradient\((.*?)\)(\s+)?(\!important)?;@i", 'wyp_linear_gradient_support', $css); return $css; } /* ---------------------------------------------------- */ /* Prefix for Animations EXPORT /* ---------------------------------------------------- */ function wyp_export_animation_prefix($outputCSS) { return str_replace(array( ".yp_hover", ".yp_focus" ), array( ":hover", ":focus" ), $outputCSS); } /* ---------------------------------------------------- */ /* Adding no-index meta to head for demo mode YP Links! */ /* ---------------------------------------------------- */ function wyp_head_meta() { echo '' . "\n"; } /* ---------------------------------------------------- */ /* Shows the frame as visitor to logged user /* ---------------------------------------------------- */ function wyp_out_mode() { if (isset($_GET['wyp_out']) && current_user_can("edit_theme_options")) { wp_set_current_user(-1); } } /* ---------------------------------------------------- */ /* Advanced link replacer /* ---------------------------------------------------- */ function wyp_advanced_link_replace($match){ // be sure this is stylesheet if(!preg_match("/rel=(\"|\')?stylesheet(\"|\')?/", $match[0])){ return $match[0]; } // not available if(!isset($match[4])){ return $match[0]; } // The link href $linkHref = $match[4]; $domain = get_site_url(); $domainParsed = wp_parse_url($domain); $linkHrefParsed = wp_parse_url($linkHref); // Skip if link is relative if(isset($domainParsed["host"]) === false || isset($linkHrefParsed["host"]) === false){ return $match[0]; } $domainHasWWW = true; if(!preg_match('/^www\./', $domainParsed["host"])){ $domainHasWWW = false; } $linkHasWWW = true; if(!preg_match('/^www\./', $linkHrefParsed["host"])){ $linkHasWWW = false; } $noWWWDomain = preg_replace("/^www\./", "", $domainParsed["host"]); $noWWWHref = preg_replace("/^www\./", "", $linkHrefParsed["host"]); // is same domain if($noWWWDomain === $noWWWHref && isset($domainParsed["scheme"]) && isset($linkHrefParsed["scheme"])){ // www is not same if($domainHasWWW !== $linkHasWWW){ if($domainHasWWW){ $linkHrefParsed["host"] = "www.".$linkHrefParsed["host"]; }else{ $linkHrefParsed["host"] = $noWWWHref; } } if($domainParsed["scheme"] !== $linkHrefParsed["scheme"]){ $linkHrefParsed["scheme"] = $domainParsed["scheme"]; } // Parse $linkHref = wyp_unparse_url($linkHrefParsed); // Return return preg_replace('@href=(\s+)?(\"|\')?(.*?)(\"|\')@', "href=$1$2".$linkHref."$4", $match[0]); } // return original value return $match[0]; } // reverse parsed_url */ function wyp_unparse_url($parts){ $scheme = isset($parts['scheme']) ? ($parts['scheme'] . '://') : ''; $host = isset($parts['host']) ? $parts['host'] : ''; $port = isset($parts['port']) ? (':' . $parts['port']) : ''; $user = isset($parts['user']) ? $parts['user'] : ''; $pass = isset($parts['pass']) ? (':' . $parts['pass']) : ''; $pass = ($user || $pass) ? ($pass . '@') : ''; $path = isset($parts['path']) ? $parts['path'] : ''; $query = empty($parts['query']) ? '' : ('?' . $parts['query']); $fragment = empty($parts['fragment']) ? '' : ('#' . $parts['fragment']); return implode('', [$scheme, $user, $pass, $host, $port, $path, $query, $fragment]); } /* ---------------------------------------------------- */ /* Prepare the CSS links before load the page /* ---------------------------------------------------- */ function wyp_link_replace($buffer){ // Replace links $buffer = preg_replace_callback('@\]+)href=(\s+)?(\"|\')(.*?)(\s+)?(\"|\')([^>]+)?>@', "wyp_advanced_link_replace", $buffer); return $buffer; } /* ---------------------------------------------------- */ /* Adding other CSS Data to Editor frame /* ---------------------------------------------------- */ if (isset($_GET['yellow_pencil_frame'])) { add_action('wp_head', 'wyp_head_meta', 9997); add_action('init', 'wyp_out_mode', 9996); ob_start("wyp_link_replace"); } /* ------------------------------------------------------------------- */ /* Other CSS Codes (All CSS Codes excluding current editing type CSS) /* ------------------------------------------------------------------- */ function wyp_editor_styles($id, $type, $mode) { $get_type_option = ''; $get_post_meta = ''; $id_is = false; $type_is = false; if($mode == 'template'){ $type_is = true; }else if($mode == 'single'){ $id_is = true; } $global = ''; $template = ''; $single = ''; // Get Global, template, single data $get_option = get_option("wt_styles"); $get_type_option = get_option("wt_" . $type . "_styles"); if($type == "lostpassword" || $type == "register" || $type == "login"){ $get_post_meta = get_option("wt_" . $type . "_styles"); }else{ $get_post_meta = get_post_meta($id, '_wt_styles', true); } // get global data if (empty($get_option) == false && $type != "lostpassword" && $type != "register" && $type != "login") { $global .= $get_option; } // Not load page template to Blog Page and Front Page if(get_option("show_on_front") == "page"){ $FrontPage = get_option('page_on_front'); $BlogPage = get_option('page_for_posts'); }else{ $FrontPage = 0; $BlogPage = 0; } // get template data if (empty($get_type_option) == false) { if($type != 'author' && $type != 'tag' && $type != 'category' && $type != '404' && $type != 'search' && $type != 'home' && $type != 'archive' && $type != "lostpassword" && $type != "register" && $type != "login"){ if($id != $FrontPage && $id != $BlogPage){ $template .= $get_type_option; }else if($id === 0){ $template .= $get_type_option; } } } // get single data if (empty($get_post_meta) == false) { $single .= $get_post_meta; } // Advanced types if ($type == 'author') { $template .= get_option("wt_author_styles"); } if ($type == 'tag') { $template .= get_option("wt_tag_styles"); } if ($type == 'category') { $template .= get_option("wt_category_styles"); } if ($type == 'archive') { $template .= get_option("wt_archive_styles"); } if ($type == '404') { $template .= get_option("wt_404_styles"); } if ($type == 'search') { $template .= get_option("wt_search_styles"); } if ($type == 'home') { $single .= get_option("wt_home_styles"); } // Get animations $animations = ''; $all_options = wp_load_alloptions();foreach ($all_options as $name => $value) {if (stristr($name, 'yp_anim')) {$animations .= $value . str_replace("keyframes", "-webkit-keyframes", $value);}} // empty vars $globalActive = ''; $templateActive = ''; $singleActive = ''; // add wyp-styles-area to active if($id_is && wyp_type_is_available("single")){ $singleActive = ' id="wyp-styles-area"'; }else if($type_is && wyp_type_is_available("template")){ $templateActive = ' id="wyp-styles-area"'; }else{ $globalActive = ' id="wyp-styles-area"'; } // Data Layout $return = '
'; // return editor data echo wp_unslash($return); } /* ---------------------------------------------------- */ /* Include options Library /* ---------------------------------------------------- */ include_once(YP_PLUGIN_DIR . 'editor/lib/options-controller.php'); /*-------------------------------------------------------*/ /* Ajax Preview Save CallBack /*-------------------------------------------------------*/ function wyp_preview_data_save() { $nonce = $_REQUEST["_wpnonce"]; if (current_user_can("edit_theme_options") == true && wp_verify_nonce($nonce, "wyp_editor_nonce")) { $css = wp_strip_all_tags($_POST['wyp_data']); if (!update_option('yp_live_view_css_data', $css)) { add_option('yp_live_view_css_data', $css); } }else{ if(current_user_can("edit_theme_options") == true){ wp_die("nonce_error"); }else{ wp_die("authorized_error"); } } wp_die(); } add_action('wp_ajax_wyp_preview_data_save', 'wyp_preview_data_save'); /*-------------------------------------------------------*/ /* Creating an Custom.css file (Static) /*-------------------------------------------------------*/ function wyp_create_custom_css($data) { // by this point, the $wp_filesystem global should be working, so let's use it to create a file global $wp_filesystem; // Initialize the WP filesystem, no more using 'file-put-contents' function if (empty($wp_filesystem)) { require_once(ABSPATH . '/wp-admin/includes/file.php'); WP_Filesystem(); } // Revisions $rev = get_option('yp_revisions'); if ($rev == false) { $rev = 700; } // CSS Upload Directory $uploads_dir = wp_upload_dir()["basedir"] . '/yellow-pencil/'; // Create folder if not available if(!is_dir($uploads_dir)){ $wp_filesystem->mkdir($uploads_dir); } // Find all other old revisions $files = glob($uploads_dir . 'custom-*.css'); // then delete old revisions before create new. foreach($files as $file){ $wp_filesystem->delete($file); } // get the upload directory and make a test.txt file $filename = $uploads_dir . 'custom-' . $rev . '.css'; if($data === NULL){ $data = ""; } if (!$wp_filesystem->put_contents($filename, $data, FS_CHMOD_FILE)) { echo 'Yellow Pencil: There was an error creating the custom.css file, please use "Dynamic Inline CSS" option.'; } } /*-------------------------------------------------------*/ /* Ajax Real Save Callback /*-------------------------------------------------------*/ function wyp_ajax_save() { $nonce = $_REQUEST['_wpnonce']; if (current_user_can("edit_theme_options") == true && wp_verify_nonce($nonce, "wyp_editor_nonce")) { // Revisions $currentRevision = get_option('yp_revisions'); // Update revision. if ($currentRevision != false) { update_option('yp_revisions', $currentRevision + 1); } else { add_option('yp_revisions', "1"); } // Getting data $css = wp_strip_all_tags($_POST['wyp_data']); $styles = trim(wp_strip_all_tags($_POST['wyp_editor_data'])); // replace ] */ to fix ajax problems. $styles = str_replace("YPOGRP", "/* [", $styles); $styles = str_replace("YPEGRP", "] */", $styles); $id = ''; $type = ''; if (isset($_POST['wyp_page_id']) && empty($_POST['wyp_page_id']) == false) { $id = intval($_POST['wyp_page_id']); } if (isset($_POST['wyp_page_type']) && empty($_POST['wyp_page_type']) == false) { $type = trim(wp_strip_all_tags($_POST['wyp_page_type'])); if (count(explode("#", $type)) == 2) { $type = explode("#", $type); $type = $type[0]; } } // Global if ($id == '' && $type == '') { // CSS Data if (empty($css) == false) { if (!update_option('wt_css', $css)) { add_option('wt_css', $css); } } else { delete_option('wt_css'); } // Styles if (empty($css) == false) { if (!update_option('wt_styles', $styles)) { add_option('wt_styles', $styles); } } else { delete_option('wt_styles'); } // ID } elseif ($type == '') { // CSS Data if (empty($css) == false) { if (!update_post_meta($id, '_wt_css', wp_slash($css))) { add_post_meta($id, '_wt_css', wp_slash($css), true); } } else { delete_post_meta($id, '_wt_css'); } // Styles if (empty($css) == false) { if (!update_post_meta($id, '_wt_styles', wp_slash($styles))) { add_post_meta($id, '_wt_styles', wp_slash($styles), true); } } else { delete_post_meta($id, '_wt_styles'); } // Type } else { // CSS Data if (empty($css) == false) { if (!update_option('wt_' . $type . '_css', $css)) { add_option('wt_' . $type . '_css', $css); } } else { delete_option('wt_' . $type . '_css'); } // Styles if (empty($css) == false) { if (!update_option('wt_' . $type . '_styles', $styles)) { add_option('wt_' . $type . '_styles', $styles); } } else { delete_option('wt_' . $type . '_styles'); } } }else{ if(current_user_can("edit_theme_options") == true){ wp_die("nonce_error"); }else{ wp_die("authorized_error"); } } wp_die(); } add_action('wp_ajax_wyp_ajax_save', 'wyp_ajax_save'); /*-------------------------------------------------------*/ /* Ajax Real Save Callback /*-------------------------------------------------------*/ function wyp_ajax_update_css() { if (current_user_can("edit_theme_options") == true && check_admin_referer("wyp_editor_nonce")) { // Get All CSS data as ready-to-use $output = wyp_get_export_css("create"); // Update custom.css file wyp_create_custom_css($output); } wp_die(); } add_action('wp_ajax_wyp_ajax_update_css', 'wyp_ajax_update_css'); /* ---------------------------------------------------- */ /* Getting customizing type /* ---------------------------------------------------- */ function wyp_customizing_type() { $type = $_GET['wyp_mode']; $typeSelf = strtolower(ucfirst(trim(wp_strip_all_tags($_GET['wyp_page_type'])))); // Force Single if ($typeSelf == 'login' || $typeSelf == 'register' || $typeSelf == 'lostpassword') { return "single"; } // requested "Single" if available if ($type == 'single' && wyp_type_is_available('single')) { $result = "single"; // requested "Single" but if not available so setup "template" } elseif ($type == 'single' && wyp_type_is_available('template')) { $result = "template"; // requested "Template" if available } elseif ($type == 'template' && wyp_type_is_available('template')) { $result = "template"; // requested "Template" but if not available so setup "global" } elseif ($type == 'template' && wyp_type_is_available('global')) { $result = "global"; // use global } elseif ($type == 'global' && wyp_type_is_available('global')){ $result = "global"; } return $result; } /* ---------------------------------------------------- */ /* Checking if these type is available in current page /* ---------------------------------------------------- */ function wyp_type_is_available($gtype){ // Get page type $id = trim(wp_strip_all_tags($_GET['wyp_page_id'])); $type = trim(wp_strip_all_tags($_GET['wyp_page_type'])); // Single is disabled on these types if($gtype == 'single'){ if($type == 'author' || $type == 'tag' || $type == 'category' || $type == '404' || $type == 'search' || $type == 'archive'){ return false; } if($id == "0" && $type != 'home'){ return false; } } // Template is disabled on these types if($gtype == 'template'){ if($type == 'home' || $type == "general" || $type == "login" || $type == "register" || $type == "lostpassword"){ return false; } // get post page id if(get_option("show_on_front") == "page"){ $page_for_posts = get_option('page_for_posts'); $page_on_front = get_option('page_on_front'); }else{ $page_for_posts = 0; $page_on_front = 0; } // Template disabled on posts page if($id == $page_for_posts && $id != 0){ return false; } // Template disabled on front page if($id == $page_on_front && $id != 0){ return false; } } // Global disabled on these types if($gtype == "global"){ if($type == "lostpassword" || $type == "register" || $type == "login"){ return false; } } return true; } /* ---------------------------------------------------- */ /* Getting customizing types like a list /* ---------------------------------------------------- */ function wyp_customizing_options(){ // Get Current Type $type = wyp_customizing_type(); // nulls $singleSelected = ''; $templateSelected = ''; $globalSelected = ''; // disable single if(wyp_type_is_available('single') == false){ $singleSelected = 'type-disabled'; } // disable template if(wyp_type_is_available('template') == false){ $templateSelected = 'type-disabled'; } // disable global if(wyp_type_is_available('global') == false){ $globalSelected = 'type-disabled'; } // getting post type $page_type = $_GET['wyp_page_type']; // get slug label if (post_type_exists($page_type)){ $page_type = get_post_type_object($page_type); $page_type = $page_type->labels->singular_name; } $page_type = '"'.ucfirst(strtolower(trim(wp_strip_all_tags($page_type)))).'" template'; $defaultText = ""; $singleText = wyp_page_name(); $templateText = $page_type; $globalText = "Global"; // Select Current if($type == 'single' && $singleSelected != "type-disabled"){ $singleSelected = 'active-customizing-list'; $defaultText = $singleText; }else if($type == 'template' && $templateSelected != "type-disabled"){ $templateSelected = 'active-customizing-list'; $defaultText = $templateText; }else{ $globalSelected = 'active-customizing-list'; $defaultText = $globalText; } // start $result = "
"; return $result; } /* ---------------------------------------------------- */ /* Getting current name /* ---------------------------------------------------- */ function wyp_page_name(){ $limit = 24; $result = "Unknown"; // if page id isset if (isset($_GET['wyp_page_id'])) { // The id. $id = wp_strip_all_tags($_GET['wyp_page_id']); if($id == "lostpassword"){ return 'Lost Password Page'; } if($id == '404'){ return '404 Error Page'; } if($id == 'home'){ return 'Homepage'; } if($id == 'search'){ return 'Search Results'; } if(!is_numeric($id)){ return ''.ucfirst(strtolower($id)).' page'; } // Only Int $id = intval($id); $title = get_the_title($id); $slug = get_post_type($id); // get slug label if (post_type_exists($slug)){ $slug = get_post_type_object($slug); $slug = $slug->labels->singular_name; } $slug = strtolower($slug); $title = ucfirst(strtolower($title)); if (strlen($title) > ($limit-strlen($slug)) ) { $result = '"' . mb_substr($title, 0, $limit, 'UTF-8') . '…" ' . $slug . ''; } else { if ($title == '') { $title = "Untitled"; } $result = '"' . $title . '" '.$slug; } } return $result; } /* ---------------------------------------------------- */ /* Adding helper style for wp-admin-bar */ /* ---------------------------------------------------- */ function wyp_yellow_pencil_style() { echo ''; } /* ---------------------------------------------------- */ /* Trying to find all page information /* ---------------------------------------------------- */ function wyp_get_page_ids(){ global $wp_query; // Defaults $page_id = 0; $edit_mode = 'single'; $page_type = "general"; // Trying to getting the id if (isset($_GET['page_id']) && empty($_POST['page_id']) == false) { $page_id = intval($_GET['page_id']); } elseif (isset($_GET['post']) && empty($_GET['post']) == false && is_admin() == true) { $page_id = intval($_GET['post']); } elseif (isset($wp_query->queried_object->ID)) { $page_id = @$wp_query->queried_object->ID; } // Since 4.5.2 // category,author,tag, 404 and archive page support. $page_type = get_post_type($page_id); // Getting specials pages if (is_author()) { $page_id = "author"; $page_type = 'author'; $edit_mode = 'template'; } elseif (is_tag()) { $page_id = "tag"; $page_type = 'tag'; $edit_mode = 'template'; } elseif (is_category()) { $page_id = "category"; $page_type = 'category'; $edit_mode = 'template'; } elseif (is_404()) { $page_id = '404'; $page_type = '404'; $edit_mode = 'template'; } elseif (is_archive()) { $page_id = 'archive'; $page_type = 'archive'; $edit_mode = 'template'; } elseif (is_search()) { $page_id = 'search'; $page_type = 'search'; $edit_mode = 'template'; } // Homepage if (is_front_page() && is_home()) { $page_id = 'home'; $page_type = 'home'; $edit_mode = 'single'; } // WooCommerce Support if (class_exists('WooCommerce')) { // Shop Page if (is_shop()) { $page_id = wc_get_page_id('shop'); $page_type = 'shop'; $edit_mode = 'single'; } // Product Category and tag if (is_product_category() || is_product_tag()) { $page_id = 0; $page_type = "general"; $edit_mode = 'template'; } } if(empty($page_type)){ $page_type = "general"; } // Use global in elementor_library if($page_type === "elementor_library"){ $edit_mode = "global"; } return array($page_id, $page_type, $edit_mode); } /* ---------------------------------------------------- */ /* Adding menu to wp-admin-bar */ /* ---------------------------------------------------- */ function wyp_yellow_pencil_edit_admin_bar($bar) { // get data $data = wyp_get_page_ids(); // Getting page informations $page_id = $data[0]; $page_type = $data[1]; $edit_mode = $data[2]; // get global option $global_option = get_option("yp-default-global"); // use global instead of single if($edit_mode == "single" && $global_option == "1"){ $edit_mode = "global"; } // URL OF Editor $yellow_pencil_uri = wyp_get_uri(); // Getting current page $href = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $href = remove_query_arg("wyp_rand", $href); $href = remove_query_arg("fl_builder", $href); // beaver builder param $href = remove_query_arg("et_fb", $href); // divi param // Append Menu $args = array( 'id' => 'yp', 'title' => 'Edit With YellowPencil', 'href' => add_query_arg(array( 'href' => wyp_urlencode(esc_url($href)), 'wyp_page_id' => $page_id, 'wyp_page_type' => $page_type, 'wyp_mode' => $edit_mode ),$yellow_pencil_uri), 'meta' => array( 'class' => 'yp' )); // Add to wp admin bar $bar->add_node($args); } /* ---------------------------------------------------- */ /* Adding Body Classes /* ---------------------------------------------------- */ function wyp_public_body_classes( $classes ) { if(!is_user_logged_in()){ $classes[] = 'non-logged-in'; } return $classes; } add_filter( 'body_class','wyp_public_body_classes' ); function wyp_body_class($classes) { $classes[] = 'yp-yellow-pencil'; if (current_user_can("edit_theme_options") == false) { if (defined('YP_DEMO_MODE')) { $classes[] = 'yp-yellow-pencil-demo-mode'; } } if (!defined('WTFV')) { $classes[] = 'wtfv'; } return $classes; } /* ---------------------------------------------------- */ /* Customizing Type Iframe /* ---------------------------------------------------- */ function wyp_customize_type_frame() { add_submenu_page("wyp-welcome-screen", "Customizing Type", "Customizing Type", 'edit_theme_options', 'yellow-pencil-customize-type', 'wyp_customizing_type_frame'); } add_action('admin_menu', 'wyp_customize_type_frame'); /* ---------------------------------------------------- */ /* We need an blank page (hack) /* ---------------------------------------------------- */ function wyp_customizing_type_frame() { } add_action('load-admin_page_yellow-pencil-customize-type', 'wyp_customize_type_content'); /* ---------------------------------------------------- */ /* Customize Type Popup /* ---------------------------------------------------- */ function wyp_customize_type_content(){ include(YP_PLUGIN_DIR . 'editor/lib/customization-popup.php'); exit(); } /* ---------------------------------------------------- */ /* Install the plugin /* ---------------------------------------------------- */ function wyp_init() { // See Developer Documentation for more info. if (defined('YP_DEMO_MODE')) { include(YP_PLUGIN_DIR . 'editor/lib/demo-view.php'); } // Iframe Settings. // Disable admin bar in iframe // Add Classes to iframe body. // Add Styles for iframe. if (wyp_check_let_frame()) { show_admin_bar(false); add_filter('body_class', 'wyp_body_class'); } // If yellowpencil is active and theme support; // Adding Link to #wpadminbar. if (wyp_check_let()) { // If not admin page, Add Customizer link. if (is_admin() === false) { add_action('admin_bar_menu', 'wyp_yellow_pencil_edit_admin_bar', 999); // Adding CSS helper for admin bar link. add_action('wp_head', 'wyp_yellow_pencil_style'); } } // Getting Current font families. add_action('wp_enqueue_scripts', 'wyp_load_fonts'); add_action('login_enqueue_scripts', 'wyp_load_fonts_for_admin'); // Live preview if (isset($_GET['wyp_live_preview']) == true) { add_action('wp_enqueue_scripts', 'wyp_load_fonts_for_live'); } // Login preview if(isset($_GET['wyp_live_preview']) && $GLOBALS['pagenow'] === 'wp-login.php'){ add_action('login_enqueue_scripts', 'wyp_load_fonts_for_admin_live'); } } add_action("init", "wyp_init"); /* ---------------------------------------------------- */ /* Uploader Style /* ---------------------------------------------------- */ function wyp_uploader_style() { if (isset($_GET['wyp_uploader']) && $_GET['wyp_uploader'] == 1) { echo ''; } } add_action('admin_head', 'wyp_uploader_style'); /* ---------------------------------------------------- */ /* CSS library for YellowPencil /* ---------------------------------------------------- */ function wyp_register_styles() { // by this point, the $wp_filesystem global should be working, so let's use it to create a file global $wp_filesystem; // Initialize the WP filesystem, no more using 'file-put-contents' function if (empty($wp_filesystem)) { require_once(ABSPATH . '/wp-admin/includes/file.php'); WP_Filesystem(); } // Animate library for live preview if (isset($_GET['wyp_live_preview']) == true) { // Get CSS $css = wyp_get_live_css(); // Test Animation if (strstr($css, "animation-name:")) { wp_enqueue_style('yellow-pencil-animate', plugins_url('public/css/animate.css?wypver='.YP_VERSION.'', __FILE__)); } // No Live Preview }else{ // Get CSS $css = wyp_get_css(true); // Animate library. if (strstr($css, "animation-name:")) { // Website if(isset($_GET['yellow_pencil_frame']) == false){ // Load CSS if not draft mode if(get_option('yp-draft-mode') != '1'){ wp_enqueue_style('yellow-pencil-animate', plugins_url('public/css/animate.css?wypver='.YP_VERSION.'', __FILE__)); } } } } // Add Custom.css to website. if (isset($_GET['yellow_pencil_frame']) == false && isset($_GET['wyp_live_preview']) == false && get_option('yp-output-option') == 'external') { // If not draft mode if(get_option('yp-draft-mode') != '1'){ // New ref URL parameters on every new update. $rev = get_option('yp_revisions'); if ($rev == false) { $rev = 700; } // Get uploads directory $uploads_dir = wp_upload_dir()["basedir"] . '/yellow-pencil/'; // Get uploads URL $uploads_url = wp_upload_dir()["baseurl"] . '/yellow-pencil/'; // Custom CSS Href $href = add_query_arg('revision', $rev, $uploads_url . 'custom-' . $rev . '.css'); // First check if file is exists if($wp_filesystem->exists($uploads_dir . 'custom-'.$rev.'.css')){ // Getting file size of custom css $customCSSSize = $wp_filesystem->size($uploads_dir . 'custom-'.$rev.'.css'); // Add if($customCSSSize > 0){ wp_enqueue_style('wyp-custom', $href); } } } } } add_action('wp_enqueue_scripts', 'wyp_register_styles', 999999999); /* ---------------------------------------------------- */ /* Jquery plugins for CSS Engine /* ---------------------------------------------------- */ function wyp_register_scripts() { // if Not editor page if(isset($_GET['yellow_pencil_frame']) == false){ // Get live preview CSS if(isset($_GET["wyp_live_preview"])){ // add live preview CSS $css = get_option('yp_live_view_css_data'); // Get direct saved CSS }else{ // Get CSS data $css = wyp_get_css(true); } // Check if there any animation if (strstr($css, "animation-name:") == true || strstr($css, "animation-duration:") == true || strstr($css, "animation-delay:") == true) { // Live Preview if(isset($_GET["wyp_live_preview"])){ // Loads wp_enqueue_script('yellow-pencil-library', plugins_url('public/js/animation-events.js?wypver='.YP_VERSION.'', __FILE__)); // Website and If not draft mode }else if(get_option('yp-draft-mode') != '1'){ // Loads wp_enqueue_script('yellow-pencil-library', plugins_url('public/js/animation-events.js?wypver='.YP_VERSION.'', __FILE__)); } } } } add_action('wp_enqueue_scripts', 'wyp_register_scripts'); /* ---------------------------------------------------- */ /* Iframe Admin Page /* ---------------------------------------------------- */ function wyp_yellow_pencil_editor() { add_submenu_page("wyp-welcome-screen", "YellowPencil Editor", "YellowPencil Editor", 'edit_theme_options', 'yellow-pencil-editor', 'wyp_editor_func'); } add_action('admin_menu', 'wyp_yellow_pencil_editor'); /* ---------------------------------------------------- */ /* We need an blank page (hack) /* ---------------------------------------------------- */ function wyp_editor_func() { } add_action('load-admin_page_yellow-pencil-editor', 'wyp_frame_output'); /* ---------------------------------------------------- */ /* Custom Action yp_editor_header /* ---------------------------------------------------- */ function yp_editor_header() { do_action('yp_editor_header'); } /* ---------------------------------------------------- */ /* Custom Action yp_js_hook /* ---------------------------------------------------- */ function yp_js_hook() { do_action('yp_js_hook'); } /* ---------------------------------------------------- */ /* Custom Action yp_editor_footer /* ---------------------------------------------------- */ function yp_editor_footer() { do_action('yp_editor_footer'); } /* ---------------------------------------------------- */ /* Editor Page Markup /* ---------------------------------------------------- */ function wyp_frame_output() { // Get protocol $protocol = is_ssl() ? 'https' : 'http'; $protocol = $protocol . '://'; // Fix WooCommerce shop page bug if (class_exists('WooCommerce')) { $currentID = 0; $href = ''; // ID $currentID = intval($_GET['wyp_page_id']); // href $href = $_GET['href']; $type = $_GET['wyp_page_type']; $wyp_mode = $_GET['wyp_mode']; // get shop id $shopID = wc_get_page_id('shop'); // If current id is shop if ($currentID == $shopID && $type != "shop") { // Redirect wp_safe_redirect(admin_url('admin.php?page=yellow-pencil-editor&href=' . wyp_urlencode(esc_url(get_post_type_archive_link("product"))) . '&wyp_page_id=' . $shopID . '&wyp_page_type=shop&wyp_mode='.$wyp_mode)); exit; } } // Editor Markup include(YP_PLUGIN_DIR . 'editor/editor.php'); exit; } /* ---------------------------------------------------- */ /* Adding link to plugins page /* ---------------------------------------------------- */ add_filter('plugin_row_meta', 'wyp_plugin_links', 10, 2); function wyp_plugin_links($links, $file) { if ($file == plugin_basename(dirname(__FILE__) . '/yellow-pencil.php')) { $links[] = 'Documentation'; } return $links; } /* ---------------------------------------------------- */ /* Ading Prefix to CSS selectors for global export /* ---------------------------------------------------- */ function wyp_add_prefix_to_css_selectors($css, $prefix) { # Wipe all block comments $css = preg_replace('!/\*.*?\*/!s', '', $css); $parts = explode('}', $css); $mediaQueryStarted = false; foreach ($parts as &$part) { $part = trim($part); # Wht not trim immediately .. ? if (empty($part)) { continue; } else { # This else is also required $partDetails = explode('{', $part); if (substr_count($part, "{") == 2) { $mediaQuery = $partDetails[0] . "{"; $partDetails[0] = $partDetails[1]; $mediaQueryStarted = true; } $subParts = explode(',', $partDetails[0]); foreach ($subParts as &$subPart) { if (strstr(trim($subPart), "@") || strstr(trim($subPart), "%")) { continue; } else { // Selector $subPart = trim($subPart); // Array $subPartArray = explode(" ", $subPart); $low = strtolower($subPart); $lMatch = str_replace("-", "US7XZX", $low); $lMatch = str_replace("_", "TN9YTX", $lMatch); preg_match_all("/\bbody\b/i", $lMatch, $bodyAll); preg_match_all("/#body\b/i", $lMatch, $bodySlash); preg_match_all("/\.body\b/i", $lMatch, $bodyDot); preg_match_all("/\bhtml\b/i", $lMatch, $htmlAll); preg_match_all("/#html\b/i", $lMatch, $htmlSlash); preg_match_all("/\.html\b/i", $lMatch, $htmlDot); // Get index of "body" term. if (preg_match("/\bbody\b/i", $lMatch) && count($bodyAll[0]) > (count($bodyDot[0]) + count($bodySlash[0]))) { $i = 0; $index = 0; foreach ($subPartArray as $term) { $term = trim(strtolower($term)); if ($term == 'body' || preg_match("/^body\./i", $term) || preg_match("/^body\#/i", $term) || preg_match("/^body\[/i", $term)) { $index = $i; break; } $i++; } // Adding prefix class to Body $subPartArray[$index] = $subPartArray[$index] . $prefix; // Update Selector $subPart = implode(" ", $subPartArray); } else if (preg_match("/\bhtml\b/i", $lMatch) && count($htmlAll[0]) > (count($htmlDot[0]) + count($htmlSlash[0]))) { $i = 0; $index = 0; foreach ($subPartArray as $term) { $term = trim(strtolower($term)); if ($term == 'html' || preg_match("/^html\./i", $term) || preg_match("/^html\#/i", $term) || preg_match("/^html\[/i", $term)) { $index = $i; break; } $i++; } // Adding prefix class to Body if (count($subPartArray) <= 1) { if ($subPart != 'html' && preg_match("/^html\./i", $subPart) && preg_match("/^html\#/i", $subPart) && preg_match("/^html\[/i", $subPart)) { $subPartArray[$index] = $subPartArray[$index] . " body" . $prefix; } } else { $subPartArray[$index] = $subPartArray[$index] . " body" . $prefix; } // Update Selector $subPart = implode(" ", $subPartArray); } else { // Adding prefix class to Body $subPartArray[0] = "body" . $prefix . " " . $subPartArray[0]; // Update Selector $subPart = implode(" ", $subPartArray); } } } if (substr_count($part, "{") == 2) { $part = $mediaQuery . "\n" . implode(', ', $subParts) . "{" . $partDetails[2]; } elseif (empty($part[0]) && $mediaQueryStarted) { $mediaQueryStarted = false; $part = implode(', ', $subParts) . "{" . $partDetails[2] . "}\n"; //finish media query } else { if (isset($partDetails[1])) { # Sometimes, without this check, # there is an error-notice, we don't need that.. $part = implode(', ', $subParts) . "{" . $partDetails[1]; } } unset($partDetails, $mediaQuery, $subParts); # Kill those three.. } unset($part); # Kill this one as well } // Delete spaces $output = preg_replace('/\s+/', ' ', implode("} ", $parts)); // Delete all other spaces $output = str_replace("{ ", "{", $output); $output = str_replace(" {", "{", $output); $output = str_replace("} ", "}", $output); $output = str_replace("; ", ";", $output); // Beatifull > $output = str_replace("{", "{\n\t", $output); $output = str_replace("}", "\n}\n\n", $output); $output = str_replace("}\n\n\n", "}\n\n", $output); $output = str_replace("){", "){\n", $output); $output = str_replace(";", ";\n\t", $output); $output = str_replace("\t\n}", "}", $output); $output = str_replace("}\n\n}", "\t}\n\n}\n\n", $output); # Finish with the whole new prefixed string/file in one line return (trim($output)); } /* --------------------------------------------------------- */ /* Define Wtfv /* --------------------------------------------------------- */ function wyp_define_wtfv(){ // Get pcode $purchase_code = get_option("yp_purchase_code"); // check if($purchase_code){ if(!defined('WTFV')){ define('WTFV',TRUE); } } } add_action("init","wyp_define_wtfv"); /* --------------------------------------------------------- */ /* Encoding & Decoding the data; Used for import and export /* --------------------------------------------------------- */ function wyp_encode($value) { $func = 'base64' . '_encode'; return $func($value); } function wyp_decode($value) { $func = 'base64' . '_decode'; return $func($value); } /* ---------------------------------------------------- */ /* Getting All plugin options by prefix /* ---------------------------------------------------- */ function wyp_get_all_options($prefix = '', $en = false) { global $wpdb; $ret = array(); $options = $wpdb->get_results($wpdb->prepare("SELECT option_name,option_value FROM {$wpdb->options} WHERE option_name LIKE %s", $prefix . '%'), ARRAY_A); if (!empty($options)) { foreach ($options as $v) { if (strstr($v['option_name'], 'wt_theme') == false && strstr($v['option_name'], 'wt_available_version') == false && strstr($v['option_name'], 'wt_last_check_version') == false) { if ($en == true) { $ret[$v['option_name']] = wyp_encode($v['option_value']); } else { $ret[$v['option_name']] = wp_unslash($v['option_value']); } } } } return (!empty($ret)) ? $ret : false; } /* ---------------------------------------------------- */ /* Getting All post meta data by prefix /* ---------------------------------------------------- */ function wyp_get_all_post_options($prefix = '', $en = false) { global $wpdb; $ret = array(); $options = $wpdb->get_results($wpdb->prepare("SELECT post_id,meta_key,meta_value FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", $prefix . '%'), ARRAY_A); if (!empty($options)) { foreach ($options as $v) { if ($en == true) { $ret[$v['post_id'] . "." . $v['meta_key']] = wyp_encode($v['meta_value']); } else { $ret[$v['post_id'] . "." . $v['meta_key']] = wp_unslash($v['meta_value']); } } } return (!empty($ret)) ? $ret : false; } /* ---------------------------------------------------- */ /* Creating a json data for export data /* ---------------------------------------------------- */ function wyp_get_export_data() { $allData = array(); $postmeta_CSS = wyp_get_all_post_options('\_wt\_css', true); $postmeta_HTML = wyp_get_all_post_options('\_wt\_styles', true); $option_Data = wyp_get_all_options('wt\_', true); $option_Anims = wyp_get_all_options('yp\_anim', true); // @Ver 7.0.7 $option_Output = wyp_get_all_options('wyp-output-option', true); // output option $option_Comments = wyp_get_all_options('yp\_selector\_comments', true); // selector comments $option_Option = wyp_get_all_options('yp\_op\_', true); // Plugin options if (is_array($postmeta_CSS)) { array_push($allData, $postmeta_CSS); } if (is_array($postmeta_HTML)) { array_push($allData, $postmeta_HTML); } if (is_array($option_Data)) { array_push($allData, $option_Data); } if (is_array($option_Anims)) { array_push($allData, $option_Anims); } // @Ver 7.0.7 if (is_array($option_Output)) { array_push($allData, $option_Output); } if (is_array($option_Comments)) { array_push($allData, $option_Comments); } if (is_array($option_Option)) { array_push($allData, $option_Option); } if (empty($allData) == false) { $data = array_values($allData); $jsonData = json_encode($data); return $jsonData; } return false; } /* ---------------------------------------------------- */ /* Generate All CSS styles as ready-to-use /* ---------------------------------------------------- */ function wyp_get_export_css($method) { // Array $allData = array(); // Getting all from database $postmeta_CSS = wyp_get_all_post_options('\_wt\_css', false); $option_Data = wyp_get_all_options('wt\_', false); $option_Anims = wyp_get_all_options('yp\_anim', false); // Push option data to Array if (is_array($option_Data)) { array_push($allData, $option_Data); } // Push postmeta data to Array if (is_array($postmeta_CSS)) { array_push($allData, $postmeta_CSS); } // Check if there have animations if (is_array($option_Anims)) { // Push custom animations to Array array_push($allData, $option_Anims); // New Array for webkit prefix $option_AnimWebkit = array(); // Copy animations as webkit foreach ($option_Anims as $key => $animate) { $option_AnimWebkit["Webkit " . $key] = str_replace("@keyframes", "@-webkit-keyframes", $animate); } // Push Animations array_push($allData, $option_AnimWebkit); } // Be sure The data not empty if (empty($allData) == false) { // Clean array $data = array_values($allData); // Variables $output = null; $table = array(); $tableIndex = 0; $prefix = ''; // Adding WordPress Page, category etc classes to all CSS Selectors. foreach ($data as $nodes) { // set necessary order $orderArray = array( 'wt_css' => '', 'wt_post_css' => '', 'wt_page_css' => '', 'wt_search_css' => '', 'wt_tag_css' => '', 'wt_category_css' => '', 'wt_archive_css' => '', 'wt_author_css' => '', 'wt_404_css' => '', ); //apply it $nodes = array_filter(array_replace($orderArray, $nodes)); foreach ($nodes as $key => $css) { $tableIndex++; // skip style data options if (strstr($key, '_styles')) { continue; } // Skip admin CSS in custom.css if($key == "wt_login_css" || $key == "wt_lostpassword_css" || $key == "wt_register_css"){ continue; } // blog if(get_option("show_on_front") == "page"){ $page_for_posts = get_option('page_for_posts'); }else{ $page_for_posts = 0; } // dont add default home style to static home page if($key == "wt_home_css" && $page_for_posts != 0){ continue; } // If post meta if (strstr($key, '._')) { $keyArray = explode(".", $key); $postID = $keyArray[0]; $type = get_post_type($postID); $title = '"' . ucfirst(get_the_title($postID)) . '" ' . ucfirst($type) . ''; // Single post types if ($page_for_posts == $postID) { $prefix = '.blog'; } elseif ($type == 'page') { $prefix = '.page-id-' . $postID . ''; } else { $prefix = '.postid-' . $postID . ''; } // not have page-id class in WooCommerce shop page. if (class_exists('WooCommerce')) { $shopID = wc_get_page_id('shop'); if ($postID == $shopID) { $prefix = '.post-type-archive-product'; } } } else { if ($key == 'wt_css') { $title = 'Global Styles'; $prefix = ''; } else if ($key == 'wt_author_css') { $title = 'Author Page'; $prefix = '.author'; } else if ($key == 'wt_category_css') { $title = 'Category Page'; $prefix = '.category'; } else if ($key == 'wt_tag_css') { $title = 'Tag Page'; $prefix = '.tag'; } else if ($key == 'wt_404_css') { $title = '404 Error Page'; $prefix = '.error404'; } else if ($key == 'wt_search_css') { $title = 'Search Page'; $prefix = '.search'; } else if ($key == 'wt_home_css') { $title = 'Non-Static Homepage'; $prefix = '.home'; } else if ($key == 'wt_archive_css') { $title = 'Archive Page'; $prefix = '.archive'; } // If anim else if (strstr($key, 'yp_anim')) { $title = str_replace("yp_anim_", "", $key); $title = $title . " Animate"; // if post type } else if (strstr($key, 'wt_') && strstr($key, '_css')) { $title = str_replace("wt_", "", $key); $title = str_replace("_css", "", $title); if (strtolower($title) == 'page'){ $prefix = '.page:not(.home)'; } else if (strtolower($title) == 'shop'){ $prefix = '.post-type-archive-product'; } else { $prefix = '.single-' . strtolower($title) . ''; } $title = $title . " Template"; } } if(!isset($title)){ $title = "Unknown"; } $len = 48 - (strlen($title) + 2); $extra = null; for ($i = 1; $i < $len; $i++) { $extra .= ' '; } array_push($table, ucfirst($title)); $output .= "/*-----------------------------------------------*/\r\n"; $output .= "/* " . ucfirst($title) . "" . $extra . "*/\r\n"; $output .= "/*-----------------------------------------------*/\r\n"; $output .= wyp_add_prefix_to_css_selectors($css, $prefix) . "\r\n\r\n\r\n\r\n"; } } // Foreach end. // Create a table list for CSS codes $tableList = null; $plusNumber = 1; $googleFonts = array(); // Get fonts from CSS output if ($method == 'export') { $googleFonts = wyp_get_font_families($output, 'import'); } // If has any Google Font; Add Font familes to first table list. if (count($googleFonts) > 0) { $tableList = " 01. Font Families\r\n"; $plusNumber = 2; } // Creating a table list. foreach ($table as $key => $value) { $tableList .= " " . sprintf("%02d", $key + $plusNumber) . ". " . $value . "\r\n"; } // Google Fonts if (count($googleFonts) > 0 && is_array($googleFonts)) { $FontsCSS = "/*-----------------------------------------------*/\r\n"; $FontsCSS .= "/* Font Families */\r\n"; $FontsCSS .= "/*-----------------------------------------------*/\r\n"; foreach ($googleFonts as $fontURL) { $FontsCSS .= "@import url('" . $fontURL . "');\r\n"; } $FontsCSS .= "\r\n\r\n\r\n"; } // All in. $allOutPut = "/*\r\n\r\n The following CSS codes are created by the YellowPencil plugin.\r\n"; $allOutPut .= " https://yellowpencil.waspthemes.com/\r\n\r\n\r\n"; $allOutPut .= " T A B L E O F C O N T E N T S\r\n"; $allOutPut .= " ........................................................................\r\n\r\n"; $allOutPut .= $tableList; $allOutPut .= "\r\n*/\r\n\r\n\r\n\r\n"; // Adding Google Fonts to OutPut. if (count($googleFonts) > 0) { $allOutPut .= $FontsCSS; } // Adding all CSS codues $allOutPut .= $output; // Process with some PHP functions and return Output CSS code. if ($method == 'export') { return wyp_auto_prefix(wyp_export_animation_prefix(trim($allOutPut))); } else { return wyp_auto_prefix(trim($allOutPut)); } } } /* ---------------------------------------------------- */ /* Import Plugin data /* ---------------------------------------------------- */ function wyp_import_data($json) { if (empty($json)) { return false; } $json = wp_unslash($json); $array = json_decode($json, true); // No error if(json_last_error() === JSON_ERROR_NONE){ // Continue foreach ($array as $nodes) { foreach ($nodes as $key => $value) { $value = wyp_decode($value); // If post meta if (strstr($key, '._')) { $keyArray = explode(".", $key); $postID = $keyArray[0]; $metaKey = $keyArray[1]; if (!update_post_meta($postID, $metaKey, wp_slash($value))) { add_post_meta($postID, $metaKey, wp_slash($value), true); } } else { // else option if (!update_option($key, $value)) { add_option($key, $value); } } } } } } /* ---------------------------------------------------- */ /* Export CSS as style.css /* ---------------------------------------------------- */ function wyp_exportCSS_admin_header() { if (current_user_can("export") && isset($_GET['wyp_exportCSS']) && check_admin_referer("wyp_export_nonce")) { $data = wyp_get_export_css("export"); header('Content-Disposition: attachment; filename="style-' . strtolower(date("M-d")) . '.css"'); header("Content-type: text/css; charset: UTF-8"); header('Content-Length: ' . strlen($data)); header('Connection: close'); echo $data; die(); } } add_action("admin_init", "wyp_exportCSS_admin_header", 999999999); // @WaspThemes. // Coded With Love..