File: //home/mirz4654/.trash/waspthemes-yellow-pencil/yellow-pencil.php
<?php
/*
Plugin Name: YellowPencil Pro
Plugin URI: https://yellowpencil.waspthemes.com
Description: The most powerful visual CSS editor for WordPress. Customize any theme and page visually without coding.
Version: 7.6.0
Author: WaspThemes
Author URI: https://yellowpencil.waspthemes.com
*/
/* ---------------------------------------------------- */
/* Basic
/* ---------------------------------------------------- */
if (!defined('ABSPATH')) {
die('-1');
}
/* ---------------------------------------------------- */
/* Check if lite version or not.
/* ---------------------------------------------------- */
if (!strstr(__FILE__, "yellow-pencil-visual-theme-customizer")) {
$pro_dir = __FILE__;
$lite_dir = str_replace("waspthemes-yellow-pencil", "yellow-pencil-visual-theme-customizer", __FILE__);
define("YP_PRO_DIRECTORY", TRUE);
}else{
$lite_dir = __FILE__;
$pro_dir = str_replace("yellow-pencil-visual-theme-customizer", "waspthemes-yellow-pencil", __FILE__);
}
if (file_exists($pro_dir) && file_exists($lite_dir)) {
// Be sure deactivate_plugins function is exists
if (!function_exists("deactivate_plugins")) {
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
// deactivate lite version.
deactivate_plugins(plugin_basename($lite_dir));
}
// Generate Base Editor URL.
function wyp_get_uri() {
if (current_user_can("edit_theme_options") == true) {
return admin_url('admin.php?page=yellow-pencil-editor');
} elseif (defined('YP_DEMO_MODE')) {
return add_query_arg(array(
'yellow_pencil' => '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.0");
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 "<div class='ed-pnl wyp-disable-cancel'>
<div class='ed-pnl-top'>
<a href='".$hrefNew."' class='wf-close-btn-link' tabindex='-1'><span data-toggle='tooltip' data-placement='left' title='Close Editor' class='wyp-close-btn'></span></a>
<a class='wyp-button wyp-save-btn wyp-disabled'>Saved</a>
<a data-toggle='tooltipTopBottom' data-placement='bottom' title='Review Changes <span class=\"wyp-s-shortcut\">(C)</span>' class='wyp-button-manage'></a>
<a target='_blank' data-href='".esc_url($liveLink)."' data-toggle='tooltipTopBottom' data-placement='bottom' title='Live Preview' class='wyp-button-live'></a>
<div class='wyp-clear'></div>
</div>";
echo "<div id='property-responsive-menu'></div>";
echo "<div class='ed-pnl-inner'>";
echo "<div class='wyp-csng-sec'>
<div class='wyp-customizing-inner'>
".wyp_customizing_options()."
<div class='wyp-clear'></div>
<div id='wyp-crnt-el'>No element selected</div>
</div>
</div>";
// Options
include( YP_PLUGIN_DIR . 'editor/lib/properties.php' );
echo "<div class='wyp-panel-no-selection'><div class='starter-notice'><div class='wyp-hand'></div><div class='wyp-hand-after'></div>Select any element on the page to start making changes.</div></div>";
echo "<div class='ed-pnl-footer'>
<h3><a tabindex='-1' target='_blank' href='https://yellowpencil.waspthemes.com/documentation/'>Docs</a> / <a tabindex='-1' target='_blank' href='https://yellowpencil.waspthemes.com/changelog/'>V ".YP_VERSION."</a></h3>
<span class='yicon icon-admin-collapse wyp-panel-hide' data-toggle='tooltip' data-placement='left' title='Hide Panels <span class=\"wyp-shortcut-char\">(H)</span>'></span>
</div>";
echo "</div>"; // Editor panel
echo "</div>";
}
// 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[] = '<a href="' . admin_url('themes.php?page=yellow-pencil') . '">Customize</a>';
$links[] = '<a href="' . admin_url('themes.php?page=yellow-pencil-changes') . '">Manage Customizations</a>';
if(!defined("WTFV")){
$links[] = '<a href="' . admin_url('admin.php?page=yellow-pencil-license') . '">Go Pro</a>';
}
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, "<style ") === false){
return $data;
}
// converting with preg_match_all regex
$re = '/<style(.*?)<\/style>/';
preg_match_all($re, $data, $matches, PREG_SET_ORDER, 0);
// no matches, then don't make anything.
if(empty($matches)){
return $data;
}
// keep all as array
$result = array();
// loop matches
foreach ($matches as $value) {
$style = $value[0];
preg_match('/data\-rule\=\"(.*?)\"/', $style, $rule);
preg_match('/data\-style\=\"(.*?)\"/', $style, $selector);
preg_match('/data\-size\-mode\=\"(.*?)\"/', $style, $msize);
preg_match('/>(.*?)<\/style>/', $style, $content);
// push
array_push($result, "/* [rule=".$rule[1]."] [selector=".$selector[1]."] [msize=".$msize[1]."] */\n ".$content[1]);
}
// join array and return;
return join("", $result);
}
/* ---------------------------------------------------- */
/* Getting font Families By CSS OUTPUT
/* ---------------------------------------------------- */
// Type null = 'wp_enqueue_style'
// Type import = 'import'
// Type = wp_enqueue_style OR return @import CSS
function wyp_get_font_families($css, $type) {
$protocol = is_ssl() ? 'https' : 'http';
preg_match_all('/\{(.*?)font-family:(.*?);(.*?)\}/', $css, $r);
foreach ($r['2'] as &$k) {
$k = wyp_font_name($k);
}
$importArray = array();
$in = -1;
foreach (array_unique($r['2']) as $family) {
$in++;
// Skip if not include
if(!isset($_GET["yellow_pencil_frame"])){
if (strstr($r["0"][$in], "--google-webfont")){
continue;
}
}
$id = str_replace("+", "-", strtolower($family));
$id = str_replace("\\", "", $id);
if ($id == 'arial' || $id == 'helvetica' || $id == 'georgia' || $id == 'serif' || $id == 'helvetica-neue' || $id == 'times-new-roman' || $id == 'times' || $id == 'sans-serif' || $id == 'arial-black' || $id == 'gadget' || $id == 'impact' || $id == 'charcoal' || $id == 'tahoma' || $id == 'geneva' || $id == 'verdana' || $id == 'inherit') {
return false;
}
if ($id == '' || $id == ' ') {
return false;
}
// Getting fonts from google api.
if ($type == null) {
wp_enqueue_style($id, $protocol . '://fonts.googleapis.com/css2?family=' . $family . ':ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
} else {
array_push($importArray, $protocol . '://fonts.googleapis.com/css2?family=' . $family . ':ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
}
}
if ($type != null) {
return $importArray;
}
}
/* ---------------------------------------------------- */
/* Finding Font Names From CSS data
/* ---------------------------------------------------- */
function wyp_font_name($a) {
$a = str_replace(array(
"font-family:",
'"',
"'",
" ",
"+!important",
"!important"
), array(
"",
"",
"",
"+",
"",
""
), $a);
if (strstr($a, ",")) {
$array = explode(",", $a);
return wp_unslash(trim($array[0], "+")); // /roboto/ problem
} else {
return wp_unslash(trim($a, "+"));
}
}
/* ---------------------------------------------------- */
/* Admin Javascript
/* ---------------------------------------------------- */
function wyp_adminj_javascript(){ ?>
<script type="text/javascript" >
jQuery(document).ready(function($){
<?php
// Default customization type
$wyp_default_global = get_option("yp-default-global");
// Open in global customization
if($wyp_default_global == "1"){
echo "window.default_global_customization_type = true;";
}else{
echo "default_global_customization_type = false;";
}
?>
});
</script><?php
}
// Admin script
add_action( 'admin_footer', 'wyp_adminj_javascript' );
/* ---------------------------------------------------- */
/* Checking current user can or not
/* ---------------------------------------------------- */
function wyp_check_let() {
// If Demo Mode
if (defined('YP_DEMO_MODE') == true && isset($_GET['yellow_pencil_frame']) == true) {
return true;
}
// If user can.
if (current_user_can("edit_theme_options") == true) {
return true;
} else {
return false;
}
}
/* ---------------------------------------------------- */
/* Checking current user can or not (FOR FRAME)
/* ---------------------------------------------------- */
function wyp_check_let_frame() {
// If Demo Mode
if (defined('YP_DEMO_MODE') == true && isset($_GET['yellow_pencil_frame']) == true) {
return true;
}
// Be sure, user can.
if (current_user_can("edit_theme_options") == true && isset($_GET['yellow_pencil_frame']) == true) {
return true;
} else {
return false;
}
}
/* ---------------------------------------------------- */
/* Getting Last Post Title
/* ---------------------------------------------------- */
function wyp_getting_last_post_title() {
$last = wp_get_recent_posts(array(
"numberposts" => 1,
"post_status" => "publish"
));
if (isset($last['0']['ID'])) {
$last_id = $last['0']['ID'];
} else {
return false;
}
$title = get_the_title($last_id);
if (strstr($title, " ")) {
$words = explode(" ", $title);
return $words[0];
} else {
return $title;
}
}
/* ---------------------------------------------------- */
/* Clean protocol from URL
/* ---------------------------------------------------- */
function wyp_urlencode($v) {
$u = urldecode($v);
$y = explode("://", $u);
if(isset($y[1])){
return urlencode($y[1]);
}
return urlencode($u);
}
/* ---------------------------------------------------- */
/* Register Admin Script
/* ---------------------------------------------------- */
function wyp_deactivation_function($hook) {
// clean options
delete_option("yp_700_db_updateX");
delete_option("yp_purchase_code");
}
register_deactivation_hook(__FILE__, 'wyp_deactivation_function');
/* ---------------------------------------------------- */
/* Register Admin Script
/* ---------------------------------------------------- */
function wyp_enqueue_admin_pages($hook) {
if(current_user_can("edit_theme_options")){
// Post pages.
if ('post.php' == $hook || 'post-new.php' == $hook) {
global $post, $pagenow;
wp_enqueue_script('yellow-pencil-admin', plugins_url('admin/js/admin-general.js?wypver='.YP_VERSION.'', __FILE__), 'jquery', '1.0', TRUE);
if(isset($post)){
$post_type_obj = get_post_type_object($post->post_type);
$current_page_data = array(
'is_post_type_public' => $post_type_obj->public,
);
wp_localize_script('yellow-pencil-admin', 'wypCurrentPageData', $current_page_data);
}
}
// Yellow Pencil WordPress Admin Page. // loading ace editor
if ('toplevel_page_yellow-pencil-changes' == $hook || "yellowpencil_page_yellow-pencil-animations" == $hook || "yellowpencil_page_yellow-pencil-settings" == $hook || "yellowpencil_page_yellow-pencil-license" == $hook) {
// Ace Editor
wp_enqueue_script('wyp-admin-page-ace', plugins_url('editor/js/ace/ace.js?wypver='.YP_VERSION.'', __FILE__), 'jquery', '1.0', TRUE);
// Ace Editor
wp_enqueue_script('wyp-admin-page-ace2', plugins_url('editor/js/ace/ext-language_tools.js?wypver='.YP_VERSION.'', __FILE__), 'jquery', '1.0', TRUE);
// General Scripts
wp_enqueue_script('wyp-admin-page', plugins_url('admin/js/admin-page.js?wypver='.YP_VERSION.'', __FILE__), 'jquery', '1.0', TRUE);
}
// Admin CSS
wp_enqueue_style('yellow-pencil-admin', plugins_url('admin/css/admin.css?wypver='.YP_VERSION.'', __FILE__));
}
}
add_action('admin_enqueue_scripts', 'wyp_enqueue_admin_pages');
/* ---------------------------------------------------- */
/* Adding Link To Admin Appearance Menu
/* ---------------------------------------------------- */
function wyp_menu() {
add_theme_page('YellowPencil Editor', 'YellowPencil Editor', 'edit_theme_options', 'yellow-pencil', 'wyp_menu_function', 999);
}
/*
/* ---------------------------------------------------- */
/* Appearance page Loading And Location
/* ---------------------------------------------------- */
function wyp_menu_function() {
}
add_action('admin_menu', 'wyp_menu');
/* ---------------------------------------------------- */
/* Appearance page Loading And Location
/* ---------------------------------------------------- */
function wyp_admin_headr() {
if(!isset($_GET['page'])){
return false;
}
if($_GET['page'] != 'yellow-pencil'){
return false;
}
// Home URL
$yellow_pencil_uri = wyp_get_uri();
// Basic
if(get_option("show_on_front") == "page"){
$frontpage_id = get_option('page_on_front');
}else{
$frontpage_id = 0;
}
if($frontpage_id == 0 || $frontpage_id == null){
$page_id = "home";
$wyp_page_type = "home";
$wyp_mode = "single";
}else{
$page_id = $frontpage_id;
$wyp_page_type = get_post_type($frontpage_id);
$wyp_mode = "single";
}
// Dev filter for auto popup.
$auto_popup = apply_filters( 'yp_auto_load_popup', TRUE);
// get option value
$global_option = get_option("yp-default-global");
// use global as default
if($wyp_mode == "single" && $global_option == "1"){
$wyp_mode = "global";
}
// Redirect Link
if($auto_popup){
$href = add_query_arg(array('href' => wyp_urlencode(esc_url(get_home_url().'/')), 'wyp_page_id' => $page_id, 'wyp_page_type' => $wyp_page_type, 'wyp_mode' => $wyp_mode, 'wyp_load_popup' => "1"), $yellow_pencil_uri);
}else{
$href = add_query_arg(array('href' => wyp_urlencode(esc_url(get_home_url().'/')), 'wyp_page_id' => $page_id, 'wyp_page_type' => $wyp_page_type, 'wyp_mode' => $wyp_mode), $yellow_pencil_uri);
}
// Redirect
wp_safe_redirect($href);
exit;
}
add_action('admin_init', 'wyp_admin_headr');
/* ---------------------------------------------------- */
/* Sub string after 18chars
/* ---------------------------------------------------- */
function wyp_get_short_title($title, $limit) {
$title = wp_strip_all_tags($title);
if ($title == '') {
$title = 'Untitled';
}
if (strlen($title) > $limit) {
return mb_substr($title, 0, $limit, 'UTF-8') . '..';
} else {
return $title;
}
}
// Update custom.css when reading settings change
// Because this need to update body.blog etc prefixes after change.
add_action( 'update_option_page_on_front', 'wyp_update_custom_css_callback', 10, 2 );
add_action( 'update_option_page_for_posts', 'wyp_update_custom_css_callback', 10, 2 );
add_action( 'update_option_show_on_front', 'wyp_update_custom_css_callback', 10, 2 );
function wyp_update_custom_css_callback(){
// Get All CSS data as ready-to-use
$output = wyp_get_export_css("create");
// Update custom.css file
wyp_create_custom_css($output);
}
/* ---------------------------------------------------- */
/* Helper tool to print login styles
/* ---------------------------------------------------- */
/* CSS codes, animation-events.js, animate.css, custom-anims */
function wyp_login_styles($r){
$onlyCSS = "";
// Login
if($GLOBALS['pagenow'] === 'wp-login.php' && empty($_REQUEST['action'])){
$onlyCSS .= get_option("wt_login_css");
}
// Register
if($GLOBALS['pagenow'] === 'wp-login.php' && !empty($_REQUEST['action']) && $_REQUEST['action'] === 'register'){
$onlyCSS .= get_option("wt_register_css");
}
// Lost Password
if($GLOBALS['pagenow'] === 'wp-login.php' && !empty($_REQUEST['action']) && $_REQUEST['action'] === 'lostpassword'){
$onlyCSS .= get_option("wt_lostpassword_css");
}
// 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);}}
// No print
if(strlen($onlyCSS) == 0){
return false;
}
// Delete CSS Comments
$onlyCSS = preg_replace("!/\*[^*]*\*+([^/][^*]*\*+)*/!","", $onlyCSS);
// Delete HTML tags from pure CSS
$onlyCSS = wp_strip_all_tags($onlyCSS);
// Return mode
if($r){
return $onlyCSS;
}
// Return
$return = '<style id="yellow-pencil">';
$return .= "\r\n/*\r\n\tThe following CSS codes are created by the YellowPencil plugin.\r\n\thttps://yellowpencil.waspthemes.com/\r\n*/\r\n";
// process
$onlyCSS = wp_unslash(wyp_auto_prefix($onlyCSS));
// min and add
$return .= str_replace(array(
"\n",
"\r",
"\t"
), '', $onlyCSS);
// Close style
$return .= "\n" . '</style>';
// 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 = '<style id="yellow-pencil">';
$return .= "\r\n/*\r\n\tThe following CSS codes are created by the YellowPencil plugin.\r\n\thttps://yellowpencil.waspthemes.com/\r\n*/\r\n";
// process
$onlyCSS = wp_unslash(wyp_auto_prefix($onlyCSS));
// min and add
$return .= str_replace(array(
"\n",
"\r",
"\t"
), '', $onlyCSS);
$return .= "\n" . '</style>';
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 "<script id='wyp_page_details'>".$page_id."|".$page_type."|".$edit_mode."</script>";
}
}
// 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 = '<style id="wyp-live-preview">' . $css . '</style>';
if ($css != '<style id="wyp-live-preview"></style>') {
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('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-webkit-box-pack:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "align-items"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-webkit-box-align:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex-direction"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-webkit-box-orient:$1;\r\t-webkit-box-direction:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex" || $prefix == "flex-grow"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-webkit-box-flex:$1;\r\t" . $prefix . ":$1;", $css);
}else{
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-webkit-" . $prefix . ":$1;\r\t" . $prefix . ":$1;", $css);
}
}
// MS
foreach ($ms as $prefix) {
if($prefix == "justify-content"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-pack:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "align-items"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-align:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "align-content"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-line-pack:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex-wrap"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-wrap:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "grid-template-columns"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-grid-columns:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "grid-template-rows"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-grid-rows:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "align-self"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-item-align:$1;\r\t-ms-grid-row-align:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex-basis"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-preferred-size:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex-shrink"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-negative:$1;\r\t" . $prefix . ":$1;", $css);
}else if($prefix == "flex-grow"){
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-flex-positive:$1;\r\t" . $prefix . ":$1;", $css);
}else{
$css = preg_replace('@(?<!-)' . $prefix . ':([^\{\;]+);@i', "-ms-" . $prefix . ":$1;\r\t" . $prefix . ":$1;", $css);
}
}
// Display: flex
$css = preg_replace('@display(\s+)?:(\s+)?flex(\s+)?(\!important)?;@i', "display:-webkit-box$3$4;\r\tdisplay:-webkit-flex$3$4;\r\tdisplay:-ms-flexbox$3$4;\r\tdisplay:flex$3$4;", $css);
// Display: grid
$css = preg_replace('@display(\s+)?:(\s+)?grid(\s+)?(\!important)?;@i', "display:-ms-grid$3$4;\r\tdisplay:grid$3$4;", $css);
// position: sticky
$css = preg_replace('@position(\s+)?:(\s+)?sticky(\s+)?(\!important)?;@i', "display:-webkit-sticky$3$4;\r\tdisplay:sticky$3$4;", $css);
// Load Gradient one time only.
if(!function_exists("wyp_linear_gradient_support")){
// Linear gradient prefix support
function wyp_linear_gradient_support(array $match){
// only gradient content
$gradientOriginal = $match[4];
$gradient = $gradientOriginal;
// get first part
preg_match('/linear-gradient\(([^,]+)/i', "linear-gradient(".$gradientOriginal, $matches);
// direction available
if(isset($matches[1])){
$direction = strtolower(trim($matches[1]));
// is valid
if(preg_match('/(deg|top|left|right|bottom)/i', $direction)){
// Is deg
if(preg_match('/deg/i', $direction)){
// get deg
$deg = preg_replace("/[^0-9.]/", "", $direction);
// reverse direction for o and webkit
if($deg == "0"){
$deg = "bottom";
}elseif($deg == "90"){
$deg = "left";
}elseif($deg == "180"){
$deg = "top";
}elseif($deg == "270"){
$deg = "right";
}elseif($deg == "360"){
$deg = "bottom";
}else if($deg < 90){
$deg = 90 - $deg."deg";
}else if($deg > 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 '<meta name="robots" content="noindex, follow">' . "\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('@\<link([^\>]+)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 = '<div id="yellow-pencil-iframe-data"><!--
<style class="wyp-inline-data"'.$globalActive.' data-source-mode="global">'.$global.'</style>
<style class="wyp-inline-data"'.$templateActive.' data-source-mode="template">'.$template.'</style>
<style class="wyp-inline-data"'.$singleActive.' data-source-mode="single">'.$single.'</style>';
// return animations
$return .= '<div id="wyp-animate-data"><style>' . $animations . '</style></div> --></div>';
// 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 = "<div id='customizing-mode' data-this-type='".$type."' class='wyp-type-menu-link'><span class='type-heading'>".$defaultText."</span> <span class='yicon icon-arrow-down'></span></div><div id='c-t-list'><ul>";
// Options
$result .= "<li data-value='single' class='".$singleSelected."'><i class='manage-this-type'></i><i class='reset-this-type'></i><h6><span><span class='current-type'></span>".$singleText."</span><small class='type-byte'><span>empty</span><i>changed</i></small></h6><p>apply style just to the current page.</p></li>";
$result .= '<li data-value="template" class="'.$templateSelected.'"><i class="manage-this-type"></i><i class="reset-this-type"></i><h6><span><span class="current-type"></span>'.$templateText.'</span><small class="type-byte"><span>empty</span><i>changed</i></small></h6><p>apply style to all pages of the current post type.</p></li>';
$result .= '<li data-value="global" class="'.$globalSelected.'"><i class="manage-this-type"></i><i class="reset-this-type"></i><h6><span><span class="current-type"></span>'.$globalText.'</span><small class="type-byte"><span>empty</span><i>changed</i></small></h6><p>apply style to the entire website.</p></li>';
// switch to another page.
$result .= '<li id="wyp-current-page"><h6>Customize another page</h6></li>';
// close
$result .= "</ul></div>";
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 '<style>#wp-admin-bar-yp > .ab-item:before{content: "\f309";top:2px;}#wp-admin-bar-wyp-update .ab-item:before{content: "\f316";top:3px;}</style>';
}
/* ---------------------------------------------------- */
/* 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 '<style>
tr.url,tr.post_content,tr.post_excerpt,tr.field,tr.label,tr.align,tr.image-size,tr.post_title,tr.image_alt,.del-link,#tab-type_url{display:none !important;}
.media-item-info > tr > td > p:last-child,.savebutton,.ml-submit{display:none !important;}
#media-upload #filter{width:auto !important;}
.subsubsub{display:none !important;}
.tablenav .alignleft.actions{display:none !important;}
.tablenav{height:auto !important;margin:0 !important;}
.tablenav-pages{margin:0px !important;text-align: right !important;}
.media-upload-form{margin-top:0px !important;}
#filter{margin-bottom:10px !important;}
#media-search{display:none !important;}
.tablenav .tablenav-pages a, .tablenav-pages-navspan{min-width: auto !important;font-size: 13px !important;}
.media-item .describe input[type="text"], .media-item .describe textarea{width:334px;}
.max-upload-size{opacity:0.7 !important;}
</style>';
}
}
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[] = '<a href="https://yellowpencil.waspthemes.com/documentation/">Documentation</a>';
}
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..