plugin_name = $plugin_name; $this->version = $version; $this->library = new Adv_Vis_Ele_Library(); $this->add_shortcodes(); } /** * Register the stylesheets for the public-facing side of the site. */ public function enqueue_styles() { if (!wp_style_is($this->plugin_name . '-public')) { wp_enqueue_style($this->plugin_name . '-public', plugin_dir_url(__FILE__) . 'css/adv-vis-ele-public.css', [], $this->version, 'all'); } if (empty($elements)) { $elements = $this->library->get_installed_elements(); } foreach ($elements as $element_id) { if (!$this->library->is_element_installed($element_id)) { continue; } $element = $this->library->get_element($element_id); $element_path = content_url('/wp-ave-elements/' . $element_id . '/'); if (!empty($element->files)) { foreach ($element->files as $file) { if ($file->type === 'css') { $dependencies = []; if (!empty($file->wp_dependencies)) { $dependencies = $file->wp_dependencies; } $script_slug = 'ave-' . $element_id . '-' . $file->slug; if (!wp_style_is($script_slug)) { wp_enqueue_style($script_slug, $element_path . $file->file, $dependencies, $this->library->library_version, 'all'); } } } } } } /** * Register the JavaScript for the public-facing side of the site. */ public function enqueue_scripts() { if (!wp_script_is($this->plugin_name . '-public')) { wp_enqueue_script($this->plugin_name . '-public', plugin_dir_url(__FILE__) . 'js/adv-vis-ele-public.js', ['jquery'], $this->version, false); } } /** * Add shortcodes for rendering element shortcodes * */ public function add_shortcodes() { if (!shortcode_exists('ave-element')) { add_shortcode('ave-element', [$this, 'output_shortcode']); } } /** * Enqueue all element scripts */ public function enqueue_element_scripts($elements = []) { $js_dependencies = []; if (empty($elements)) { $elements = $this->library->get_installed_elements(); } foreach ($elements as $element_id) { if (!$this->library->is_element_installed($element_id)) { continue; } $element = $this->library->get_element($element_id); $element_path = content_url('/wp-ave-elements/' . $element_id . '/'); if (!empty($element->files)) { foreach ($element->files as $file) { if ($file->type === 'js') { $dependencies = []; if (!empty($file->wp_dependencies)) { $dependencies = $file->wp_dependencies; } $script_slug = 'ave-' . $element_id . '-' . $file->slug; if (!wp_script_is($script_slug)) { wp_enqueue_script($script_slug, $element_path . $file->file, $dependencies, $this->library->library_version, true); $js_dependencies[] = $script_slug; } } } } } return $js_dependencies; } /** * Main shortcode for displaying elements */ public function output_shortcode($atts) { if (empty($atts['id'])) { return ''; } $post_id = (int)$atts['id']; // for use in shortcode.php if ($post_id === false) { return ''; } $do_not_render = apply_filters('ave_filter_render_flag', $post_id); if ($do_not_render === false) { return ''; } $element_post = get_post($post_id); if (is_null($element_post)) { return ''; } if ($element_post->post_type !== 'adv-vis-element') { return ''; } if (!current_user_can('administrator') && $element_post->post_status !== 'publish') { return ''; } if (!empty($element_post->post_password)) { return ''; } if ($element_post->post_status === 'trash') { return ''; } $disable_on_mobile = get_post_meta($post_id, 'adv-vis-ele-disable_on_mobile', true); if ($disable_on_mobile && wp_is_mobile()) { return ''; } $element_id = get_post_meta($post_id, 'adv-vis-ele-element_id', true); $element_id = sanitize_text_field($element_id); if (empty($element_id) && !current_user_can('administrator')) { return ''; } // if it's the first time editing element, so it's not saved yet - construct the preview from default settings if ($element_post->post_status === 'auto-draft') { if (isset($_GET['element-id'])) { $element_id = sanitize_text_field($_GET['element-id']); } else { if (!current_user_can('administrator')) { return ''; } } } if (!$this->library->is_element_installed($element_id)) { if (current_user_can('administrator')) { return '
' . __('This element will not render - it is not installed, click here to go to library to install it. This message is visible to administrators only.') . '
'; } else { return ''; } } $element = $this->library->get_element($element_id); if (!current_user_can('administrator') && $element->license !== 'free' && !wpave_fs()->can_use_premium_code()) { return ''; } // get element settings and cast them to object - they are used in the include file $meta_settings = Adv_Vis_Ele_Admin::get_element_meta_settings($post_id); // insert dynamic post settings, do not do it if in quick preview foreach ($element->settings as $element_setting) { if (empty($meta_settings[$element_setting->id])) { continue; } if ($element_setting->type !== 'text' && $element_setting->type !== 'content' && $element_setting->type !== 'image') { continue; } if (strpos($meta_settings[$element_setting->id], Adv_Vis_Ele_Library::$dynamic_settings_delimiter_start) !== false) { preg_match_all('/' . Adv_Vis_Ele_Library::$dynamic_settings_delimiter_start . '(\S*?)' . Adv_Vis_Ele_Library::$dynamic_settings_delimiter_end . '/', $meta_settings[$element_setting->id], $dynamic_settings_found); if (!empty($dynamic_settings_found[0]) && !empty($dynamic_settings_found[1])) { foreach ($dynamic_settings_found[0] as $k => $dynamic_setting) { if (!isset($_GET['ave-preview-on-front'])) { $replacement_setting = ''; } else { $replacement_setting = $dynamic_settings_found[1][$k]; $meta_settings[$element_setting->id] = str_replace($dynamic_setting, $replacement_setting, $meta_settings[$element_setting->id]); continue; } if (!wpave_fs()->can_use_premium_code()) { $replacement_setting = ''; $meta_settings[$element_setting->id] = str_replace($dynamic_setting, $replacement_setting, $meta_settings[$element_setting->id]); continue; } if ($dynamic_settings_found[1][$k] === 'POST_ID') { $replacement_setting = get_the_ID(); } else if ($dynamic_settings_found[1][$k] === 'POST_TITLE') { $replacement_setting = get_the_title(); } else if ($dynamic_settings_found[1][$k] === 'POST_CATEGORY') { $replacement_setting = get_the_category_list(', '); } else if ($dynamic_settings_found[1][$k] === 'POST_FEATURED_IMAGE') { if (has_post_thumbnail()) { $replacement_setting = wp_get_attachment_image_url(get_post_thumbnail_id(), 'full'); } } else if ($dynamic_settings_found[1][$k] === 'POST_EXCERPT') { $replacement_setting = get_the_excerpt(); } else if ($dynamic_settings_found[1][$k] === 'POST_DATE') { $replacement_setting = get_the_date(); } else if ($dynamic_settings_found[1][$k] === 'POST_TIME') { $replacement_setting = get_the_time(); } else if ($dynamic_settings_found[1][$k] === 'POST_COMMENTS_NUMBER') { $replacement_setting = get_comments_number(); } else if ($dynamic_settings_found[1][$k] === 'ARCHIVE_ID') { $queried_object = get_queried_object(); if (is_object($queried_object)) { if ($queried_object instanceof WP_Post) { $replacement_setting = $queried_object->ID; } else if ($queried_object instanceof WP_Term) { $replacement_setting = $queried_object->term_id; } } } else if ($dynamic_settings_found[1][$k] === 'ARCHIVE_TITLE') { $replacement_setting = get_the_archive_title(); } else if ($dynamic_settings_found[1][$k] === 'AUTHOR_ID') { $replacement_setting = get_the_author_meta('ID'); } else if ($dynamic_settings_found[1][$k] === 'AUTHOR_FIRST_NAME') { $replacement_setting = get_the_author_meta('first_name'); } else if ($dynamic_settings_found[1][$k] === 'AUTHOR_LAST_NAME') { $replacement_setting = get_the_author_meta('last_name'); } else if ($dynamic_settings_found[1][$k] === 'AUTHOR_DISPLAY_NAME') { $replacement_setting = get_the_author_meta('display_name'); } else if ($dynamic_settings_found[1][$k] === 'AUTHOR_EMAIL') { $replacement_setting = get_the_author_meta('email'); } else if (substr($dynamic_settings_found[1][$k], 0, 4) === 'META') { $key = str_replace( [ Adv_Vis_Ele_Library::$dynamic_settings_delimiter_start, Adv_Vis_Ele_Library::$dynamic_settings_delimiter_end, 'META_FIELD_' ], '', $dynamic_settings_found[1][$k]); $meta_setting = get_post_meta(get_the_ID(), $key, true); $replacement_setting = $meta_setting ? $meta_setting : ''; } // WooCommerce dynamic settings if (class_exists('woocommerce')) { global $product; if ($product instanceof WC_Product) { if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_SKU') { $replacement_setting = $product->get_sku(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_IMAGE') { $replacement_setting = wp_get_attachment_image_url(get_post_thumbnail_id($product->get_id()), 'full'); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_SHORT_DESCRIPTION') { $replacement_setting = $product->get_short_description(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_LONG_DESCRIPTION') { $replacement_setting = $product->get_description(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_REGULAR_PRICE') { $replacement_setting = $product->get_regular_price(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_SALE_PRICE') { $replacement_setting = $product->get_sale_price(); } else if ($dynamic_settings_found[1][$k] === 'WOO_CURRENCY_SYMBOL') { $replacement_setting = get_woocommerce_currency_symbol(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_STOCK_STATUS') { $replacement_setting = $product->get_stock_status(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_STOCK_QUANTITY') { $replacement_setting = $product->get_stock_quantity(); } else if ($dynamic_settings_found[1][$k] === 'WOO_PRODUCT_SHIPPING_CLASS') { $replacement_setting = $product->get_shipping_class(); } else if ($dynamic_settings_found[1][$k] === 'WOO_ADD_TO_CART_TEXT') { $replacement_setting = $product->add_to_cart_text(); } } } if (is_string($replacement_setting) || is_int($replacement_setting)) { $meta_settings[$element_setting->id] = str_replace($dynamic_setting, $replacement_setting, $meta_settings[$element_setting->id]); } } } } } $settings_clean = []; // reserved variables $settings_clean['post_id'] = absint($post_id); $settings_clean['element_id'] = $element_id; $settings_clean['element_path'] = ADV_VIS_ELE_ELEMENTS_DIR . DIRECTORY_SEPARATOR . $element_id; $settings_clean['mobile_breakpoint'] = absint(get_option('adv_vis_ele_global_mobile_breakpoint', ADV_VIS_ELE_GLOBAL_MOBILE_BREAKPOINT)); $meta_mobile_breakpoint = absint(get_post_meta($post_id, 'adv-vis-ele-mobile_breakpoint', true)); if (!empty($meta_mobile_breakpoint)) { $filtered_mobile_breakpoint = absint($meta_mobile_breakpoint); if (!empty($filtered_mobile_breakpoint)) { $settings_clean['mobile_breakpoint'] = $filtered_mobile_breakpoint; } } foreach ($element->settings as $element_setting) { if ($element_setting->type === 'boolean') { if (isset($meta_settings[$element_setting->id]) && is_bool($meta_settings[$element_setting->id])) { $settings_clean[$element_setting->id] = $meta_settings[$element_setting->id]; } else { if (isset($element_setting->default) && is_bool($element_setting->default)) { $settings_clean[$element_setting->id] = $element_setting->default; } } } else { if (isset($meta_settings[$element_setting->id])) { $settings_clean[$element_setting->id] = $meta_settings[$element_setting->id]; } else { if (!empty($element_setting->default)) { $settings_clean[$element_setting->id] = $element_setting->default; } else { $settings_clean[$element_setting->id] = ''; // populate this so we don't get "undefined index errors" etc. } } } // escape all of the settings if ($element_setting->type === 'text') { $settings_clean[$element_setting->id] = esc_html($settings_clean[$element_setting->id]); } else if ($element_setting->type === 'color') { $settings_clean[$element_setting->id] = esc_attr($settings_clean[$element_setting->id]); } else if ($element_setting->type === 'content') { $settings_clean[$element_setting->id] = wp_kses_post(nl2br($settings_clean[$element_setting->id])); } else if ($element_setting->type === 'number') { $settings_clean[$element_setting->id] = (int)$settings_clean[$element_setting->id]; } else if ($element_setting->type === 'float') { $settings_clean[$element_setting->id] = (float)$settings_clean[$element_setting->id]; } else if ($element_setting->type === 'image' || $element_setting->type === 'video') { $settings_clean[$element_setting->id] = esc_url($settings_clean[$element_setting->id]); } else if ($element_setting->type === 'select') { if (is_array($settings_clean[$element_setting->id])) { foreach ($settings_clean[$element_setting->id] as $setting) { if (!in_array($setting, array_column($element_setting->options, 'value'))) { $settings_clean[$element_setting->id] = ''; } } } } else if ($element_setting->type === 'boolean') { $settings_clean[$element_setting->id] = (bool)$settings_clean[$element_setting->id]; } } // enqueue all element scripts and get back all their slugs to act as dependencies for the main script.js file $js_element_dependencies = $this->enqueue_element_scripts($element); $element_path = content_url('/wp-ave-elements/' . $element_id . '/'); if (wpave_fs()->can_use_premium_code()) { $settings_clean = apply_filters('ave_filter_element_settings', $settings_clean, $post_id); } $encoded_element_settings = json_encode($settings_clean); if ($encoded_element_settings) { $script_code = 'if(typeof ave_element_settings == "undefined") {var ave_element_settings = {}}; ave_element_settings["' . (int)$post_id . '"] = ' . $encoded_element_settings . ';'; } else { if (current_user_can('administrator')) { return __('There was a problem with parsing/encoding Element settings. This message is visible to administrators only.'); } return ''; } if (file_exists(ADV_VIS_ELE_ELEMENTS_DIR . DIRECTORY_SEPARATOR . $element_id . '/script.js') && !wp_script_is('ave-' . $element_id)) { $merged_js_dependencies = array_merge($element->js_dependencies, $js_element_dependencies); wp_enqueue_script('ave-' . $element_id, $element_path . 'script.js', $merged_js_dependencies, $this->version, true); } if (isset($script_code) && wp_script_is('ave-' . $element_id)) { wp_add_inline_script('ave-' . $element_id, $script_code, 'before'); } $shortcode_file = ADV_VIS_ELE_ELEMENTS_DIR . DIRECTORY_SEPARATOR . $element->id . DIRECTORY_SEPARATOR . 'shortcode.php'; if (!file_exists(realpath($shortcode_file))) { if (current_user_can('administrator')) { return '
' . __('This element will not render - critical element files missing, click here to go to library to re-install it. This message is visible to administrators only.') . '
'; } return ''; } do_action('ave_action_before_element'); // begin shortcode output ob_start(); $output = ''; $custom_css = get_post_meta($post_id, 'adv-vis-ele-custom_css', true); if (!empty($custom_css)) { $custom_css_slug = 'ave-custom-inline-css-' . (int)$post_id; wp_register_style($custom_css_slug, false); wp_enqueue_style($custom_css_slug); wp_add_inline_style($custom_css_slug, strip_tags($custom_css)); } $container_styles_out = ''; $container_styles_width = get_post_meta($post_id, 'adv-vis-ele-container_styles', true); $container_styles_vertical = get_post_meta($post_id, 'adv-vis-ele-container_styles_vertical', true); if (!empty($container_styles_width)) { if (substr($container_styles_width, 0, 4) === 'flex' || $container_styles_width === 'center') { $container_styles_out .= 'display: flex; justify-content: ' . $container_styles_width . ';'; if (!empty($container_styles_vertical)) { $container_styles_out .= ' align-items: ' . $container_styles_vertical . ';'; } } else { $container_styles_out .= 'display: ' . $container_styles_width . ';'; } } $output .= '
'; $output .= '
'; global $pagenow; if (get_option('adv_vis_ele_disable_admin_commands_frontend') != 'on' && current_user_can('administrator') && ($pagenow != 'post.php' && $pagenow != 'post-new.php')) { $output .= '
'; if (!isset($_GET['ave-preview-on-front'])) { $output .= '' . __('Edit Element', 'wp-ave') . ''; } $output .= '
'; // .adv-vis-ele-shortcode-render-admin-commands if ($element_post->post_status !== 'publish' && !isset($_GET['ave-preview-on-front'])) { $output .= '' . __('This render is only visible to admins. Publish this element to show it to all site visitors.', 'wp-ave') . ''; } if ($element->license !== 'free' && !wpave_fs()->can_use_premium_code()) { $output .= '' . __('This render is only visible to admins. This element requires PRO license in order for it to render for all site visitors.', 'wp-ave') . ''; } } $settings = $settings_clean; unset($settings_clean); include $shortcode_file; $output .= ob_get_clean(); $output .= '
'; // .adv-vis-ele-shortcode-render-container-inner $output .= '
'; // .adv-vis-ele-shortcode-render-container ob_start(); do_action('ave_action_after_element'); $after = ob_get_clean(); return $output . $after; } }