[ 'POST_ID' => 'Post ID', 'POST_TITLE' => 'Post title', 'POST_CATEGORY' => 'Post category', 'POST_FEATURED_IMAGE' => 'Post Featured image', 'POST_EXCERPT' => 'Post excerpt', 'POST_DATE' => 'Post date', 'POST_TIME' => 'Post time', 'POST_COMMENTS_NUMBER' => 'Number of comments' ], 'Archive' => [ 'ARCHIVE_ID' => 'Archive ID', 'ARCHIVE_TITLE' => 'Archive title' ], 'Author' => [ 'AUTHOR_ID' => 'Author ID', 'AUTHOR_FIRST_NAME' => 'Author first name', 'AUTHOR_LAST_NAME' => 'Author last name', 'AUTHOR_DISPLAY_NAME' => 'Author display name', 'AUTHOR_EMAIL' => 'Author e-mail' ] ]; public function __construct() { $this->library_info = array_filter(get_option('adv_vis_ele_library_info', [])); $this->library_needs_update = false; $this->installed_elements = get_option('adv_vis_ele_installed_elements', []); $this->library_version = get_option('adv_vis_ele_library_version', '1.0.0'); // WooCommerce dynamic settings array if (class_exists('woocommerce')) { Adv_Vis_Ele_Library::$dynamic_settings['WooCommerce'] = [ 'WOO_PRODUCT_SKU' => 'Product SKU', 'WOO_PRODUCT_IMAGE' => 'Product image', 'WOO_PRODUCT_SHORT_DESCRIPTION' => 'Product short description', 'WOO_PRODUCT_LONG_DESCRIPTION' => 'Product long description', 'WOO_PRODUCT_REGULAR_PRICE' => 'Product regular price', 'WOO_PRODUCT_SALE_PRICE' => 'Product sale price', 'WOO_CURRENCY_SYMBOL' => 'WooCommerce currency symbol', 'WOO_PRODUCT_STOCK_STATUS' => 'Product stock status', 'WOO_PRODUCT_STOCK_QUANTITY' => 'Product stock quantity', 'WOO_PRODUCT_SHIPPING_CLASS' => 'Product shipping class', 'WOO_ADD_TO_CART_TEXT' => 'WooCommerce "Add to cart" text' ]; } // Make meta field last array value Adv_Vis_Ele_Library::$dynamic_settings['Meta/ACF'] = [ 'META_FIELD' => 'Meta or ACF field' ]; } /** * Fetches the remote elements library info */ public function fetch_remote_library_info($update_local_info = true) { $data = ['request' => 'library-info', 'dev' => isset($_GET['adv-vis-ele-library-dev'])]; $response = wp_remote_post(ADV_VIS_ELE_REMOTE_URL, ['body' => $data, 'timeout' => 60]); $output = wp_remote_retrieve_body($response); if (!empty($output)) { $decoded = json_decode($output); if (!empty($decoded)) { if ($decoded->response === 'success') { if (version_compare($decoded->data->version, $this->library_version) === 1 || empty(get_option('adv_vis_ele_library_version'))) { $this->library_needs_update = true; } else { $this->library_needs_update = false; } if (Adv_Vis_Ele_Admin::is_dev()) { $this->library_needs_update = false; } $dev_library = false; if (isset($_GET['adv-vis-ele-library-action']) && sanitize_text_field($_GET['adv-vis-ele-library-action']) === 'update') { if (isset($_GET['adv-vis-ele-library-dev']) || isset($_GET['adv-vis-ele-library-reset'])) { $this->library_needs_update = true; if (isset($_GET['adv-vis-ele-library-dev'])) { $dev_library = true; } } } if ($update_local_info === false) { return $this->library_needs_update; } else { if ($this->library_needs_update) { if (!isset($decoded->data->elements_json)) { return []; } $library_difference = array_diff(array_column($decoded->data->elements_json, 'id'), array_column($this->library_info, 'id')); $this->library_info = $decoded->data->elements_json; $this->library_version = $decoded->data->version; if ($dev_library) { update_option('adv_vis_ele_library_version', 'DEV'); } else { update_option('adv_vis_ele_library_version', $decoded->data->version); } update_option('adv_vis_ele_library_info', $this->library_info); if (!empty($library_difference)) { update_option('adv_vis_ele_library_info_new', $library_difference); } } } return $this->library_info; } else { return []; } } else { return []; } } else { return []; } } /** * Get local library info */ public function get_local_library_info($limit = false, $page = false) { $library_ordering = get_user_meta(get_current_user_id(), 'adv_vis_ele_library_ordering', true); if (empty($library_ordering)) { $library_ordering = 'asc'; add_user_meta(get_current_user_id(), 'adv_vis_ele_library_ordering', $library_ordering); } array_multisort(array_column($this->library_info, 'name'), SORT_NATURAL, $this->library_info); if ($library_ordering === 'desc') { $library_info = array_reverse($this->library_info); } else { $library_info = $this->library_info; } if (is_int($limit) && is_int($page)) { return array_slice($library_info, ($page * $limit) - $limit, $limit); } return $library_info; } /** * Get library changelog (remote) */ public function fetch_library_changelog() { $data = ['request' => 'library-changelog']; $response = wp_remote_post(ADV_VIS_ELE_REMOTE_URL, ['body' => $data, 'timeout' => 60]); $output = wp_remote_retrieve_body($response); if (!empty($output)) { $decoded = json_decode($output); if (!empty($decoded)) { if ($decoded->response === 'success') { return $decoded->data; } else { return ''; } } else { return ''; } } else { return ''; } } /** * Get element info from local library */ public function get_element($element_id) { $info = $this->get_local_library_info(); $key = array_search($element_id, array_column($info, 'id')); if ($key === false) { return false; } if (is_object($info[$key])) { return $info[$key]; } return false; } /** * Get element options from local library */ public function get_element_setting($element_id, $setting_name) { $element = $this->get_element($element_id); if ($element) { $key = array_search($setting_name, array_column($element->settings, 'id')); if ($key !== false) { return $element->settings[$key]; } } return false; } /** * Install element */ public function install_element($element_id) { if (wp_doing_ajax()) { $nonce_verified = isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ave_ajax'); if (!$nonce_verified) { wp_send_json_error(['code' => '010']); } $element_id = sanitize_text_field($_POST['element-id']); $editing_shortcode = isset($_POST['editing-shortcode']); } else { $editing_shortcode = false; } if ($element_id === false || empty($element_id)) { if (wp_doing_ajax()) { wp_send_json_error(['code' => '004']); } else { return false; } } $library = new Adv_Vis_Ele_Library(); $element = $library->get_element($element_id); if ($element->license !== 'free' && !wpave_fs()->can_use_premium_code()) { if (wp_doing_ajax()) { wp_send_json_error(['message' => __('You don\'t have a valid license to install this element.', 'wp-ave')]); } else { return false; } } $license_id = !empty(wpave_fs()->_get_license()) ? wpave_fs()->_get_license()->id : ''; $install_id = !empty(wpave_fs()->get_site()) ? wpave_fs()->get_site()->id : ''; $site_private_key = !empty(wpave_fs()->get_site()) ? wpave_fs()->get_site()->secret_key : ''; $nonce = date('Y-m-d'); $pk_hash = hash('sha512', $site_private_key . '|' . $nonce); $authentication_string = base64_encode($pk_hash . '|' . $nonce); $data = [ 'request' => 'install', 'element-id' => $element_id, 'license_id' => $license_id, 'install_id' => $install_id, 'site_private_key' => $site_private_key, 'authentication_string' => $authentication_string, 'dev' => isset($_REQUEST['adv-vis-ele-library-dev']) ]; $response = wp_remote_post(ADV_VIS_ELE_REMOTE_URL, ['body' => $data, 'headers' => '', 'timeout' => 60]); $output = wp_remote_retrieve_body($response); if (empty($output)) { if (wp_doing_ajax()) { wp_send_json_error(['code' => '005', 'message' => __('Element could not be downloaded. If you are on a development server - try enabling localhost mode on Settings page.', 'wp-ave')]); } else { return false; } } $element_install_path = ADV_VIS_ELE_ELEMENTS_DIR . DIRECTORY_SEPARATOR . $element_id; Adv_Vis_Ele_Helpers::wipe_dir($element_install_path); $zipFile = $element_install_path . '.zip'; global $wp_filesystem; if(empty($wp_filesystem)) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } $wp_filesystem->put_contents($zipFile, $output); $extracted = unzip_file($zipFile, $element_install_path); @unlink($zipFile); if (!is_wp_error($extracted)) { $index_path = $element_install_path . '/index.php'; if (!is_file($index_path)) { // create index.php file to prevent directory reading $index_file = fopen($index_path, 'w'); fwrite($index_file, 'get_installed_elements())) { $this->installed_elements[] = $element_id; } else { $this->installed_elements = [$element_id]; } update_option('adv_vis_ele_installed_elements', $this->installed_elements); if (wp_doing_ajax()) { if ($editing_shortcode === true) { $success_message = __('Element was successfully installed. Please refresh or update the page.', 'wp-ave'); } else { $success_message = __('Element was successfully installed.', 'wp-ave'); } wp_send_json_success(['message' => __($success_message, 'wp-ave')]); } else { return true; } } else { if (wp_doing_ajax()) { wp_send_json_error(['code' => '007', 'message' => __('Element could not be installed. Make sure you have the right folder permissions. Please refresh and try again.', 'wp-ave')]); } else { return false; } } return false; } /** * Delete element */ public function uninstall_element($element_id) { if (wp_doing_ajax()) { $nonce_verified = isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ave_ajax'); if (!$nonce_verified) { wp_send_json_error(['code' => '010']); } $element_id = sanitize_text_field($_POST['element-id']); } if ($element_id === false || empty($element_id)) { if (wp_doing_ajax()) { wp_send_json_error(['code' => '004']); } else { return false; } } $element_folder = ADV_VIS_ELE_ELEMENTS_DIR . DIRECTORY_SEPARATOR . $element_id; Adv_Vis_Ele_Helpers::wipe_dir($element_folder); $installed_elements = $this->get_installed_elements(); if (($key = array_search($element_id, $installed_elements)) !== false) { unset($installed_elements[$key]); $this->installed_elements = $installed_elements; update_option('adv_vis_ele_installed_elements', $this->installed_elements); if (wp_doing_ajax()) { wp_send_json_success(['message' => __('Element was successfully deleted.', 'wp-ave')]); } else { return true; } } else { if (wp_doing_ajax()) { wp_send_json_error(['code' => '006', 'message' => __('Element could not be deleted. Please refresh and try again.', 'wp-ave')]); } else { return false; } } return false; } /** * Get installed elements */ public function get_installed_elements() { return empty($this->installed_elements) ? [] : $this->installed_elements; } /** * Check if element is installed */ public function is_element_installed($element_id) { return in_array($element_id, $this->get_installed_elements()); } /** * Get elements HTML */ public function get_element_html($element) { ob_start(); ?>
name); ?>
id . '/'; ?> settings) && is_array($element->settings)) { foreach ($element->settings as $setting) { $settings_string .= '
'; $mobile_string = ''; if (isset($setting->mobile) && $setting->mobile === true) { $mobile_string .= ' ' . __('(mobile)', 'wp-ave'); } if ($element->license !== 'free') { $settings_string .= '' . esc_attr($setting->name . $mobile_string) . '' . 'PRO'; } else { $settings_string .= '' . esc_attr($setting->name . $mobile_string) . '' . 'license === 'free' ? '' : 'adv-vis-ele-settings-popup-single-setting-pro') . '">' . ($setting->license === 'free' ? 'Free' : 'PRO') . ''; } $settings_string .= '
'; } } if (empty($settings_string)) { $settings_string = __('No options listed.', 'wp-ave'); } ?>
<?php echo esc_attr($element->name); ?> license != 'free') { ?>
can_use_premium_code() ? 'PRO' : 'PRO'; ?>
license !== 'free' && !wpave_fs()->can_use_premium_code() && !$this->is_element_installed($element->id)) { ?>
get_local_library_info(); } else { $elements = $this->get_local_library_info($limit, $page); } $filtered_elements = []; if (!empty($search)) { foreach ($elements as $element) { if (stristr($element->name, $search) !== false || stristr($element->id, $search) !== false) { $filtered_elements[] = $element; } } $elements = array_slice($filtered_elements, ($page * $limit) - $limit, $limit); if (empty($elements)) { if ($page > 1) { echo ''; } else { echo 'No search results.'; } wp_die(); } } $new_elements = get_option('adv_vis_ele_library_info_new', []); $html = ''; foreach ($elements as $element) { $element->new_element = in_array($element->id, $new_elements); $html .= $this->get_element_html($element); } echo wp_kses_post($html); wp_die(); } /** * Render setting field */ public function render_setting_field($setting) { ob_start(); echo ''; if ($setting->type === 'color') { $color_format = $setting->format === 'rgba' ? ' data-alpha-enabled="true"' : ''; echo ''; } else if ($setting->type === 'text') { echo ''; } else if ($setting->type === 'number') { $min = ''; $max = ''; if (isset($setting->min)) { $min = 'min="' . esc_attr($setting->min) . '"'; } if (isset($setting->max)) { $max = 'max="' . esc_attr($setting->max) . '"'; } echo ''; } else if ($setting->type === 'float') { $min = ''; $max = ''; if (isset($setting->min)) { $min = 'min="' . esc_attr($setting->min) . '"'; } if (isset($setting->max)) { $max = 'max="' . esc_attr($setting->max) . '"'; } $step = '0.1'; if (isset($setting->step)) { $step = $setting->step; } echo ''; } else if ($setting->type === 'select') { if (isset($setting->multiple) && $setting->multiple) { $size = Adv_Vis_Ele_Helpers::clamp(count($setting->options), 1, 10); echo ''; } else { echo ''; } } else if ($setting->type === 'boolean') { echo ''; // this is needed to submit FALSE value echo ''; } else if ($setting->type === 'content') { wp_editor(wp_kses_post(wpautop($setting->value)), esc_attr($setting->id), ['wpautop' => false, 'textarea_name' => 'adv-vis-ele-editor-settings[' . esc_attr($setting->id) . ']', 'editor_height' => 150]); } else if ($setting->type === 'image') { echo ''; echo '' . __('Choose Image', 'adv-vis-ele') . ''; } else if ($setting->type === 'video') { echo ''; echo '' . __('Choose Video', 'adv-vis-ele') . ''; } // dynamic post values if ($setting->type === 'text' || $setting->type === 'content' || $setting->type === 'image') { echo ''; } return ob_get_clean(); } /** * Update library (remote) */ public function update_library($do_not_redirect = false) { $update_array = $this->fetch_remote_library_info(true); $remote_ids = array_column($update_array, 'id'); if (!empty($update_array)) { $elements = $this->get_installed_elements(); foreach ($elements as $element_id) { if (array_search($element_id, $remote_ids) === false) { unset($elements[array_search($element_id, $elements)]); update_option('adv_vis_ele_installed_elements', $elements); } $uninstalled = $this->uninstall_element($element_id); if ($uninstalled) { $this->install_element($element_id); } } } else { // error, couldn't fetch json.info file, notify developer if (!$do_not_redirect) { wp_redirect(admin_url('admin.php?page=adv-vis-ele&adv-vis-ele-library-action=update-failed')); die(); } } if (isset($_GET['adv-vis-ele-library-dev']) || isset($_GET['adv-vis-ele-library-reset'])) { if (!$do_not_redirect) { wp_redirect($_SERVER['HTTP_REFERER'] . '&adv-vis-ele-library-action=update-finished-dev'); die(); } } else { if (!$do_not_redirect) { wp_redirect(admin_url('admin.php?page=adv-vis-ele&adv-vis-ele-library-action=update-finished')); die(); } } } /** * Save library ordering (AJAX) */ public function ajax_save_ordering() { $nonce_verified = isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ave_ajax'); if (!$nonce_verified) { wp_send_json_error(['code' => '010']); } $ordering = sanitize_text_field($_POST['ordering']); update_user_meta(get_current_user_id(), 'adv_vis_ele_library_ordering', $ordering); wp_send_json_success(); } /** * Full import (AJAX) */ public function ajax_full_import() { $nonce_verified = isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ave_ajax'); if (!$nonce_verified) { wp_send_json_error(['code' => '010']); } $current_user = wp_get_current_user(); $author = $current_user->ID; $settings = []; foreach ($_POST['settings'] as $key => $setting) { $key = sanitize_text_field($key); if (is_array($setting)) { $settings[$key] = array_map('wp_kses_post', $setting); } else { $settings[$key] = wp_kses_post($setting); } if ($settings[$key] === 'true') { $settings[$key] = 'on'; } } if (!empty($settings)) { $element_id = $settings['adv-vis-ele-element_id']; unset($settings['adv-vis-ele-element_id']); // remove the Element ID because we want only settings $post = [ 'post_title' => 'Imported Element (' . $element_id . ')', 'post_status' => 'draft', 'post_type' => 'adv-vis-element', 'post_author' => $author ]; $new_post_id = wp_insert_post($post); if (is_int($new_post_id) && $new_post_id > 0) { add_post_meta($new_post_id, 'adv-vis-ele-element_id', $element_id); $saving = $this->get_saving_settings($settings, $element_id); Adv_Vis_Ele_Admin::save_element_meta_settings($saving, $new_post_id); $redirection_url = admin_url() . 'post.php?post=' . $new_post_id . '&action=edit'; wp_send_json_success(['redirection_url' => $redirection_url]); } } wp_send_json_error(); } /** * Get Element options for saving */ public function get_saving_settings($settings, $element_id) { $saving = []; foreach ($settings as $setting_name => $setting_value) { $setting = $this->get_element_setting($element_id, $setting_name); if ($setting) { if ($setting->license !== 'free') { if (wpave_fs()->can_use_premium_code()) { $saving[$setting_name] = Adv_Vis_Ele_Admin::filter_setting($setting, $setting_value); } else { $saving[$setting_name] = $setting->default; } } else { $saving[$setting_name] = Adv_Vis_Ele_Admin::filter_setting($setting, $setting_value); } } } return $saving; } /** * Quick save preview (AJAX) */ public function ajax_quick_save() { $nonce_verified = isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ave_ajax'); if (!$nonce_verified) { wp_send_json_error(['code' => '010']); } if (!isset($_POST['id'])) { return; } $post_id = (int)$_POST['id']; $element_id = sanitize_text_field($_POST['element-id']); $settings = []; foreach ($_POST['settings'] as $key => $setting) { $key = sanitize_text_field($key); if (is_array($setting)) { $settings[$key] = array_map('wp_kses_post', $setting); } else { $settings[$key] = wp_kses_post($setting); } } $meta_settings = Adv_Vis_Ele_Admin::get_element_meta_settings($post_id); if (!empty($meta_settings)) { foreach ($settings as $name => $setting) { if (in_array($name, array_keys($meta_settings))) { $meta_settings[$name] = $setting; } } } else { $meta_settings = $settings; } $saving = $this->get_saving_settings($meta_settings, $element_id); Adv_Vis_Ele_Admin::save_element_meta_settings($saving, $post_id); $saving['adv-vis-ele-element_id'] = $element_id; wp_send_json_success(['export' => json_encode($saving)]); } }