File "index.php"
Full Path: /home/vantageo/public_html/cache/cache/cache/cache/cache/cache/.wp-cli/wp-content/plugins/woo-bulk-editor/index.php
File size: 71.34 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/*
Plugin Name: BEAR – Bulk Editor and Products Manager Professional for WooCommerce
Plugin URI: https://bulk-editor.com/
Description: Tools for managing and bulk edit <strong>WooCommerce Products</strong> data in the reliable and flexible way! Be professionals with managing data of your e-shop!
Requires at least: WP 4.9
Tested up to: WP 6.5
Author: realmag777
Author URI: https://pluginus.net/
Version: 1.1.4.4
Requires PHP: 7.2
Tags: woocommerce, woocommerce bulk edit, bulk edit, bulk, products editor
Text Domain: woo-bulk-editor
Domain Path: /languages
WC requires at least: 3.6
WC tested up to: 8.6
Forum URI: https://pluginus.net/support/forum/woobe-woocommerce-bulk-editor-professional/
*/
//update_option('woobe_options_' . get_current_user_id(), ''); //absolute reset of the plugin settings - be care
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
if (defined('WOOBE_PATH')) {
add_action('admin_notices', function () {
?>
<div class="notice notice-error is-dismissible">
<p><?php esc_html_e("Hello, looks like you bought and installed premium version of BEAR - WooCommerce Bulk Editor and Products Manager Professional, please deactivate free version before, then uninstall it. Any way: 2 versions of the same plugin cannot be activated on the same time! Use most new one version.", 'woo-bulk-editor'); ?></p>
</div>
<?php
});
return false;
}
//***
add_action('before_woocommerce_init', function () {
if (class_exists('\Automattic\WooCommerce\Utilities\FeaturesUtil')) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
}
});
define('WOOBE_PATH', plugin_dir_path(__FILE__));
define('WOOBE_LINK', plugin_dir_url(__FILE__));
define('WOOBE_ASSETS_LINK', WOOBE_LINK . 'assets/');
define('WOOBE_DATA_PATH', WOOBE_PATH . 'data/');
define('WOOBE_PLUGIN_NAME', plugin_basename(__FILE__));
define('WOOBE_VERSION', '1.1.4.4');
//define('WOOBE_VERSION', uniqid('woobe-'));//dev
define('WOOBE_MIN_WOOCOMMERCE_VERSION', '3.6');
//+++
try {
$lang_domain = 'woo-bulk-editor';
$lang_dir = WP_CONTENT_DIR . '/languages/plugins/';
$locale = get_locale();
unload_textdomain($lang_domain);
if (is_file("{$lang_dir}{$lang_domain}-{$locale}.mo")) {
load_textdomain($lang_domain, "{$lang_dir}{$lang_domain}-{$locale}.mo");
} else {
if (is_file(WOOBE_PATH . "languages/{$lang_domain}-{$locale}.mo")) {
load_textdomain($lang_domain, WOOBE_PATH . "languages/{$lang_domain}-{$locale}.mo");
} else {
load_plugin_textdomain($lang_domain, false, WOOBE_PATH . 'languages');
}
}
} catch (Exception $e) {
//+++
}
//+++
//libs
include WOOBE_PATH . 'lib/storage.php';
//data
include_once WOOBE_DATA_PATH . 'fields.php';
include_once WOOBE_DATA_PATH . 'settings.php';
//classes
include WOOBE_PATH . 'classes/helper.php';
include WOOBE_PATH . 'classes/models/profiles.php';
include WOOBE_PATH . 'classes/models/settings.php';
include WOOBE_PATH . 'classes/models/products.php';
include WOOBE_PATH . 'classes/ext.php';
include WOOBE_PATH . 'classes/alert.php';
//07-03-2024
final class WOOBE {
public $storage = NULL;
public $settings = NULL;
public $products = NULL;
public $profiles = NULL;
private $ext = array('filters', 'bulk', 'export', 'meta', 'history', 'calculator', 'info', 'fprofiles', 'bulkoperations', 'vendor_area');
public $show_notes = true;
//extensions
public $filters = null;
public $bulk = null;
public $export = null;
public $meta = null;
public $history = null;
public $calculator = null;
public $info = null;
public $fprofiles = null;
public $bulkoperations = null;
public $vendor_area = null;
public function __construct() {
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
//fix for sheduled post
add_filter('woobe_product_statuses', array($this, 'add_statuses'));
}
public function init() {
if (!is_admin()) {
return;
}
if (!class_exists('WooCommerce')) {
return;
}
//no one operation is possible if user is not products administrator!!
if (!current_user_can('manage_woocommerce')) {
return;
}
$this->ask_favour();
//***
add_filter('plugin_action_links_' . WOOBE_PLUGIN_NAME, array($this, 'plugin_action_links'), 50);
//***
if (isset($_GET['page']) AND $_GET['page'] == 'woobe') {
//WOOCS compatibility
if (class_exists('WOOCS')) {
global $WOOCS;
$WOOCS->reset_currency();
remove_filter('woocommerce_product_get_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 2);
remove_filter('woocommerce_product_variation_get_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 2);
remove_filter('woocommerce_product_variation_get_regular_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 2);
remove_filter('woocommerce_product_variation_get_sale_price', array($WOOCS, 'raw_sale_price_filter'), 9999, 2);
remove_filter('woocommerce_product_get_regular_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 2);
remove_filter('woocommerce_product_get_sale_price', array($WOOCS, 'raw_woocommerce_price_sale'), 9999, 2);
remove_filter('woocommerce_get_variation_regular_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 4);
remove_filter('woocommerce_get_variation_sale_price', array($WOOCS, 'raw_woocommerce_price'), 9999, 4);
remove_filter('woocommerce_variation_prices', array($WOOCS, 'woocommerce_variation_prices'), 9999, 3);
}
add_action('admin_notices', function () {
$user_id = get_current_user_id();
if (!get_user_meta($user_id, 'woobe_notice_dismissed')) {
echo '<div class="notice notice-warning"><p>' . sprintf(esc_html__('If you not familiar with the plugin, firstly %s please', 'woo-bulk-editor'), WOOBE_HELPER::draw_link(array(
'title' => esc_html__('visit this page', 'woo-bulk-editor'),
'href' => 'https://bulk-editor.com/document/woocommerce-products-editor/',
'target' => '_blank',
'style' => 'line-height: 2em;'
))) . '</p><a href="edit.php?post_type=product&page=woobe&woobe-notice-dismissed=1¬ice_nonce=' . wp_create_nonce('woobe_notice_nonce') . '" class="notice-dismiss"></a></div>';
}
});
add_action('admin_init', function () {
$user_id = get_current_user_id();
if (isset($_GET['woobe-notice-dismissed']) && isset($_GET['notice_nonce']) && wp_verify_nonce($_GET['notice_nonce'], 'woobe_notice_nonce')) {
add_user_meta($user_id, 'woobe_notice_dismissed', 'true', true);
}
});
}
//side bar menu
add_action('admin_menu', function () {
add_submenu_page('edit.php?post_type=product', 'BEAR ' . esc_html__('Bulk Editor', 'woo-bulk-editor'), 'BEAR ' . esc_html__('Bulk Editor', 'woo-bulk-editor'), 'manage_woocommerce', 'woobe', function () {
$this->print_plugin_options();
});
}, 99);
add_action('admin_bar_menu', function ($wp_admin_bar) {
$opt = get_option('woobe_options_' . apply_filters('woobe_settings_key_options', get_current_user_id())); //not beauty but we need it here
$show = true;
if (isset($opt['options']['show_admin_bar_menu_btn'])) {
$show = intval($opt['options']['show_admin_bar_menu_btn']);
}
if ($show) {
$args = array(
'id' => 'woobe-btn',
'title' => 'BEAR ' . esc_html__('Bulk Editor', 'woo-bulk-editor'),
'href' => admin_url('edit.php?post_type=product&page=woobe'),
'meta' => array(
'class' => 'wp-admin-bar-woobe-btn',
'title' => 'BEAR - WooCommerce Bulk Editor'
)
);
$wp_admin_bar->add_node($args);
}
unset($opt);
}, 250);
//do not init hooks and all other parts of the plugins as we not need it on all site pages
if (!$this->is_should_init()) {
return;
}
//***
//include extensions and their hooks
if (!empty($this->ext)) {
foreach ($this->ext as $ext_slug) {
include WOOBE_PATH . 'ext' . DIRECTORY_SEPARATOR . $ext_slug . DIRECTORY_SEPARATOR . $ext_slug . '.php';
$class_name = 'WOOBE_' . strtoupper($ext_slug);
$this->$ext_slug = new $class_name();
}
}
//woobe_ext - include extensions from wp-content folder
$woobe_more_ext_path = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'woobe_ext';
if (file_exists($woobe_more_ext_path)) {
$dir = new DirectoryIterator($woobe_more_ext_path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() AND !$fileinfo->isDot()) {
$ext_slug = trim($fileinfo->getFilename());
include $woobe_more_ext_path . DIRECTORY_SEPARATOR . $ext_slug . DIRECTORY_SEPARATOR . $ext_slug . '.php';
$class_name = 'WOOBE_' . strtoupper($ext_slug);
$this->$ext_slug = new $class_name();
$this->ext[] = $ext_slug;
}
}
}
//***
//init variables and hooks of the extensions will be applied, for example hook woobe_extend_fields
$this->storage = new WOOBE_STORAGE();
$this->settings = new WOOBE_SETTINGS();
$this->profiles = new WOOBE_PROFILES($this->settings);
$this->products = new WOOBE_PRODUCTS($this->settings, $this->storage);
if (!empty($this->ext)) {
foreach ($this->ext as $ext_slug) {
//we do it to allow ext hooks works everywhere (in the application and all its extensions)
$this->$ext_slug->init_vars($this->storage, $this->profiles, $this->settings, $this->products);
}
}
//***
//load_plugin_textdomain('woo-bulk-editor', false, 'woo-bulk-editor/languages');
//ajax
add_action('wp_ajax_woobe_get_products', array($this, 'woobe_get_products'), 1);
add_action('wp_ajax_woobe_update_page_field', array($this, 'woobe_update_page_field'), 1);
add_action('wp_ajax_woobe_redraw_table_row', array($this, 'woobe_redraw_table_row'), 1);
add_action('wp_ajax_woobe_get_post_field', array($this, 'get_post_field'), 1);
add_action('wp_ajax_woobe_get_downloads', array($this, 'get_downloads'), 1);
add_action('wp_ajax_woobe_get_gallery', array($this, 'woobe_get_gallery'), 1);
add_action('wp_ajax_woobe_get_upsells', array($this, 'woobe_get_upsells'), 1);
add_action('wp_ajax_woobe_get_cross_sells', array($this, 'woobe_get_cross_sells'), 1);
add_action('wp_ajax_woobe_get_grouped', array($this, 'woobe_get_grouped'), 1);
add_action('wp_ajax_woobe_create_new_product', array($this, 'woobe_create_new_product'), 1);
add_action('wp_ajax_woobe_duplicate_products', array($this, 'woobe_duplicate_products'), 1);
add_action('wp_ajax_woobe_delete_products', array($this, 'woobe_delete_products'), 1);
add_action('wp_ajax_woobe_create_new_term', array($this, 'woobe_create_new_term'), 1);
add_action('wp_ajax_woobe_update_tax_term', array($this, 'woobe_update_tax_term'), 1);
add_action('wp_ajax_woobe_delete_tax_term', array($this, 'woobe_delete_tax_term'), 1);
//***
add_action('wp_ajax_woobe_title_autocomplete', array($this, 'woobe_title_autocomplete'));
add_action('wp_ajax_woobe_save_options', array($this, 'woobe_save_options'), 1);
//***
add_post_type_support('product', 'author');
$alert = new WOOBE_ADV();
$alert->init();
}
/**
* Show action links on the plugins page screen
*/
public function plugin_action_links($links) {
$buttons = array(
'<a href="' . admin_url('edit.php?post_type=product&page=woobe') . '">' . esc_html__('Products Editor', 'woo-bulk-editor') . '</a>',
'<a target="_blank" href="https://bulk-editor.com/"><span class="icon-book"></span> ' . esc_html__('Documentation', 'woo-bulk-editor') . '</a>'
);
if ($this->show_notes) {
$buttons[] = '<a target="_blank" style="color: red; font-weight: bold;" href="' . esc_url('https://pluginus.net/affiliate/woocommerce-bulk-editor') . '">' . esc_html__('Go Pro!', 'woo-bulk-editor') . '</a>';
}
return array_merge($buttons, $links);
}
public function admin_enqueue_scripts() {
if (isset($_GET['page']) AND $_GET['page'] == 'woobe') {
?>
<script>
var lang = {
move: "<?php echo esc_html__('move', 'woo-bulk-editor') ?>",
search: "<?php echo esc_html__('Search', 'woo-bulk-editor') ?>",
rest_failed: "<?php echo esc_html__('Failed', 'woo-bulk-editor') ?>",
error: "<?php echo esc_html__('Error', 'woo-bulk-editor') ?>",
delete: "<?php echo esc_html__('delete', 'woo-bulk-editor') ?>",
ignore: "<?php echo esc_html__('ignore', 'woo-bulk-editor') ?>",
no_deletable: "<?php echo esc_html__('This is not deletable!', 'woo-bulk-editor') ?>",
no_items: "<?php echo esc_html__('no items', 'woo-bulk-editor') ?>",
none: "<?php echo esc_html__('none', 'woo-bulk-editor') ?>",
no_data: "<?php echo esc_html__('no data', 'woo-bulk-editor') ?>",
loading: "<?php echo esc_html__('Loading', 'woo-bulk-editor') ?> ...",
loaded: "<?php echo esc_html__('Loaded', 'woo-bulk-editor') ?>.",
saved: "<?php echo esc_html__('Saved', 'woo-bulk-editor') ?>.",
saving: "<?php echo esc_html__('Saving', 'woo-bulk-editor') ?> ...",
apply: "<?php echo esc_html__('Apply', 'woo-bulk-editor') ?>",
cancel: "<?php echo esc_html__('Cancel', 'woo-bulk-editor') ?>",
canceled: "<?php echo esc_html__('Canceled', 'woo-bulk-editor') ?>",
sure: "<?php echo esc_html__('Sure?', 'woo-bulk-editor') ?>",
creating: "<?php echo esc_html__('Creating', 'woo-bulk-editor') ?> ...",
created: "<?php echo esc_html__('Created!', 'woo-bulk-editor') ?>",
duplicating: "<?php echo esc_html__('Duplicating', 'woo-bulk-editor') ?> ...",
duplicated: "<?php echo esc_html__('Duplicated!', 'woo-bulk-editor') ?>",
deleting: "<?php echo esc_html__('Deleting', 'woo-bulk-editor') ?> ...",
deleted: "<?php echo esc_html__('Deleted!', 'woo-bulk-editor') ?>",
reseting: "<?php echo esc_html__('Reseting', 'woo-bulk-editor') ?> ...",
reseted: "<?php echo esc_html__('Reseted!', 'woo-bulk-editor') ?>",
upload_image: "<?php echo esc_html__('Upload image', 'woo-bulk-editor') ?>",
upload_images: "<?php echo esc_html__('Upload images', 'woo-bulk-editor') ?>",
select_all: "<?php echo esc_html__('Select all', 'woo-bulk-editor') ?>",
deselect_all: "<?php echo esc_html__('Deselect all', 'woo-bulk-editor') ?>",
upload_file: "<?php echo esc_html__('Upload file', 'woo-bulk-editor') ?>",
fill_up_data: "<?php echo esc_html__('Fill up the data please!', 'woo-bulk-editor') ?>",
enter_duplicate_count: "<?php echo esc_html__('Enter how many time duplicate selected product(s)!', 'woo-bulk-editor') ?>",
enter_new_count: "<?php echo esc_html__('Enter how many new product(s) to create!', 'woo-bulk-editor') ?>",
search_input_placeholder: "<?php echo esc_html__('Text search by title or SKU', 'woo-bulk-editor') ?>",
show_panel: "<?php esc_html_e('Show: Filters/Bulk Edit/Export', 'woo-bulk-editor') ?>",
close_panel: "<?php esc_html_e('Hide: Filters/Bulk Edit/Export', 'woo-bulk-editor') ?>",
per_page: "<?php esc_html_e('Per page', 'woo-bulk-editor') ?>",
color_picker_col: "<?php esc_html_e('Select background color', 'woo-bulk-editor') ?>",
color_picker_txt: "<?php esc_html_e('Select text color', 'woo-bulk-editor') ?>",
sEmptyTable: "<?php esc_html_e('No data available in the table', 'woo-bulk-editor') ?>",
sInfo: "<?php esc_html_e('Showing _START_ to _END_ of _TOTAL_ entries', 'woo-bulk-editor') ?>",
sInfoEmpty: "<?php esc_html_e('Showing 0 to 0 of 0 entries', 'woo-bulk-editor') ?>",
sInfoFiltered: "<?php esc_html_e('(filtered from _MAX_ total entries)', 'woo-bulk-editor') ?>",
sLoadingRecords: "<?php esc_html_e('Loading...', 'woo-bulk-editor') ?>",
sProcessing: "<?php esc_html_e('Processing...', 'woo-bulk-editor') ?>",
sZeroRecords: "<?php esc_html_e('No matching records found', 'woo-bulk-editor') ?>",
sFirst: "<?php esc_html_e('First', 'woo-bulk-editor') ?>",
sLast: "<?php esc_html_e('Last', 'woo-bulk-editor') ?>",
sNext: "<?php esc_html_e('Next', 'woo-bulk-editor') ?>",
sPrevious: "<?php esc_html_e('Previous', 'woo-bulk-editor') ?>",
action_state_1: "<?php esc_html_e('all the products on the site', 'woo-bulk-editor') ?>",
action_state_2: "<?php esc_html_e('the filtered products. To remove the products filtering press reset button on the tools panel below', 'woo-bulk-editor') ?>",
action_state_31: "<?php esc_html_e('the selected products (variations)', 'woo-bulk-editor') ?>",
action_state_32: "<?php esc_html_e('You can reset selection of the products by its reset button on the panel of the editor OR uncheck them manually!', 'woo-bulk-editor') ?>",
term_maybe_exist: "<?php esc_html_e('Maybe term(s) with such name(s) already exists!', 'woo-bulk-editor') ?>",
free_ver_profiles: "<?php esc_html_e('In FREE version of the plugin you can create one profile only!', 'woo-bulk-editor') ?>",
append_sub_item: "<?php esc_html_e('append sub item', 'woo-bulk-editor') ?>",
is_deactivated_in_free: "<?php esc_html_e('This field is deactivated in FREE version for bulk edit!', 'woo-bulk-editor') ?>",
checked_products: "<?php esc_html_e('Products checked', 'woo-bulk-editor') ?>"
};
var woobe_settings = {
show_thumbnail_preview: <?php echo intval($this->settings->show_thumbnail_preview) ?>,
load_switchers: <?php echo intval($this->settings->load_switchers) ?>,
autocomplete_max_elem_count: <?php echo intval($this->settings->autocomplete_max_elem_count) ?>,
number_posts_processed: <?php echo intval($this->settings->number_posts_processed) ?>,
show_notes: <?php echo intval($this->show_notes) ?>
};
var woobe_assets_link = "<?php echo WOOBE_ASSETS_LINK ?>";
var spinner = woobe_assets_link + "/images/spinner.gif";
//***
<?php
if (class_exists('SitePress')) {
add_filter('woobe_current_language', function () {
//WPML compatibility
//because if it will be selected 'all' language - will be shown default one
return ICL_LANGUAGE_CODE;
});
}
?>
var woobe_lang = '<?php echo apply_filters('woobe_current_language', '') ?>';//for translating compatibilities
</script>
<?php
wp_enqueue_style('open_sans_font', 'https://fonts.googleapis.com/css?family=Open+Sans');
wp_enqueue_style('woobe-bootstrap-grid', WOOBE_ASSETS_LINK . 'css/bootstrap-grid.css', array(), WOOBE_VERSION);
wp_enqueue_style('woobe', WOOBE_ASSETS_LINK . 'css/woobe.css', array(), WOOBE_VERSION);
wp_enqueue_style('woobe_scrollbar', WOOBE_ASSETS_LINK . 'css/jquery.scrollbar.css', array(), WOOBE_VERSION);
wp_enqueue_style('woobe_fontello', WOOBE_ASSETS_LINK . 'css/fontello.css', array(), WOOBE_VERSION);
//***
wp_enqueue_media();
wp_enqueue_script('media-upload');
wp_enqueue_style('thickbox');
wp_enqueue_script('thickbox');
wp_enqueue_style('wp-color-picker');
wp_enqueue_script('wp-color-picker');
wp_enqueue_style('woobe_datatables', WOOBE_ASSETS_LINK . 'css/tables.css', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_datatables_net', WOOBE_ASSETS_LINK . 'js/jquery.dataTables.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_script('woobe_data_tables', WOOBE_ASSETS_LINK . 'js/data-tables.js', array('woobe_datatables_net'), WOOBE_VERSION);
wp_enqueue_style('woobe_data_tables_fc', 'https://cdn.datatables.net/fixedcolumns/4.2.1/css/fixedColumns.dataTables.min.css');
wp_enqueue_script('woobe_data_tables_fc', 'https://cdn.datatables.net/fixedcolumns/4.2.1/js/dataTables.fixedColumns.min.js');
wp_enqueue_script('woobe_jquery_growl', WOOBE_ASSETS_LINK . 'js/jquery.growl.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_style('woobe_switchery', WOOBE_ASSETS_LINK . 'js/switchery/switchery.min.css', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_switchery', WOOBE_ASSETS_LINK . 'js/switchery/switchery.min.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_style('woobe_chosen', WOOBE_ASSETS_LINK . 'js/chosen/chosen.min.css', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_chosen', WOOBE_ASSETS_LINK . 'js/chosen/chosen.jquery.min.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_style('woobe_autocomplete', WOOBE_ASSETS_LINK . 'js/easy-autocomplete/easy-autocomplete.min.css', array(), WOOBE_VERSION);
wp_enqueue_style('woobe_autocomplete_theme', WOOBE_ASSETS_LINK . 'js/easy-autocomplete/easy-autocomplete.themes.min.css', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_autocomplete', WOOBE_ASSETS_LINK . 'js/easy-autocomplete/jquery.easy-autocomplete.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_style('woobe_datetimepicker', WOOBE_ASSETS_LINK . 'js/bootstrap-material-datetimepicker/css/bootstrap-material-datetimepicker.css', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_datetimepicker_moment', WOOBE_ASSETS_LINK . 'js/datepicker/moment-with-locales.min.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_script('woobe_datetimepicker', WOOBE_ASSETS_LINK . 'js/bootstrap-material-datetimepicker/bootstrap-material-datetimepicker.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_script('woobe_placeholder_label', WOOBE_ASSETS_LINK . 'js/jquery.placeholder.label.min.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_script('woobe_tooltip', WOOBE_ASSETS_LINK . 'js/tooltip.js', array('jquery'), WOOBE_VERSION);
wp_enqueue_script('woobe_tabs', WOOBE_ASSETS_LINK . 'js/tabs.js', array(), WOOBE_VERSION);
wp_enqueue_script('woobe_scrollbar', WOOBE_ASSETS_LINK . 'js/jquery.scrollbar.min.js', array(), WOOBE_VERSION);
//***
wp_enqueue_script('woobe', WOOBE_ASSETS_LINK . 'js/woobe.js', array('jquery', 'jquery-ui-core', 'jquery-ui-sortable', 'woobe_tabs'), WOOBE_VERSION);
do_action('woobe_ext_scripts'); //including extensions scripts
}
}
public function print_plugin_options() {
$args = array();
$args['options'] = $this->settings->get_options();
$args['total_settings'] = $this->settings->get_total_settings();
$args['tax_keys'] = array();
$args['attribute_keys'] = array();
$args['is_popupeditor'] = FALSE;
$args['is_downloads'] = FALSE;
$args['is_gallery'] = FALSE;
$args['is_upsells'] = FALSE;
$args['is_cross_sells'] = FALSE;
$args['is_grouped'] = FALSE;
$args['meta_popup_editor'] = FALSE;
//to generate terms in popup taxonomies data
if (!empty($this->settings->active_fields)) {
foreach ($this->settings->active_fields as $k => $f) {
if ($f['field_type'] == 'taxonomy' AND $f['edit_view'] == 'popup') {
$args['tax_keys'][] = $f['taxonomy'];
}
if ($f['field_type'] == 'attribute') {
$args['attribute_keys'][] = $k;
}
//***
if ($f['edit_view'] == 'popupeditor') {
$args['is_popupeditor'] = TRUE;
}
if ($f['edit_view'] == 'downloads_popup_editor') {
$args['is_downloads'] = TRUE;
}
if ($f['edit_view'] == 'gallery_popup_editor') {
$args['is_gallery'] = TRUE;
}
if ($f['edit_view'] == 'upsells_popup_editor') {
$args['is_upsells'] = TRUE;
}
if ($f['edit_view'] == 'cross_sells_popup_editor') {
$args['is_cross_sells'] = TRUE;
}
if ($f['edit_view'] == 'grouped_popup_editor') {
$args['is_grouped'] = TRUE;
}
if ($f['edit_view'] == 'meta_popup_editor') {
$args['meta_popup_editor'] = TRUE;
}
}
}
//***
$args['active_fields'] = $this->settings->active_fields;
$args['settings_fields'] = $this->settings->get_fields();
$args['settings_fields_full'] = $this->settings->get_fields(false);
$args['settings_fields_keys'] = $this->settings->get_fields_keys();
$args['editable'] = $this->settings->editable;
$args['default_sortby_col_num'] = $this->settings->get_default_sortby_col_num();
$args['default_sort'] = $this->settings->default_sort;
$args['no_order'] = $this->settings->no_order;
$args['per_page'] = $this->settings->per_page;
$args['extend_per_page'] = apply_filters('woobe_set_per_page_values', '');
$args['show_notes'] = $this->show_notes;
$args['current_user_role'] = $this->settings->current_user_role;
$args['profiles'] = $this->profiles->get();
//***
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/woobe.php', apply_filters('woobe_print_plugin_options', $args));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//ajax
public function woobe_get_products($args = array(), $return = false) {
if (!current_user_can('manage_woocommerce')) {
return;
}
//***
$res = array();
$res['draw'] = isset($_REQUEST['draw']) ? intval($_REQUEST['draw']) : 0;
$res['data'] = array();
$fileds_keys = $this->settings->get_fields_keys();
if (empty($args)) {
//for ajax only
$args = array(
'lang' => sanitize_key($_REQUEST['lang']),
'per_page' => intval($_REQUEST['length']),
'offset' => intval($_REQUEST['start']),
'order_by' => $fileds_keys[intval($_REQUEST['order'][0]['column'])],
'order' => sanitize_key($_REQUEST['order'][0]['dir']),
'search' => sanitize_text_field($_REQUEST['search']['value'])
);
}
$products = $this->products->gets($args);
$res['recordsFiltered'] = $res['recordsTotal'] = $products->found_posts;
if ($products->found_posts > 0) {
$products_types = array();
$products_titles = array();
wp_cache_flush();
foreach ($products->posts as $p) {
$product_type = WC_Data_Store::load('product')->get_product_type($p->ID);
$res['data'][] = $this->_pack_row($p, $product_type);
$products_types[$p->ID] = $product_type;
$products_titles[$p->ID] = str_replace('"', "", str_replace("'", "", $p->post_title));
//get variations if exists and requested
if ($product_type == 'variable' AND ( isset($_REQUEST['woobe_show_variations']) AND intval($_REQUEST['woobe_show_variations']) > 0)) {
$variations = $this->products->gets(array('get_variations' => $p->ID));
if ($variations->found_posts > 0) {
foreach ($variations->posts as $var) {
$res['data'][] = $this->_pack_row($var, 'variation');
$products_types[$var->ID] = 'variation';
$products_titles[$var->ID] = str_replace('"', "", str_replace("'", "", $var->post_title));
//***
if ($this->settings->add_vars_to_var_title) {
$products_titles[$var->ID] = $this->products->generate_product_title($this->products->get_product($var->ID));
}
}
}
}
//***
//data for javascript functionality on the front
$res['products_types'] = $products_types;
$res['products_titles'] = $products_titles;
//$res['query']=$products->request;
}
}
//***
//echo get_num_queries() . ' + ';exit;
if (!$return) {
//if requested by ajax
die(json_encode($res));
}
return $res;
}
//service
private function _pack_row($p, $product_type) {
//wp_cache_flush();
$row = array();
$p = (array) $p;
foreach ($this->settings->get_fields_keys() as $key) {
$row[] = $this->wrap_field_val($p, $key, $product_type);
}
if ($product_type !== 'variation') {
//buttons: edit + view
$row[] = WOOBE_HELPER::draw_link(array(
'title' => '',
'href' => get_permalink($p['ID']),
'target' => '_blank',
'class' => 'button button-primary button-small button-small-2',
'title_attr' => esc_html__('View the product on the site front', 'woo-bulk-editor')
)) . ' ' . WOOBE_HELPER::draw_link(array(
'title' => '',
'href' => get_admin_url() . 'post.php?post=' . $p['ID'] . '&action=edit',
'target' => '_blank',
'class' => 'button button-primary button-small button-small-2',
'title_attr' => esc_html__('Editing of the product on its page', 'woo-bulk-editor')
));
} else {
$row[] = '';
}
return $row;
}
//ajax
public function woobe_update_page_field() {
if (!isset($_REQUEST['mainform_nonce']) || !wp_verify_nonce($_REQUEST['mainform_nonce'], 'woobe_mainform_nonce')) {
die('0');
}
$product_id = intval($_REQUEST['product_id']);
if (!isset($_REQUEST['value']) || $_REQUEST['value'] == null) {
$_REQUEST['value'] = array();
}
$field_key = sanitize_text_field(trim($_REQUEST['field'])); //if sanitize by sanitize_key not all meta keys works normally!!
if ($product_id > 0 AND isset($_REQUEST['value'])) {
if ($_REQUEST['value']) {
if (is_array($_REQUEST['value'])) {
$value = $_REQUEST['value'];
$value = WOOBE_HELPER::sanitize_array((array) $_REQUEST['value']);
} else {
$is_encoded = preg_match('~%[0-9A-F]{2}~i', $_REQUEST['value']);
$allowedpost = wp_kses_allowed_html('post');
if ('post_content' == $_REQUEST['field'] OR 'post_excerpt' == $_REQUEST['field'] OR $this->settings->active_fields[$field_key]['edit_view'] === 'popupeditor') {
$is_encoded = false;
$allowedpost['iframe'] = array(
'align' => true,
'frameborder' => true,
'height' => true,
'width' => true,
'sandbox' => true,
'seamless' => true,
'scrolling' => true,
'srcdoc' => true,
'src' => true,
'class' => true,
'id' => true,
'style' => true,
'border' => true,
);
}
if ($is_encoded) {
$data_array = [];
parse_str($_REQUEST['value'], $data_array);
$value = WOOBE_HELPER::sanitize_array($data_array);
} else {
if (apply_filters('woobe_use_kses_for_page_field', true)) {
$value = wp_kses($_REQUEST['value'], $allowedpost);
} else {
$value = sanitize_text_field($_REQUEST['value']);
}
}
}
} else {
$value = "";
if (isset($this->settings->get_fields()[sanitize_text_field($_REQUEST['field'])]) && 'taxonomy' == $this->settings->get_fields()[sanitize_text_field($_REQUEST['field'])]['field_type']) {
$value = array();
}
}
//***
//normalize calendar date
if ($this->settings->active_fields[$field_key]['edit_view'] === 'calendar') {
if ($this->settings->active_fields[$field_key]["field_type"] AND $this->settings->active_fields[$field_key]["field_type"] == "meta") {
$value = strtotime($value);
} else {
$value = $this->products->normalize_calendar_date($value, $field_key);
}
}
//***
//uploated to
if (isset($_REQUEST['uploaded_to']) AND $_REQUEST['uploaded_to'] == 1 AND $field_key == '_thumbnail_id') {
$id_th = intval($value);
if ($id_th) {
$my_post = array();
$my_post['ID'] = $id_th;
$my_post['post_parent'] = $product_id;
wp_update_post(wp_slash($my_post));
}
}
$value = $this->products->string_replacer($value, $product_id);
$value = $this->products->string_macros($value, $field_key, $product_id);
echo $this->products->update_page_field($product_id, $field_key, $value);
//die(json_encode($value));
}
exit;
}
//ajax
public function woobe_redraw_table_row() {
if (is_array($_REQUEST['value'])) {
$value = (array) $_REQUEST['value'];
} else {
$value = sanitize_text_field(trim($_REQUEST['value']));
}
//***
$product_id = intval($_REQUEST['product_id']);
if ($product_id > 0) {
if (isset($_REQUEST['field']) AND !empty($_REQUEST['field'])) {
$field_key = sanitize_key($_REQUEST['field']);
if (!empty($field_key)) {
$this->products->update_page_field($product_id, $field_key, $value);
}
}
//generate table row by $product_id
$res = $this->woobe_get_products(array(
'p' => $product_id,
'post_type' => array('product', 'product_variation')
), true);
echo(json_encode($res['data'][0]));
}
exit;
}
//ajax
public function get_post_field() {
$test = $this->products->get_post_field(intval($_REQUEST['product_id']), sanitize_key($_REQUEST['field']), (isset($_REQUEST['post_parent']) ? intval($_REQUEST['post_parent']) : 0));
echo $test;
exit;
}
//ajax
public function get_downloads() {
$product_id = intval($_REQUEST['product_id']);
if (!$product_id) {
exit;
}
$product = $this->products->get_product($product_id);
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/parts/product-downloads.php', array(
'downloadable_files' => $product->get_downloads('edit')
));
exit;
}
//ajax
public function woobe_get_gallery() {
$product_id = intval($_REQUEST['product_id']);
if (!$product_id) {
exit;
}
$product = $this->products->get_product($product_id);
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/parts/product-gallery.php', array(
'images' => $product->get_gallery_image_ids('edit')
));
exit;
}
//ajax
public function woobe_get_upsells() {
$product_id = intval($_REQUEST['product_id']);
if (!$product_id) {
exit;
}
$product = $this->products->get_product($product_id);
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/parts/product-upsells.php', array(
'products' => $product->get_upsell_ids('edit')
));
exit;
}
//ajax
public function woobe_get_cross_sells() {
$product_id = intval($_REQUEST['product_id']);
if (!$product_id) {
exit;
}
$product = $this->products->get_product($product_id);
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/parts/product-cross-sells.php', array(
'products' => $product->get_cross_sell_ids('edit')
));
exit;
}
//ajax
public function woobe_get_grouped() {
$product_id = intval($_REQUEST['product_id']);
if (!$product_id) {
exit;
}
$product = $this->products->get_product($product_id);
echo WOOBE_HELPER::render_html(WOOBE_PATH . 'views/parts/product-grouped.php', array(
'products' => $product->get_children('edit')
));
exit;
}
//ajax
public function woobe_save_options() {
if (!current_user_can('manage_woocommerce')) {
die('0');
}
if (!isset($_REQUEST['mainform_nonce']) || !wp_verify_nonce($_REQUEST['mainform_nonce'], 'woobe_mainform_nonce')) {
die('0');
}
$data = array();
parse_str($_REQUEST['formdata'], $data);
$data = WOOBE_HELPER::sanitize_array($data);
if (isset($data['woobe_options'])) {
if (is_array($data['woobe_options'])) {
$this->settings->update_options($data['woobe_options']);
}
//***
//save shop manager fields visibility
if (in_array($this->settings->current_user_role, apply_filters('woobe_permit_special_roles', ['administrator']))) {
$shop_manager_visibility = array();
foreach ($data['woobe_options']['fields'] as $key => $v) {
if (isset($v['shop_manager_visibility'])) {
$shop_manager_visibility[$key] = intval($v['shop_manager_visibility']);
}
}
update_option('woobe_shop_manager_visibility', $shop_manager_visibility);
}
}
exit;
}
//ajax
public function woobe_title_autocomplete() {
$results = array();
$results[] = array(
"name" => esc_html__("Products not found!", 'woo-bulk-editor'),
"id" => 0,
"type" => "",
"link" => "#",
"icon" => WOOBE_ASSETS_LINK . 'images/not-found.jpg'
);
//***
if (!empty($_REQUEST['woobe_txt_search'])) {
$args = array(
'nopaging' => true,
'post_type' => array('product', 'product_variation'),
'post_status' => array_keys(apply_filters('woobe_product_statuses', get_post_statuses())),
'order_by' => 'title',
'order' => 'ASC',
'per_page' => intval($_REQUEST['auto_res_count']) > 0 ? intval($_REQUEST['auto_res_count']) : 10,
'max_num_pages' => intval($_REQUEST['auto_res_count']) > 0 ? intval($_REQUEST['auto_res_count']) : 10
);
//***
if (!empty($_REQUEST['exept_ids'])) {
$exept_ids = array(); //which products exclude as they are on the list already
parse_str($_REQUEST['exept_ids'], $exept_ids);
if (isset($exept_ids['woobe_prod_ids'])) {
$args['post__not_in'] = array_map(function ($item) {
return intval($item); //sanitize intval
}, $exept_ids['woobe_prod_ids']);
}
}
//***
$st = sanitize_text_field($_REQUEST['woobe_txt_search']);
if (0 == $this->settings->autocomplet_txt_search) {
$_REQUEST['woobe_txt_search'] = array();
$_REQUEST['woobe_txt_search']['post_title'] = $st;
$_REQUEST['woobe_txt_search_behavior'] = array();
$_REQUEST['woobe_txt_search_behavior']['post_title'] = 'like';
add_filter('posts_where', array($this->filters, 'posts_txt_where'), 101);
} elseif (1 == $this->settings->autocomplet_txt_search) {
$_REQUEST['woobe_autocomplete_search'] = $st;
add_filter('posts_where', array($this, 'autocomplete_search'), 101);
}
$this->products->suppress_filters = true;
$query = $this->products->gets($args);
//+++
//http://easyautocomplete.com/guide
if ($query->have_posts()) {
$results = array();
foreach ($query->posts as $p) {
$data = array(
"name" => $p->post_title . ' (#' . $p->ID . ')' . ' : ' . get_post_meta($p->ID, '_sku', true),
"id" => $p->ID,
"type" => "product"
);
if (has_post_thumbnail($p->ID)) {
$img_src = wp_get_attachment_image_src(get_post_thumbnail_id($p->ID), 'thumbnail');
$data['icon'] = $img_src[0];
} else {
$data['icon'] = WOOBE_ASSETS_LINK . 'images/not-found.jpg';
}
$data['link'] = get_post_permalink($p->ID);
$results[] = $data;
}
}
}
die(json_encode($results));
}
public function autocomplete_search($where = '') {
if (!isset($_REQUEST['woobe_autocomplete_search'])) {
return $where;
}
global $wpdb;
$search_text = sanitize_text_field($_REQUEST['woobe_autocomplete_search']);
//sku
$args = array(
'post_type' => array('product', 'product_variation'),
'fields' => 'ids',
'meta_query' => array(
array(
'key' => '_sku',
'compare' => 'LIKE',
'value' => $search_text
),
)
);
$product_variations_ids = get_posts($args);
if (!empty($product_variations_ids)) {
if (empty($product_variations_ids)) {
foreach ($product_variations as $v) {
$product_variations_ids[] = $v[0];
}
}
//+++
$product_variations_ids_string = implode(',', $product_variations_ids);
$sql[] = " ($wpdb->posts.ID IN($product_variations_ids_string))";
}
//id
$id_search = (int) $search_text;
if ($id_search) {
$sql[] = " ($wpdb->posts.ID = $id_search )";
}
//title
$like = '%' . $wpdb->esc_like($search_text) . '%';
$sql[] = $wpdb->prepare("($wpdb->posts.post_title LIKE %s)", $like);
$where .= " AND ( " . implode(' OR ', $sql) . " )";
//***
return $where;
}
//ajax
public function woobe_create_new_product() {
if (!current_user_can('manage_woocommerce')) {
die('0');
}
if (!isset($_REQUEST['woobe_nonce']) || !wp_verify_nonce($_REQUEST['woobe_nonce'], 'woobe_tools_panel_nonce')) {
die('0');
}
//also: http://woocommerce.wp-a2z.org/oik_api/wc_api_productscreate_product/
$wp_rest_request = new WP_REST_Request('POST');
$wp_rest_request->set_body_params(array(
'name' => esc_html__('New Product', 'woo-bulk-editor'),
'description' => '',
'status' => apply_filters('woobe_new_product_status', 'draft')
));
$products_controller = new WC_REST_Products_Controller();
$to_create = intval($_REQUEST['to_create']);
while ($to_create) {
$products_controller->create_item($wp_rest_request);
$to_create--;
}
exit;
}
//ajax
public function woobe_duplicate_products() {
if (!current_user_can('manage_woocommerce')) {
die('0');
}
if (!isset($_REQUEST['woobe_nonce']) || !wp_verify_nonce($_REQUEST['woobe_nonce'], 'woobe_tools_panel_nonce')) {
die('0');
}
if (!empty($_REQUEST['products_ids'])) {
if (!class_exists('WC_Admin_Duplicate_Product', false)) {
include_once (plugin_dir_path('woocommerce/includes/admin/class-wc-admin-duplicate-product.php'));
}
$duplicator = new WC_Admin_Duplicate_Product();
//$cached_products = $this->storage->get_val('woobe_cached_products');
foreach ($_REQUEST['products_ids'] as $product_id) {
$product_id = intval($product_id); //sanitizing
$product = $this->products->get_product($product_id);
//when duplication do some copies of the same product - just idea
/*
if (isset($cached_products[$product_id])) {
$product = $cached_products[$product_id];
} else {
$product = $this->products->get_product($product_id);
$cached_products[$product_id] = $product;
$this->storage->set_val('woobe_cached_products', $cached_products);
}
*/
//duplication of variation is locked
if ($product->get_type() === 'variation') {
continue;
}
$duplicate = $duplicator->product_duplicate($product);
$duplicate->set_slug($duplicate->get_title()/* . '-'.$duplicate->get_id() */);
$this->clone_custom_taxonomies($product_id, $duplicate->get_id());
//delete rating
//delete_post_meta($duplicate->get_id(), "_wc_average_rating");
$duplicate->save();
do_action('woocommerce_product_duplicate', $duplicate, $product);
//clean_post_cache($d->get_id());
}
//wp_cache_flush();
}
die('done');
}
//ajax
public function woobe_delete_products() {
if (!current_user_can('manage_woocommerce')) {
die('0');
}
if (!isset($_REQUEST['woobe_nonce']) || !wp_verify_nonce($_REQUEST['woobe_nonce'], 'woobe_tools_panel_nonce')) {
die('0');
}
if (!empty($_REQUEST['products_ids']) AND is_array($_REQUEST['products_ids'])) {
foreach ($_REQUEST['products_ids'] as $product_id) {
$product_id = intval($product_id);
$product = $this->products->get_product(intval($product_id));
$product->delete(false);
}
//wp_cache_flush(); - hint for possible compatibility
}
die('done');
}
public function wrap_field_val($post, $field_key, $product_type) {
$res = NULL;
$product = $this->products->get_product($post['ID']);
$product_id = $product->get_id();
if (isset($this->settings->active_fields[$field_key]['allow_product_types'])) {
try {
if (!in_array($product_type, $this->settings->active_fields[$field_key]['allow_product_types'])) {
return WOOBE_HELPER::draw_restricked();
}
} catch (Exception $e) {
//***
}
}
if (isset($this->settings->active_fields[$field_key]['prohibit_product_types'])) {
try {
if (in_array($product_type, $this->settings->active_fields[$field_key]['prohibit_product_types'])) {
$additional_info = "";
if ($this->settings->active_fields[$field_key]['field_type'] == 'attribute' && $post['post_type'] === 'product_variation') {
$attr_name = $product->get_attribute($field_key);
if ($attr_name) {
$additional_info = '<i class="woobe_variation_attr_info" >[' . $attr_name . ']</i>';
}
}
return WOOBE_HELPER::draw_restricked() . $additional_info;
}
} catch (Exception $e) {
//***
}
}
//***
$val = '';
switch ($this->settings->active_fields[$field_key]['field_type']) {
case 'meta':
case 'prop':
case 'attribute':
$val = $this->products->get_post_field($product_id, $field_key);
break;
case 'taxonomy':
$terms = $this->products->get_post_field($product_id, $field_key);
$ids = array();
$titles = array();
//***
if (!empty($terms)) {
foreach ($terms as $t) {
$ids[] = $t->term_id;
$titles[] = $t->name;
}
}
if (!empty($ids)) {
$ids = array_map(function ($v) {
return intval($v);
}, $ids);
}
//***
if ($this->settings->active_fields[$field_key]['type'] === 'array') {
$val = array(
'terms_ids' => $ids,
'terms_titles' => $titles
);
//for drop-down view
if ($this->settings->active_fields[$field_key]['edit_view'] == 'select') {
$val['selected'] = $val['terms_ids'];
}
} else {
//string, for example: product_type
$val = $titles[0];
}
if ($field_key == 'product_type') {
$val = $product->get_type();
//$val = $this->products->get_product_type($post['ID']);
}
break;
default:
if (isset($post[$field_key])) {
$val = $post[$field_key];
//for variations
if ($field_key === 'post_title' AND $post['post_type'] === 'product_variation') {
if ($this->settings->add_vars_to_var_title) {
$val = $this->products->generate_product_title($product);
}
}
}
if ($field_key == 'post_content' && $post['post_type'] === 'product_variation') {
$val = $this->products->get_post_field($product_id, $field_key, $post['post_parent']);
}
break;
}
//***
switch ($this->settings->active_fields[$field_key]['edit_view']) {
case 'select':
$select_options = $this->settings->active_fields[$field_key]['select_options'];
//fix for product variations statuses
if ($field_key === 'post_status') {
if ($product->is_type('variation')) {
unset($select_options['draft']);
unset($select_options['pending']);
}
}
//***
$res = WOOBE_HELPER::draw_select(array(
'field' => $field_key,
'product_id' => $product_id,
'class' => 'woobe_data_select ',
'options' => $select_options,
'selected' => (isset($val['selected']) ? $val['selected'] : $val),
'onchange' => 'woobe_act_select(this)',
));
break;
case 'multi_select':
$res = WOOBE_HELPER::render_html(WOOBE_PATH . 'views/elements/multi_select.php', array(
'field_key' => $field_key,
'product_id' => $product_id,
'val' => $val,
'active_fields' => $this->settings->active_fields,
'post' => $post,
));
break;
case 'attr_visibility':
$attributes = $this->products->get_attributes($product_id);
$res = WOOBE_HELPER::render_html(WOOBE_PATH . 'views/elements/attribute_visibility.php', array(
'field_key' => $field_key,
'attributes' => $attributes,
'product_id' => $product_id,
'post' => $post,
));
break;
case 'popup':
$res = WOOBE_HELPER::draw_taxonomy_popup_btn($val, $field_key, $post);
break;
case 'popupeditor':
$res = WOOBE_HELPER::draw_popup_editor_btn($val, $field_key, $post);
break;
case 'downloads_popup_editor':
$res = WOOBE_HELPER::draw_downloads_popup_editor_btn($field_key, $product_id);
break;
case 'gallery_popup_editor':
$res = WOOBE_HELPER::draw_gallery_popup_editor_btn($field_key, $product_id);
break;
case 'upsells_popup_editor':
$res = WOOBE_HELPER::draw_upsells_popup_editor_btn($field_key, $product_id);
break;
case 'cross_sells_popup_editor':
$res = WOOBE_HELPER::draw_cross_sells_popup_editor_btn($field_key, $product_id);
break;
case 'grouped_popup_editor':
$res = WOOBE_HELPER::draw_grouped_popup_editor_btn($field_key, $product_id);
break;
case 'meta_popup_editor':
$res = WOOBE_HELPER::draw_meta_popup_editor_btn($field_key, $product_id);
break;
case 'thumbnail':
$thumbnail = wp_get_attachment_image_src($val, 'thumbnail');
$full = wp_get_attachment_image_src($val, 'full');
if (!empty($thumbnail)) {
$thumbnail = $thumbnail[0];
$full = $full[0];
} else {
$thumbnail = WOOBE_ASSETS_LINK . 'images/not-found.jpg';
$full = WOOBE_ASSETS_LINK . 'images/not-found.jpg';
}
$onmouseover = '';
if ($this->settings->show_thumbnail_preview) {
$onmouseover = 'onmouseover="woobe_init_image_preview(this)"';
}
$res = '<a href="' . $full . '" onclick="return woobe_act_thumbnail(this)" ' . $onmouseover . ' title="' . $post['post_title'] . '"><img src="' . $thumbnail . '" class="attachment-thumbnail size-thumbnail" alt="" /></a>';
break;
case 'switcher':
$labels = array_values($this->settings->active_fields[$field_key]['select_options']);
$values = array_keys($this->settings->active_fields[$field_key]['select_options']);
if ($val) {//do switcher
$val = WOOBE_HELPER::over_switcher_val_to_swicher($val, $field_key);
}
$res = WOOBE_HELPER::draw_advanced_switcher(($val == $values[0] ? TRUE : FALSE), $product_id . '_' . $field_key, $field_key, array('true' => $labels[0], 'false' => $labels[1]), array('true' => $values[0], 'false' => $values[1]), 'yes');
break;
case 'calendar':
if ($this->settings->active_fields[$field_key]['type'] === 'timestamp') {
if ($val) {
$val = strtotime($val);
} else {
$val = false;
}
}
$time = true;
if (in_array($field_key, array('date_on_sale_from', 'date_on_sale_to'))) {
$time = false;
if ($val) {
$val = $val + get_option('gmt_offset') * 3600;
}
}
$post_title = $post['post_title'];
if ($post['post_type'] === 'product_variation') {
if ($this->settings->add_vars_to_var_title) {
$post_title = $this->products->generate_product_title($this->products->get_product($product_id));
}
}
$res = WOOBE_HELPER::draw_calendar($product_id, $post_title . ' (' . $this->settings->active_fields[$field_key]['title'] . ')', $field_key, $val, "", false, $time);
break;
case 'checkbox':
//using for products selection
$res = WOOBE_HELPER::draw_checkbox(array(
'class' => 'woobe_product_check',
'data-product-id' => $product_id
));
break;
default:
//textinput
$sanitize = '';
if (isset($this->settings->active_fields[$field_key]['sanitize'])) {
$sanitize = $this->settings->active_fields[$field_key]['sanitize'];
}
$res = $this->products->sanitize_answer_value($field_key, $sanitize, $val);
break;
}
//***
//lets show product ID as LINK to the product
if ($field_key === 'ID') {
$class = 'woobe-id-permalink';
$title = '';
if ($product->get_type() === 'variable') {
$class .= ' woobe-id-permalink-var';
$title = esc_html__('see the product on the site OR select products variations if they are shown', 'woo-bulk-editor');
}
$res = '<a href="' . get_permalink($res) . '" class="' . $class . '" title="' . $title . '" target="_blank">' . $res . '</a>';
}
//***
/* for tests
$woobe_operation_time = get_option('woobe_operation_time', 0);
if (!$woobe_operation_time) {
update_option('woobe_operation_time', time());
}
*/
//***
return apply_filters('woobe_wrap_field_val', $res, $post, $field_key, $product_type);
}
//ajax
public function woobe_delete_tax_term() {
$term_id = (int) $_REQUEST['term_id'];
$taxonomy = sanitize_text_field(trim($_REQUEST['tax_key']));
if (!taxonomy_exists($taxonomy)) {
die('Wrong taxonomy name.');
}
$result = wp_delete_term($term_id, $taxonomy);
// check the result
if (is_wp_error($result)) {
die('error wp_update_term');
} else {
echo json_encode(WOOBE_HELPER::get_taxonomies_terms_hierarchy($taxonomy));
}
exit;
}
public function woobe_update_tax_term() {
$term_id = (int) $_REQUEST['term_id'];
$title = sanitize_textarea_field($_REQUEST['title']);
$slug = sanitize_textarea_field($_REQUEST['slug']);
$description = sanitize_textarea_field($_REQUEST['description']);
$parent = (int) $_REQUEST['parent'];
$taxonomy = sanitize_text_field(trim($_REQUEST['tax_key']));
if (!taxonomy_exists($taxonomy)) {
die('Wrong taxonomy name.');
}
$result = wp_update_term($term_id, $taxonomy, [
'name' => $title,
'slug' => $slug,
'description' => $description,
'parent' => $parent
]);
// check the result
if (is_wp_error($result)) {
die('error wp_update_term');
} else {
echo json_encode(WOOBE_HELPER::get_taxonomies_terms_hierarchy($taxonomy));
}
exit;
}
public function woobe_create_new_term() {
if (!isset($_REQUEST['mainform_nonce']) || !wp_verify_nonce($_REQUEST['mainform_nonce'], 'woobe_mainform_nonce')) {
die('0');
}
if (!current_user_can('manage_woocommerce')) {
die('0');
}
$titles = wc_clean($_REQUEST['titles']); //sanitized in cycle
$slugs = wc_clean($_REQUEST['slugs']); //sanitized in cycle
$description = sanitize_textarea_field($_REQUEST['description']);
$taxonomy = sanitize_text_field(trim($_REQUEST['tax_key']));
if (!taxonomy_exists($taxonomy)) {
die('Wrong taxonomy name.');
}
//***
if (!empty($titles)) {
if (substr_count($titles, '|') > 0) {
$titles = explode('|', $titles);
} else {
$titles = array($titles);
}
if (substr_count($slugs, '|') > 0) {
$slugs = explode('|', $slugs);
} else {
$slugs = array($slugs);
}
//***
$terms_ids = array();
foreach ($titles as $k => $t) {
$t = sanitize_text_field(trim($t));
$sl = sanitize_title_with_dashes(trim($slugs[$k]));
if (!term_exists($t, $taxonomy)) {
if (!empty($t)) {
$res = wp_insert_term($t, $taxonomy, array(
'parent' => intval($_REQUEST['parent']),
'slug' => (boolval($sl) ? $sl : ''),
'description' => $description,
));
$terms_ids[] = $res['term_id'];
} else {
unset($titles[$k]);
}
}
}
//***
echo wp_json_encode(array(
'titles' => array_reverse($titles),
'terms_ids' => array_reverse($terms_ids),
'terms' => WOOBE_HELPER::get_taxonomies_terms_hierarchy($taxonomy)
));
}
exit;
}
public function clone_custom_taxonomies($origin, $clone) {
$taxonomy_objects = get_object_taxonomies('product', 'objects');
$taxonomies = array();
$exclude_tax = array('product_type', 'product_visibility', 'product_shipping_class', 'product_cat', 'product_tag', 'language', 'post_translations');
foreach ($taxonomy_objects as $key => $taxonomy) {
if (in_array($key, $exclude_tax)) {
continue;
}
if (taxonomy_is_product_attribute($key)) {
continue;
}
$terms = get_the_terms($origin, $key);
if ($terms AND is_array($terms)) {
$taxonomies = $taxonomies + $terms;
}
}
foreach ($taxonomies as $term) {
wp_set_post_terms($clone, $term->term_id, $term->taxonomy, true);
}
}
//do not init functionality on all site pages as it not nessesary
private function is_should_init() {
//do not onit it exept of one woobe page and its ajax requests
$init = (isset($_GET['page']) AND $_GET['page'] === 'woobe');
if (defined('DOING_AJAX')) {
if (isset($_REQUEST['action']) && strpos($_REQUEST['action'], 'woobe_') !== FALSE) {
$init = true;
}
}
return $init;
}
public function add_statuses($statuses) {
return $statuses + [
'future' => esc_html__('Scheduled', 'woo-bulk-editor')
];
}
public function ask_favour() {
if (intval(get_option('woobe_manage_rate_alert', 0)) === -2) {
//old rate system mark for already set review users
return;
}
$slug = strtolower(get_class($this));
add_action("wp_ajax_{$slug}_dismiss_rate_alert", function () use ($slug) {
update_option("{$slug}_dismiss_rate_alert", 2);
});
add_action("wp_ajax_{$slug}_later_rate_alert", function () use ($slug) {
update_option("{$slug}_later_rate_alert", time() + 4 * 7 * 24 * 60 * 60); //4 weeks
});
//+++
add_action('admin_notices', function () use ($slug) {
if (!current_user_can('manage_options')) {
return; //show to admin only
}
if (intval(get_option("{$slug}_dismiss_rate_alert", 0)) === 2) {
return;
}
if (intval(get_option("{$slug}_later_rate_alert", 0)) === 0) {
update_option("{$slug}_later_rate_alert", time() + 3 * 24 * 60 * 60); //3 days after install
return;
}
if (intval(get_option("{$slug}_later_rate_alert", 0)) > time()) {
return;
}
$link = 'https://codecanyon.net/downloads#item-21779835';
$on = 'CodeCanyon';
if ($this->show_notes) {
$link = 'https://wordpress.org/support/plugin/woo-bulk-editor/reviews/?filter=5#new-post';
$on = 'WordPress';
}
?>
<div class="notice notice-info" id="pn_<?php echo $slug ?>_ask_favour" style="position: relative;">
<button onclick="javascript: pn_<?php echo $slug ?>_dismiss_review(1);
void(0);" title="<?php esc_html_e('Later', 'woo-bulk-editor'); ?>" class="notice-dismiss"></button>
<div id="pn_<?php echo $slug ?>_review_suggestion">
<p><?php esc_html_e('Hi! Are you enjoying using BEAR - WooCommerce Bulk Editor and Products Manager Professional?', 'woo-bulk-editor'); ?></p>
<p><a href="javascript: pn_<?php echo $slug ?>_set_review(1); void(0);"><?php esc_html_e('Yes, I love it', 'woo-bulk-editor'); ?></a> 🙂 | <a href="javascript: pn_<?php echo $slug ?>_set_review(0); void(0);"><?php esc_html_e('Not really...', 'woo-bulk-editor'); ?></a></p>
</div>
<div id="pn_<?php echo $slug ?>_review_yes" style="display: none;">
<p><?php printf(esc_html__('That\'s awesome! Could you please do us a BIG favor and give it a 5-star rating on %s to help us spread the word and boost our motivation?', 'woo-bulk-editor'), $on) ?></p>
<p style="font-weight: bold;">~ PluginUs.NET developers team</p>
<p>
<a href="<?php echo $link ?>" style="display: inline-block; margin-right: 10px;" onclick="pn_<?php echo $slug ?>_dismiss_review(2)" target="_blank"><?php esc_html_e('Okay, you deserve it', 'woo-bulk-editor'); ?></a>
<a href="javascript: pn_<?php echo $slug ?>_dismiss_review(1); void(0);" style="display: inline-block; margin-right: 10px;"><?php esc_html_e('Nope, maybe later', 'woo-bulk-editor'); ?></a>
<a href="javascript: pn_<?php echo $slug ?>_dismiss_review(2); void(0);"><?php esc_html_e('I already did', 'woo-bulk-editor'); ?></a>
</p>
</div>
<div id="pn_<?php echo $slug ?>_review_no" style="display: none;">
<p><?php esc_html_e('We are sorry to hear you aren\'t enjoying BEAR. We would love a chance to improve it. Could you take a minute and let us know what we can do better?', 'woo-bulk-editor'); ?></p>
<p>
<a href="https://pluginus.net/contact-us/" onclick="pn_<?php echo $slug ?>_dismiss_review(2)" target="_blank"><?php esc_html_e('Give Feedback', 'woo-bulk-editor'); ?></a>
| <a href="javascript: pn_<?php echo $slug ?>_dismiss_review(2); void(0);"><?php esc_html_e('No thanks', 'woo-bulk-editor'); ?></a>
</p>
</div>
<script>
function pn_<?php echo $slug ?>_set_review(yes) {
document.getElementById('pn_<?php echo $slug ?>_review_suggestion').style.display = 'none';
if (yes) {
document.getElementById('pn_<?php echo $slug ?>_review_yes').style.display = 'block';
} else {
document.getElementById('pn_<?php echo $slug ?>_review_no').style.display = 'block';
}
}
function pn_<?php echo $slug ?>_dismiss_review(what = 1) {
//1 maybe later, 2 do not ask more
jQuery('#pn_<?php echo $slug ?>_ask_favour').fadeOut();
if (what === 1) {
jQuery.post(ajaxurl, {
action: '<?php echo $slug ?>_later_rate_alert'
});
} else {
jQuery.post(ajaxurl, {
action: '<?php echo $slug ?>_dismiss_rate_alert'
});
}
return true;
}
</script>
</div>
<?php
});
}
}
//***
$WOOBE = new WOOBE();
$GLOBALS['WOOBE'] = $WOOBE;
add_action('init', array($WOOBE, 'init'), 9999);