🏨 Hotel Booking Enhancements: - Implemented Eagle Booking Advanced Pricing add-on - Added Booking.com-style rate management system - Created professional calendar interface for pricing - Integrated deals and discounts functionality 💰 Advanced Pricing Features: - Dynamic pricing models (per room, per person, per adult) - Base rates, adult rates, and child rates management - Length of stay discounts and early bird deals - Mobile rates and secret deals implementation - Seasonal promotions and flash sales 📅 Availability Management: - Real-time availability tracking - Stop sell and restriction controls - Closed to arrival/departure functionality - Minimum/maximum stay requirements - Automatic sold-out management 💳 Payment Integration: - Maintained Redsys payment gateway integration - Seamless integration with existing Eagle Booking - No modifications to core Eagle Booking plugin 🛠️ Technical Implementation: - Custom database tables for advanced pricing - WordPress hooks and filters integration - AJAX-powered admin interface - Data migration from existing Eagle Booking - Professional calendar view for revenue management 📊 Admin Interface: - Booking.com-style management dashboard - Visual rate and availability calendar - Bulk operations for date ranges - Statistics and analytics dashboard - Modal dialogs for quick editing 🔧 Code Quality: - WordPress coding standards compliance - Secure database operations with prepared statements - Proper input validation and sanitization - Error handling and logging - Responsive admin interface 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
738 lines
20 KiB
PHP
738 lines
20 KiB
PHP
<?php
|
|
/**
|
|
* Redux Primary Enqueue Class
|
|
*
|
|
* @class Redux_Core
|
|
* @version 4.0.0
|
|
* @package Redux Framework/Classes
|
|
* @noinspection PhpIgnoredClassAliasDeclaration
|
|
*/
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
if ( ! class_exists( 'Redux_Enqueue', false ) ) {
|
|
|
|
/**
|
|
* Class Redux_Enqueue
|
|
*/
|
|
class Redux_Enqueue extends Redux_Class {
|
|
|
|
/**
|
|
* Data to localize.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $localize_data = array();
|
|
|
|
/**
|
|
* Min string for .min files.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $min = '';
|
|
|
|
/**
|
|
* Timestamp for file versions.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $timestamp = '';
|
|
|
|
/**
|
|
* Localize data required for the repeater extension.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $repeater_data = array();
|
|
|
|
/**
|
|
* Redux_Enqueue constructor.
|
|
*
|
|
* @param object $redux ReduxFramework pointer.
|
|
*/
|
|
public function __construct( $redux ) {
|
|
parent::__construct( $redux );
|
|
|
|
// Enqueue the admin page CSS and JS.
|
|
if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
|
|
add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 );
|
|
}
|
|
|
|
add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 );
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this );
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
do_action( 'redux/enqueue/construct', $this );
|
|
}
|
|
|
|
/**
|
|
* Scripts to enqueue on the frontend
|
|
*/
|
|
public function frontend_init() {
|
|
$core = $this->core();
|
|
|
|
if ( $core->args['elusive_frontend'] ) {
|
|
Redux_Functions_Ex::enqueue_elusive_font();
|
|
}
|
|
|
|
if ( $core->args['fontawesome_frontend'] ) {
|
|
Redux_Functions_Ex::enqueue_font_awesome();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Class init functions.
|
|
*/
|
|
public function init() {
|
|
$core = $this->core();
|
|
|
|
Redux_Functions::$parent = $core;
|
|
Redux_CDN::$parent = $core;
|
|
|
|
$this->min = Redux_Functions::is_min();
|
|
|
|
$this->timestamp = Redux_Core::$version;
|
|
if ( $core->args['dev_mode'] ) {
|
|
$this->timestamp .= '.' . time();
|
|
}
|
|
|
|
$this->register_styles( $core );
|
|
$this->register_scripts();
|
|
|
|
add_thickbox();
|
|
|
|
$this->enqueue_fields( $core );
|
|
|
|
add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) );
|
|
|
|
$this->set_localized_data( $core );
|
|
|
|
/**
|
|
* Action 'redux/page/{opt_name}/enqueue'
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
do_action( "redux/page/{$core->args['opt_name']}/enqueue" );
|
|
}
|
|
|
|
/**
|
|
* Register all core framework styles.
|
|
*
|
|
* @param object $core ReduxFramework object.
|
|
*/
|
|
private function register_styles( $core ) {
|
|
|
|
/**
|
|
* Redux Admin CSS
|
|
*/
|
|
if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit
|
|
$color_scheme = get_user_option( 'admin_color' );
|
|
} elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) {
|
|
$color_scheme = 'classic';
|
|
} else {
|
|
$color_scheme = $core->args['admin_theme'];
|
|
}
|
|
|
|
if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) {
|
|
$color_scheme = 'fresh';
|
|
}
|
|
|
|
$css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css";
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css );
|
|
|
|
wp_register_style(
|
|
'redux-admin-theme',
|
|
$css,
|
|
array(),
|
|
$this->timestamp
|
|
);
|
|
|
|
wp_enqueue_style(
|
|
'redux-admin-css',
|
|
Redux_Core::$url . "assets/css/redux-admin$this->min.css",
|
|
array( 'redux-admin-theme' ),
|
|
$this->timestamp
|
|
);
|
|
|
|
/**
|
|
* Redux Fields CSS
|
|
*/
|
|
if ( ! $core->args['dev_mode'] ) {
|
|
wp_enqueue_style(
|
|
'redux-fields',
|
|
Redux_Core::$url . 'assets/css/redux-fields.min.css',
|
|
array(),
|
|
$this->timestamp
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Select2 CSS
|
|
*/
|
|
wp_enqueue_style(
|
|
'select2-css',
|
|
Redux_Core::$url . 'assets/css/vendor/select2.min.css',
|
|
array(),
|
|
'4.1.0'
|
|
);
|
|
|
|
/**
|
|
* Spectrum CSS
|
|
*/
|
|
wp_register_style(
|
|
'redux-spectrum-css',
|
|
Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css",
|
|
array(),
|
|
'1.3.3'
|
|
);
|
|
|
|
/**
|
|
* Elusive Icon CSS
|
|
*/
|
|
Redux_Functions_Ex::enqueue_elusive_font();
|
|
|
|
/**
|
|
* Font Awesome for Social Profiles and Icon Select
|
|
*/
|
|
Redux_Functions_Ex::enqueue_font_awesome();
|
|
|
|
/**
|
|
* QTip CSS
|
|
*/
|
|
wp_enqueue_style(
|
|
'qtip',
|
|
Redux_Core::$url . "assets/css/vendor/qtip$this->min.css",
|
|
array(),
|
|
'3.0.3'
|
|
);
|
|
|
|
/**
|
|
* JQuery UI CSS
|
|
*/
|
|
wp_enqueue_style(
|
|
'jquery-ui',
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css",
|
|
Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css'
|
|
),
|
|
array(),
|
|
$this->timestamp
|
|
);
|
|
|
|
/**
|
|
* Iris CSS
|
|
*/
|
|
wp_enqueue_style( 'wp-color-picker' );
|
|
|
|
if ( $core->args['dev_mode'] ) {
|
|
|
|
/**
|
|
* Media CSS
|
|
*/
|
|
wp_enqueue_style(
|
|
'redux-field-media',
|
|
Redux_Core::$url . 'assets/css/media.css',
|
|
array(),
|
|
$this->timestamp
|
|
);
|
|
}
|
|
|
|
/**
|
|
* RTL CSS
|
|
*/
|
|
if ( is_rtl() ) {
|
|
wp_enqueue_style(
|
|
'redux-rtl',
|
|
Redux_Core::$url . 'assets/css/rtl.css',
|
|
array(),
|
|
$this->timestamp
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register all core framework scripts.
|
|
*/
|
|
private function register_scripts() {
|
|
// *****************************************************************
|
|
// JQuery / JQuery UI JS
|
|
// *****************************************************************
|
|
wp_enqueue_script( 'jquery' );
|
|
wp_enqueue_script( 'jquery-ui-core' );
|
|
wp_enqueue_script( 'jquery-ui-dialog' );
|
|
|
|
/**
|
|
* Select2 Sortable JS
|
|
*/
|
|
wp_register_script(
|
|
'redux-select2-sortable',
|
|
Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js',
|
|
array( 'jquery', 'jquery-ui-sortable' ),
|
|
$this->timestamp,
|
|
true
|
|
);
|
|
|
|
/**
|
|
* Select2
|
|
*/
|
|
wp_enqueue_script(
|
|
'select2-js',
|
|
Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`',
|
|
array( 'jquery', 'redux-select2-sortable' ),
|
|
'4.1.0',
|
|
true
|
|
);
|
|
|
|
/**
|
|
* QTip JS
|
|
*/
|
|
wp_enqueue_script(
|
|
'qtip',
|
|
Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js',
|
|
array( 'jquery' ),
|
|
'3.0.3',
|
|
true
|
|
);
|
|
|
|
/**
|
|
* Iris alpha color picker
|
|
*/
|
|
if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) {
|
|
wp_enqueue_style( 'wp-color-picker' );
|
|
|
|
wp_register_script(
|
|
'redux-wp-color-picker-alpha',
|
|
Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js',
|
|
array( 'jquery', 'wp-color-picker' ),
|
|
'3.0.0',
|
|
true
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Block UI (used by Custom Fonts and Color Schemes).
|
|
*/
|
|
wp_register_script(
|
|
'redux-block-ui',
|
|
Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js',
|
|
array( 'jquery' ),
|
|
'2.70.0',
|
|
true
|
|
);
|
|
|
|
/**
|
|
* Spectrum JS
|
|
*/
|
|
wp_register_script(
|
|
'redux-spectrum-js',
|
|
Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js',
|
|
array( 'jquery' ),
|
|
'1.3.3',
|
|
true
|
|
);
|
|
|
|
/**
|
|
* Vendor JS
|
|
*/
|
|
wp_register_script(
|
|
'redux-vendor',
|
|
Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js',
|
|
array( 'jquery' ),
|
|
$this->timestamp,
|
|
true
|
|
);
|
|
|
|
/**
|
|
* Redux JS
|
|
*/
|
|
wp_register_script(
|
|
'redux-js',
|
|
Redux_Core::$url . 'assets/js/redux' . $this->min . '.js',
|
|
array( 'jquery', 'redux-vendor' ),
|
|
$this->timestamp,
|
|
true
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Enqueue fields that are in use.
|
|
*
|
|
* @param object $core ReduxFramework object.
|
|
* @param array $field Field array.
|
|
*/
|
|
public function enqueue_field( $core, array $field ) {
|
|
if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) {
|
|
$field_type = str_replace( '_', '-', $field['type'] );
|
|
$core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php";
|
|
|
|
// Shim for v3 extension class names.
|
|
if ( ! file_exists( $core_path ) ) {
|
|
$core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php";
|
|
}
|
|
|
|
$filter_path = $core_path;
|
|
|
|
/**
|
|
* Field class file
|
|
* filter 'redux/{opt_name}/field/class/{field.type}
|
|
*
|
|
* @param string $filter_path Field class file path
|
|
* @param array $field Field config data
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$class_file = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/field/class/{$field['type']}",
|
|
$filter_path,
|
|
$field
|
|
);
|
|
|
|
$field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] );
|
|
|
|
if ( $class_file ) {
|
|
$field_class = Redux_Functions::class_exists_ex( $field_classes );
|
|
if ( false === $field_class ) {
|
|
if ( file_exists( $class_file ) ) {
|
|
require_once $class_file;
|
|
|
|
$field_class = Redux_Functions::class_exists_ex( $field_classes );
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) {
|
|
if ( ! isset( $core->options[ $field['id'] ] ) ) {
|
|
$core->options[ $field['id'] ] = '';
|
|
}
|
|
|
|
$the_field = new $field_class( $field, $core->options[ $field['id'] ], $core );
|
|
|
|
// Move dev_mode check to a new if/then block.
|
|
if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) {
|
|
$the_field->enqueue();
|
|
}
|
|
|
|
if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) {
|
|
$the_field->always_enqueue();
|
|
}
|
|
|
|
if ( method_exists( $field_class, 'localize' ) ) {
|
|
$the_field->localize( $field );
|
|
|
|
if ( ! isset( $this->localize_data[ $field['type'] ] ) ) {
|
|
$this->localize_data[ $field['type'] ] = array();
|
|
}
|
|
|
|
$localize_data = $the_field->localize( $field );
|
|
|
|
$shims = array( 'repeater' );
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims );
|
|
|
|
if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) {
|
|
$this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data;
|
|
}
|
|
|
|
$this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data;
|
|
}
|
|
|
|
unset( $the_field );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enqueue field files.
|
|
*
|
|
* @param object $core ReduxFramework object.
|
|
*/
|
|
private function enqueue_fields( $core ) {
|
|
foreach ( $core->sections as $section ) {
|
|
if ( isset( $section['fields'] ) ) {
|
|
foreach ( $section['fields'] as $field ) {
|
|
$this->enqueue_field( $core, $field );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Build a localized array from field functions, if any.
|
|
*
|
|
* @param object $core ReduxFramework object.
|
|
* @param string $type Field type.
|
|
*/
|
|
private function build_local_array( $core, string $type ) {
|
|
if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) {
|
|
$the_total = 0;
|
|
$messages = array();
|
|
|
|
foreach ( $core->transients['notices'][ $type ] as $msg ) {
|
|
if ( is_array( $msg ) && ! empty( $msg ) ) {
|
|
$messages[ $msg['section_id'] ][ $type ][] = $msg;
|
|
|
|
if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) {
|
|
$messages[ $msg['section_id'] ]['total'] = 0;
|
|
}
|
|
|
|
++$messages[ $msg['section_id'] ]['total'];
|
|
++$the_total;
|
|
}
|
|
}
|
|
|
|
$this->localize_data[ $type ] = array(
|
|
'total' => $the_total,
|
|
"$type" => $messages,
|
|
);
|
|
|
|
unset( $core->transients['notices'][ $type ] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Compile panel errors and wearings for a localized array.
|
|
*/
|
|
public function get_warnings_and_errors_array() {
|
|
$core = $this->core();
|
|
|
|
$this->build_local_array( $core, 'errors' );
|
|
$this->build_local_array( $core, 'warnings' );
|
|
$this->build_local_array( $core, 'sanitize' );
|
|
|
|
if ( empty( $core->transients['notices'] ) ) {
|
|
if ( isset( $core->transients['notices'] ) ) {
|
|
unset( $core->transients['notices'] );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Commit localized data to global array.
|
|
*
|
|
* @param object $core ReduxFramework object.
|
|
*/
|
|
private function set_localized_data( $core ) {
|
|
if ( ! empty( $core->args['last_tab'] ) ) {
|
|
$this->localize_data['last_tab'] = $core->args['last_tab'];
|
|
}
|
|
|
|
$this->localize_data['font_weights'] = $this->args['font_weights'];
|
|
|
|
$this->localize_data['required'] = $core->required;
|
|
$this->repeater_data['fonts'] = $core->fonts;
|
|
|
|
if ( ! isset( $this->repeater_data['opt_names'] ) ) {
|
|
$this->repeater_data['opt_names'] = array();
|
|
}
|
|
|
|
$this->repeater_data['opt_names'][] = $core->args['opt_name'];
|
|
$this->repeater_data['folds'] = array();
|
|
$this->localize_data['required_child'] = $core->required_child;
|
|
$this->localize_data['fields'] = $core->fields;
|
|
|
|
if ( isset( $core->font_groups['google'] ) ) {
|
|
$this->repeater_data['googlefonts'] = $core->font_groups['google'];
|
|
}
|
|
|
|
if ( isset( $core->font_groups['std'] ) ) {
|
|
$this->repeater_data['stdfonts'] = $core->font_groups['std'];
|
|
}
|
|
|
|
if ( isset( $core->font_groups['customfonts'] ) ) {
|
|
$this->repeater_data['customfonts'] = $core->font_groups['customfonts'];
|
|
}
|
|
|
|
if ( isset( $core->font_groups['typekitfonts'] ) ) {
|
|
$this->repeater_data['typekitfonts'] = $core->font_groups['typekitfonts'];
|
|
}
|
|
|
|
$this->localize_data['folds'] = $core->folds;
|
|
|
|
// Make sure the children are all hidden properly.
|
|
foreach ( $core->fields as $key => $value ) {
|
|
if ( in_array( $key, $core->fields_hidden, true ) ) {
|
|
foreach ( $value as $k => $v ) {
|
|
if ( ! in_array( $k, $core->fields_hidden, true ) ) {
|
|
$core->fields_hidden[] = $k;
|
|
$core->folds[ $k ] = 'hide';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->localize_data['fields_hidden'] = $core->fields_hidden;
|
|
$this->localize_data['options'] = $core->options;
|
|
$this->localize_data['defaults'] = $core->options_defaults;
|
|
|
|
/**
|
|
* Save pending string
|
|
* filter 'redux/{opt_name}/localize/save_pending
|
|
*
|
|
* @param string $msg Save_pending string
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$save_pending = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/localize/save_pending",
|
|
esc_html__(
|
|
'You have changes that are not saved. Would you like to save them now?',
|
|
'redux-framework'
|
|
)
|
|
);
|
|
|
|
/**
|
|
* Reset all string
|
|
* filter 'redux/{opt_name}/localize/reset
|
|
*
|
|
* @param string $msg Reset all string.
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$reset_all = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/localize/reset",
|
|
esc_html__(
|
|
'Are you sure? Resetting will lose all custom values.',
|
|
'redux-framework'
|
|
)
|
|
);
|
|
|
|
/**
|
|
* Reset section string
|
|
* filter 'redux/{opt_name}/localize/reset_section
|
|
*
|
|
* @param string $msg Reset section string.
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$reset_section = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/localize/reset_section",
|
|
esc_html__(
|
|
'Are you sure? Resetting will lose all custom values in this section.',
|
|
'redux-framework'
|
|
)
|
|
);
|
|
|
|
/**
|
|
* Preset confirm string
|
|
* filter 'redux/{opt_name}/localize/preset
|
|
*
|
|
* @param string $msg Preset confirm string.
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$preset_confirm = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/localize/preset",
|
|
esc_html__(
|
|
'Your current options will be replaced with the values of this preset. Would you like to proceed?',
|
|
'redux-framework'
|
|
)
|
|
);
|
|
|
|
/**
|
|
* Import confirm string
|
|
* filter 'redux/{opt_name}/localize/import
|
|
*
|
|
* @param string $msg Import confirm string.
|
|
*/
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$import_confirm = apply_filters(
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
"redux/{$core->args['opt_name']}/localize/import",
|
|
esc_html__(
|
|
'Your current options will be replaced with the values of this import. Would you like to proceed?',
|
|
'redux-framework'
|
|
)
|
|
);
|
|
|
|
global $pagenow;
|
|
|
|
$this->localize_data['args'] = array(
|
|
'dev_mode' => $core->args['dev_mode'],
|
|
'save_pending' => $save_pending,
|
|
'reset_confirm' => $reset_all,
|
|
'reset_section_confirm' => $reset_section,
|
|
'preset_confirm' => $preset_confirm,
|
|
'import_section_confirm' => $import_confirm,
|
|
'please_wait' => esc_html__( 'Please Wait', 'redux-framework' ),
|
|
'opt_name' => $core->args['opt_name'],
|
|
'flyout_submenus' => $core->args['flyout_submenus'] ?? false,
|
|
'slug' => $core->args['page_slug'],
|
|
'hints' => $core->args['hints'],
|
|
'disable_save_warn' => $core->args['disable_save_warn'],
|
|
'class' => $core->args['class'],
|
|
'ajax_save' => $core->args['ajax_save'],
|
|
'menu_search' => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=',
|
|
);
|
|
|
|
$this->localize_data['ajax'] = array(
|
|
'console' => esc_html__(
|
|
'There was an error saving. Here is the result of your action:',
|
|
'redux-framework'
|
|
),
|
|
'alert' => esc_html__(
|
|
'There was a problem with your action. Please try again or reload the page.',
|
|
'redux-framework'
|
|
),
|
|
);
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data );
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data );
|
|
|
|
$this->get_warnings_and_errors_array();
|
|
|
|
if ( ! isset( $core->repeater_data ) ) {
|
|
$core->repeater_data = array();
|
|
}
|
|
$core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
|
|
$this->repeater_data,
|
|
$core->repeater_data
|
|
);
|
|
|
|
if ( ! isset( $core->localize_data ) ) {
|
|
$core->localize_data = array();
|
|
}
|
|
$core->localize_data = Redux_Functions_Ex::nested_wp_parse_args(
|
|
$this->localize_data,
|
|
$core->localize_data
|
|
);
|
|
|
|
// Shim for extension compatibility.
|
|
if ( Redux::$extension_compatibility ) {
|
|
$this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
|
|
$this->repeater_data,
|
|
$core->localize_data
|
|
);
|
|
}
|
|
|
|
wp_localize_script(
|
|
'redux-js',
|
|
'redux',
|
|
$this->repeater_data
|
|
);
|
|
|
|
wp_localize_script(
|
|
'redux-js',
|
|
'redux_' . str_replace( '-', '_', $core->args['opt_name'] ),
|
|
$this->localize_data
|
|
);
|
|
|
|
wp_enqueue_script( 'redux-js' ); // Enqueue the JS now.
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! class_exists( 'reduxCoreEnqueue' ) ) {
|
|
class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' );
|
|
}
|