🏨 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>
1780 lines
53 KiB
PHP
1780 lines
53 KiB
PHP
<?php // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
/**
|
|
* Redux Framework API Class
|
|
* Makes instantiating a Redux object an absolute piece of cake.
|
|
*
|
|
* @package Redux_Framework
|
|
* @author Dovy Paukstys
|
|
* @subpackage Core
|
|
* @noinspection PhpUnused
|
|
* @noinspection PhpMissingParamTypeInspection
|
|
*/
|
|
|
|
// Exit if accessed directly.
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
// Don't duplicate me!
|
|
if ( ! class_exists( 'Redux', false ) ) {
|
|
|
|
/**
|
|
* Redux API Class
|
|
* Simple API for Redux Framework
|
|
*
|
|
* @since 3.0.0
|
|
*/
|
|
class Redux {
|
|
|
|
|
|
/**
|
|
* Option fields.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $fields = array();
|
|
|
|
/**
|
|
* Option sections.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $sections = array();
|
|
|
|
/**
|
|
* Option defaults.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $options_defaults = array();
|
|
|
|
/**
|
|
* Option help array.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $help = array();
|
|
|
|
/**
|
|
* Option global args.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $args = array();
|
|
|
|
/**
|
|
* Option section priorities.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $priority = array();
|
|
|
|
/**
|
|
* Panel validations errors.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $errors = array();
|
|
|
|
/**
|
|
* Init.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $init = array();
|
|
|
|
/**
|
|
* Delay Init opt_names
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $delay_init = array();
|
|
|
|
/**
|
|
* Extension list.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $extensions = array();
|
|
|
|
/**
|
|
* Extensions in use.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $uses_extensions = array();
|
|
|
|
/**
|
|
* Extension paths.
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $extension_paths = array();
|
|
|
|
/**
|
|
* Extension capability flag.
|
|
*
|
|
* @var boolean
|
|
*/
|
|
public static $extension_compatibility = false;
|
|
|
|
/**
|
|
* Code to run at creation in instance.
|
|
*/
|
|
public static function load() {
|
|
add_action( 'after_setup_theme', array( 'Redux', 'create_redux' ) );
|
|
add_action( 'init', array( 'Redux', 'create_redux' ) );
|
|
add_action( 'switch_theme', array( 'Redux', 'create_redux' ) );
|
|
|
|
require_once Redux_Core::$dir . 'inc/extensions/metaboxes/class-redux-metaboxes-api.php';
|
|
require_once Redux_Core::$dir . 'inc/extensions/users/class-redux-users-api.php';
|
|
require_once Redux_Core::$dir . 'inc/extensions/taxonomy/class-redux-taxonomy-api.php';
|
|
}
|
|
|
|
/**
|
|
* Delay init action function
|
|
* Delays all Redux objects from loaded before `plugins_loaded` runs.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*/
|
|
public static function delay_init() {
|
|
if ( ! empty( self::$delay_init ) ) {
|
|
|
|
foreach ( self::$delay_init as $opt_name ) {
|
|
self::init( $opt_name );
|
|
$parent = Redux_Instances::get_instance( $opt_name );
|
|
// translators: This is only shown to developers, should not impact users.
|
|
$msg = sprintf(
|
|
'<strong>%s</strong><br /><code>%s</code> %s',
|
|
esc_html__( 'Warning, Premature Initialization', 'redux-framework' ),
|
|
'self::init("' . esc_html( $opt_name ) . '")',
|
|
// translators: This is only shown to developers, should not impact users.
|
|
sprintf( esc_html__( 'was run before the %s hook and was delayed to avoid errors.', 'redux-framework' ), '<code>plugins_loaded</code>' )
|
|
);
|
|
|
|
if ( isset( $parent->args ) ) {
|
|
$data = array(
|
|
'parent' => $parent,
|
|
'type' => 'error',
|
|
'msg' => $msg,
|
|
'id' => 'redux_init',
|
|
'dismiss' => true,
|
|
);
|
|
|
|
Redux_Admin_Notices::set_notice( $data );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Init Redux object
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*/
|
|
public static function init( string $opt_name = '' ) {
|
|
if ( ! empty( $opt_name ) ) {
|
|
if ( ! did_action( 'plugins_loaded' ) ) {
|
|
|
|
// We don't want to load before plugins_loaded EVER.
|
|
self::$delay_init[] = $opt_name;
|
|
add_action( 'plugins_loaded', array( 'Redux', 'delay_init' ) );
|
|
} else {
|
|
|
|
// The hook `plugins_loaded` has run, let's get going!
|
|
self::load_redux( $opt_name );
|
|
|
|
remove_action( 'setup_theme', array( 'Redux', 'create_redux' ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve ReduxFramework object.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return object|ReduxFramework
|
|
*/
|
|
public static function instance( string $opt_name ) {
|
|
return Redux_Instances::get_instance( $opt_name );
|
|
}
|
|
|
|
/**
|
|
* Retrieve all ReduxFramework Instances.
|
|
*
|
|
* @return null|array|ReduxFramework[]
|
|
*/
|
|
public static function all_instances(): ?array {
|
|
return Redux_Instances::get_all_instances();
|
|
}
|
|
|
|
/**
|
|
* Load external extensions.
|
|
*
|
|
* @param object $redux_framework ReduxFramework object.
|
|
*
|
|
* @deprecated No longer using camelCase naming conventions.
|
|
*/
|
|
public static function loadExtensions( $redux_framework ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, ' Redux 4.3', 'Redux::load_extensions( $redux_framework )' );
|
|
|
|
self::load_extensions( $redux_framework );
|
|
}
|
|
|
|
/**
|
|
* Load external extensions.
|
|
*
|
|
* @param object $redux_framework ReduxFramework object.
|
|
*/
|
|
public static function load_extensions( $redux_framework ) {
|
|
$instance_extensions = self::get_extensions( $redux_framework->args['opt_name'] );
|
|
|
|
if ( $instance_extensions ) {
|
|
foreach ( $instance_extensions as $name => $extension ) {
|
|
$old_class = str_replace( 'Redux_', 'ReduxFramework_', $extension['class'] );
|
|
|
|
if ( ! class_exists( $extension['class'] ) && ! class_exists( $old_class ) ) {
|
|
// In case you wanted to override your override, hah.
|
|
// Phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$extension['path'] = apply_filters( 'redux/extension/' . $redux_framework->args['opt_name'] . '/' . $name, $extension['path'] );
|
|
if ( file_exists( $extension['path'] ) ) {
|
|
require_once $extension['path'];
|
|
}
|
|
}
|
|
if ( isset( $extension['field'] ) ) {
|
|
require_once $extension['field'];
|
|
}
|
|
|
|
if ( ! isset( $redux_framework->extensions[ $name ] ) ) {
|
|
$field_classes = array( $extension['class'], $old_class );
|
|
$ext_class = Redux_Functions::class_exists_ex( $field_classes );
|
|
if ( false !== $ext_class ) {
|
|
$redux_framework->extensions[ $name ] = new $ext_class( $redux_framework );
|
|
// Backwards compatibility for extensions.
|
|
if ( ! is_subclass_of( $redux_framework->extensions[ $name ], 'Redux_Extension_Abstract' ) ) {
|
|
$new_class_name = $ext_class . '_extended';
|
|
self::$extension_compatibility = true;
|
|
$redux_framework->extensions[ $name ] = Redux_Functions_Ex::extension_compatibility( $redux_framework, $extension['path'], $ext_class, $new_class_name, $name );
|
|
}
|
|
} elseif ( is_admin() && true === $redux_framework->args['dev_mode'] ) {
|
|
echo '<div id="message" class="error"><p>No class named <strong>' . esc_html( $extension['class'] ) . '</strong> exists. Please verify your extension path.</p></div>';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated function to set an extension path.
|
|
*
|
|
* @param string $extension Path.
|
|
* @param bool $folder Set if a path is a folder.
|
|
*
|
|
* @return bool|mixed
|
|
* @deprecated No longer using cameCase naming conventions.
|
|
*/
|
|
public static function extensionPath( string $extension, bool $folder = true ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::extension_path( $extension, $folder )' );
|
|
|
|
return self::extension_path( $extension, $folder );
|
|
}
|
|
|
|
/**
|
|
* Sets a path to an extension.
|
|
*
|
|
* @param string $extension Path to an extension.
|
|
* @param bool $folder Set if a path is a folder.
|
|
*
|
|
* @return bool|mixed
|
|
*/
|
|
public static function extension_path( string $extension, bool $folder = true ) {
|
|
if ( ! isset( self::$extensions[ $extension ] ) ) {
|
|
return false;
|
|
}
|
|
|
|
$path = end( self::$extensions[ $extension ] );
|
|
|
|
if ( ! $folder ) {
|
|
return $path;
|
|
}
|
|
|
|
return dirname( $path );
|
|
}
|
|
|
|
/**
|
|
* Deprecated function of Load Redux Framework.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*
|
|
* @deprecated No longer using camelCase naming conventions.
|
|
*/
|
|
public static function loadRedux( string $opt_name = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::load_redux( $opt_name )' );
|
|
|
|
self::load_redux( $opt_name );
|
|
}
|
|
|
|
/**
|
|
* Load defaults values for a given opt_name.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*/
|
|
public static function set_defaults( string $opt_name = '' ) {
|
|
// Try to load the class if in the same directory, so the user only has to include the Redux API.
|
|
if ( ! class_exists( 'Redux_Options_Defaults' ) ) {
|
|
$file_check = trailingslashit( __DIR__ ) . 'class-redux-options-defaults.php';
|
|
|
|
if ( file_exists( dirname( $file_check ) ) ) {
|
|
include_once $file_check;
|
|
$file_check = trailingslashit( __DIR__ ) . 'class-redux-wordpress-data.php';
|
|
if ( file_exists( dirname( $file_check ) ) ) {
|
|
include_once $file_check;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( class_exists( 'Redux_Options_Defaults' ) && ! isset( self::$options_defaults[ $opt_name ] ) ) {
|
|
$sections = self::construct_sections( $opt_name );
|
|
$wordpress_data = ( ! class_exists( 'Redux_WordPress_Data' ) ) ? null : new Redux_WordPress_Data( $opt_name );
|
|
$options_defaults_class = new Redux_Options_Defaults();
|
|
self::$options_defaults[ $opt_name ] = $options_defaults_class->default_values( $opt_name, $sections, $wordpress_data );
|
|
if ( ! isset( self::$args[ $opt_name ]['global_variable'] ) || ( '' === self::$args[ $opt_name ]['global_variable'] && false !== self::$args[ $opt_name ]['global_variable'] ) ) {
|
|
self::$args[ $opt_name ]['global_variable'] = str_replace( '-', '_', $opt_name );
|
|
}
|
|
if ( isset( self::$args[ $opt_name ]['global_variable'] ) && self::$args[ $opt_name ]['global_variable'] ) {
|
|
$option_global = self::$args[ $opt_name ]['global_variable'];
|
|
|
|
/**
|
|
* Filter 'redux/options/{opt_name}/global_variable'
|
|
*
|
|
* @param array $value option value to set global_variable with
|
|
*/
|
|
global $$option_global;
|
|
|
|
// phpcs:ignore WordPress.NamingConventions.ValidHookName
|
|
$$option_global = apply_filters( 'redux/options/' . $opt_name . '/global_variable', self::$options_defaults[ $opt_name ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load Redux Framework.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*/
|
|
public static function load_redux( string $opt_name = '' ) {
|
|
if ( empty( $opt_name ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( class_exists( 'ReduxFramework' ) ) {
|
|
if ( isset( self::$init[ $opt_name ] ) && ! empty( self::$init[ $opt_name ] ) ) {
|
|
return;
|
|
}
|
|
} else {
|
|
echo '<div id="message" class="error"><p>' . esc_html__( 'Redux Framework is not installed. Please install it.', 'redux-framework' ) . '</p></div>';
|
|
|
|
return;
|
|
}
|
|
|
|
self::instance( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( isset( self::$init[ $opt_name ] ) && 1 === self::$init[ $opt_name ] ) {
|
|
return;
|
|
}
|
|
|
|
self::set_defaults( $opt_name );
|
|
|
|
$args = self::construct_args( $opt_name );
|
|
$sections = self::construct_sections( $opt_name );
|
|
|
|
if ( isset( self::$uses_extensions[ $opt_name ] ) && ! empty( self::$uses_extensions[ $opt_name ] ) ) {
|
|
add_action( "redux/extensions/$opt_name/before", array( 'Redux', 'load_extensions' ), 0 );
|
|
}
|
|
|
|
$redux = new ReduxFramework( $sections, $args );
|
|
self::$init[ $opt_name ] = 1;
|
|
|
|
if ( isset( $redux->args['opt_name'] ) && $redux->args['opt_name'] !== $opt_name ) {
|
|
self::$init[ $redux->args['opt_name'] ] = 1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Create Redux instance.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function createRedux() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::createRedux()' );
|
|
|
|
self::create_redux();
|
|
}
|
|
|
|
/**
|
|
* Create Redux instance.
|
|
*
|
|
* @throws ReflectionException Exception.
|
|
*/
|
|
public static function create_redux() {
|
|
foreach ( self::$sections as $opt_name => $the_sections ) {
|
|
if ( ! empty( $the_sections ) ) {
|
|
if ( ! self::$init[ $opt_name ] ) {
|
|
self::load_redux( $opt_name );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Construct global arguments.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return array|mixed
|
|
*/
|
|
public static function construct_args( string $opt_name ) {
|
|
$args = self::$args[ $opt_name ] ?? array();
|
|
$args['opt_name'] = $opt_name;
|
|
|
|
if ( ! isset( $args['menu_title'] ) ) {
|
|
$args['menu_title'] = ucfirst( $opt_name ) . ' Options';
|
|
}
|
|
|
|
if ( ! isset( $args['page_title'] ) ) {
|
|
$args['page_title'] = ucfirst( $opt_name ) . ' Options';
|
|
}
|
|
|
|
if ( ! isset( $args['page_slug'] ) ) {
|
|
$args['page_slug'] = $opt_name . '_options';
|
|
}
|
|
|
|
return $args;
|
|
}
|
|
|
|
/**
|
|
* Construct option panel sections.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function construct_sections( string $opt_name ): array {
|
|
$sections = array();
|
|
|
|
if ( ! isset( self::$sections[ $opt_name ] ) ) {
|
|
return $sections;
|
|
}
|
|
|
|
foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
|
|
$section['fields'] = self::construct_fields( $opt_name, $section_id );
|
|
$p = $section['priority'];
|
|
|
|
while ( isset( $sections[ $p ] ) ) {
|
|
++$p;
|
|
}
|
|
|
|
$sections[ $p ] = $section;
|
|
}
|
|
|
|
ksort( $sections );
|
|
|
|
return $sections;
|
|
}
|
|
|
|
/**
|
|
* Construct option panel fields.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $section_id ID of a section.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function construct_fields( string $opt_name = '', string $section_id = '' ): array {
|
|
$fields = array();
|
|
|
|
if ( ! empty( self::$fields[ $opt_name ] ) ) {
|
|
foreach ( self::$fields[ $opt_name ] as $field ) {
|
|
if ( $field['section_id'] === $section_id ) {
|
|
$p = esc_html( $field['priority'] );
|
|
|
|
while ( isset( $fields[ $p ] ) ) {
|
|
echo intval( $p++ );
|
|
}
|
|
|
|
$fields[ $p ] = $field;
|
|
}
|
|
}
|
|
}
|
|
|
|
ksort( $fields );
|
|
|
|
return $fields;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retrieve panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $id Section ID.
|
|
*
|
|
* @return bool
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function getSection( string $opt_name = '', string $id = '' ): bool { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_section( $opt_name, $id )' );
|
|
|
|
return self::get_section( $opt_name, $id );
|
|
}
|
|
|
|
/**
|
|
* Retrieve panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Section ID.
|
|
*
|
|
* @return bool|string|int
|
|
*/
|
|
public static function get_section( string $opt_name = '', $id = '' ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( $opt_name ) && ! empty( $id ) ) {
|
|
if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
|
|
$id = Redux_Core::strtolower( sanitize_html_class( $id ) );
|
|
}
|
|
|
|
return self::$sections[ $opt_name ][ $id ] ?? false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Create a section of the option panel.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $sections Section ID.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setSections( string $opt_name = '', array $sections = array() ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_sections( $opt_name, $sections )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::set_sections( $opt_name, $sections );
|
|
}
|
|
|
|
/**
|
|
* Create multiple sections of the option panel.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $sections Section ID.
|
|
*/
|
|
public static function set_sections( string $opt_name = '', array $sections = array() ) {
|
|
if ( empty( $sections ) || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
foreach ( $sections as $section ) {
|
|
self::set_section( $opt_name, $section );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retrieve all sections from the option panel.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return array|mixed
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function getSections( string $opt_name = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_sections( $opt_name )' );
|
|
|
|
return self::get_sections( $opt_name );
|
|
}
|
|
|
|
/**
|
|
* Retrieve all sections from the option panel.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return array|mixed
|
|
*/
|
|
public static function get_sections( string $opt_name = '' ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( self::$sections[ $opt_name ] ) ) {
|
|
return self::$sections[ $opt_name ];
|
|
}
|
|
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Deprecated Remove option panel by ID.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Section ID.
|
|
* @param bool $fields Remove fields.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function removeSection( string $opt_name = '', $id = '', bool $fields = false ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::remove_section( $opt_name, $id )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::remove_section( $opt_name, $id, $fields );
|
|
}
|
|
|
|
/**
|
|
* Remove an option panel by ID.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Section ID.
|
|
* @param bool $fields Remove fields.
|
|
*/
|
|
public static function remove_section( string $opt_name = '', $id = '', bool $fields = false ) {
|
|
if ( '' !== $opt_name && '' !== $id ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( isset( self::$sections[ $opt_name ][ $id ] ) ) {
|
|
$priority = '';
|
|
|
|
foreach ( self::$sections[ $opt_name ] as $key => $section ) {
|
|
if ( $key === $id ) {
|
|
$priority = $section['priority'];
|
|
--self::$priority[ $opt_name ]['sections'];
|
|
unset( self::$sections[ $opt_name ][ $id ] );
|
|
continue;
|
|
}
|
|
if ( '' !== $priority ) {
|
|
$new_priority = $section['priority'];
|
|
$section['priority'] = $priority;
|
|
self::$sections[ $opt_name ][ $key ] = $section;
|
|
$priority = $new_priority;
|
|
}
|
|
}
|
|
|
|
if ( isset( self::$fields[ $opt_name ] ) && ! empty( self::$fields[ $opt_name ] ) && true === $fields ) {
|
|
foreach ( self::$fields[ $opt_name ] as $key => $field ) {
|
|
if ( $field['section_id'] === $id ) {
|
|
unset( self::$fields[ $opt_name ][ $key ] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets a single option panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array|null $section Section data.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setSection( string $opt_name = '', ?array $section = array() ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
// phpcs:ignore Squiz.PHP.CommentedOutCode.Found
|
|
// _deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_section( $opt_name, $section )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::set_section( $opt_name, $section );
|
|
}
|
|
|
|
/**
|
|
* Sets a single option panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array|null $section Section data.
|
|
* @param bool $replace Replaces a section instead of creating a new one.
|
|
*/
|
|
public static function set_section( string $opt_name = '', ?array $section = array(), bool $replace = false ) {
|
|
|
|
if ( empty( $section ) || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( ! isset( $section['id'] ) ) {
|
|
if ( isset( $section['type'] ) && 'divide' === $section['type'] ) {
|
|
$section['id'] = time();
|
|
} elseif ( isset( $section['title'] ) ) {
|
|
$section['id'] = Redux_Core::strtolower( sanitize_title( $section['title'] ) );
|
|
} else {
|
|
$section['id'] = time();
|
|
}
|
|
|
|
if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) && ! $replace ) {
|
|
$orig = $section['id'];
|
|
$i = 0;
|
|
|
|
while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
|
|
$section['id'] = $orig . '_' . $i;
|
|
++$i;
|
|
}
|
|
} elseif ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) && $replace ) {
|
|
// If replace is set, let's update the default values with these!
|
|
$fields = false;
|
|
if ( isset( self::$sections[ $opt_name ][ $section['id'] ]['fields'] ) && ! empty( self::$sections[ $opt_name ][ $section['id'] ]['fields'] ) ) {
|
|
$fields = self::$sections[ $opt_name ][ $section['id'] ]['fields'];
|
|
}
|
|
self::$sections[ $opt_name ][ $section['id'] ] = wp_parse_args( $section, self::$sections[ $opt_name ][ $section['id'] ] );
|
|
if ( ! empty( $fields ) ) {
|
|
if ( ! isset( self::$sections[ $opt_name ][ $section['id'] ]['fields'] ) || ( isset( self::$sections[ $opt_name ][ $section['id'] ]['fields'] ) && empty( self::$sections[ $opt_name ][ $section['id'] ]['fields'] ) ) ) {
|
|
self::$sections[ $opt_name ][ $section['id'] ]['fields'] = $fields;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
|
|
if ( ! isset( $section['id'] ) && ! isset( $section['title'] ) ) {
|
|
self::$errors[ $opt_name ]['section']['missing_title'] = esc_html__( 'Unable to create a section due to missing id and title.', 'redux-framework' );
|
|
|
|
return;
|
|
}
|
|
|
|
if ( ! isset( $section['priority'] ) ) {
|
|
$section['priority'] = self::get_priority( $opt_name, 'sections' );
|
|
}
|
|
|
|
if ( isset( $section['fields'] ) ) {
|
|
if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
|
|
self::process_field_array( $opt_name, $section['id'], $section['fields'] );
|
|
}
|
|
unset( $section['fields'] );
|
|
}
|
|
self::$sections[ $opt_name ][ $section['id'] ] = $section;
|
|
} else {
|
|
self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Hides an option panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Section ID.
|
|
* @param bool $hide Flag to hide/show.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function hideSection( string $opt_name = '', $id = '', bool $hide = true ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::hide_section( $opt_name, $id )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::hide_section( $opt_name, $id, $hide );
|
|
}
|
|
|
|
/**
|
|
* Hides an option panel section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Section ID.
|
|
* @param bool $hide Flag to hide/show.
|
|
*/
|
|
public static function hide_section( string $opt_name = '', $id = '', bool $hide = true ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( '' !== $opt_name && '' !== $id ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( isset( self::$sections[ $opt_name ][ $id ] ) ) {
|
|
self::$sections[ $opt_name ][ $id ]['hidden'] = $hide;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Compiles field array data.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $section_id Section ID.
|
|
* @param array $fields Field data.
|
|
*/
|
|
private static function process_field_array( string $opt_name = '', $section_id = '', array $fields = array() ) {
|
|
if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
|
|
foreach ( $fields as $field ) {
|
|
if ( ! is_array( $field ) ) {
|
|
continue;
|
|
}
|
|
self::set_field( $opt_name, $section_id, $field );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retrieves an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
*
|
|
* @return int|bool
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function getField( string $opt_name = '', $id = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_field( $opt_name, $id )' );
|
|
|
|
return self::get_field( $opt_name, $id );
|
|
}
|
|
|
|
/**
|
|
* Retrieves an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
*
|
|
* @return int|bool
|
|
*/
|
|
public static function get_field( string $opt_name = '', $id = '' ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( $opt_name ) && ! empty( $id ) ) {
|
|
return self::$fields[ $opt_name ][ $id ] ?? false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Hides an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
* @param bool $hide Set hide/show.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function hideField( string $opt_name = '', $id = '', bool $hide = true ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::hide_field( $opt_name, $id )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::hide_field( $opt_name, $id, $hide );
|
|
}
|
|
|
|
/**
|
|
* Hides an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
* @param bool $hide Set hide/show.
|
|
*/
|
|
public static function hide_field( string $opt_name = '', $id = '', bool $hide = true ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( '' !== $opt_name && '' !== $id ) {
|
|
if ( isset( self::$fields[ $opt_name ][ $id ] ) ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( ! $hide ) {
|
|
self::$fields[ $opt_name ][ $id ]['class'] = str_replace( 'hidden', '', self::$fields[ $opt_name ][ $id ]['class'] );
|
|
} else {
|
|
self::$fields[ $opt_name ][ $id ]['class'] .= 'hidden';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Creates an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $section_id Section ID this field belongs to.
|
|
* @param array $field Field data.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setField( string $opt_name = '', $section_id = '', array $field = array() ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_field( $opt_name, $section_id, $field )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::set_field( $opt_name, $section_id, $field );
|
|
}
|
|
|
|
/**
|
|
* Creates an option panel field and adds to a section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $section_id Section ID this field belongs to.
|
|
* @param array $field Field data.
|
|
*/
|
|
public static function set_field( string $opt_name = '', $section_id = '', array $field = array() ) {
|
|
|
|
if ( ! is_array( $field ) || empty( $field ) || '' === $opt_name || '' === $section_id ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
// Shim for the old method!
|
|
if ( is_array( $section_id ) ) {
|
|
$field = $section_id;
|
|
if ( isset( $field['section_id'] ) ) {
|
|
$section_id = $field['section_id'];
|
|
}
|
|
}
|
|
|
|
$field['section_id'] = $section_id;
|
|
|
|
if ( ! isset( $field['priority'] ) ) {
|
|
$field['priority'] = self::get_priority( $opt_name, 'fields' );
|
|
}
|
|
$field['id'] = $field['id'] ?? "{$opt_name}_{$section_id}_{$field['type']}_" . wp_rand( 1, 9999 );
|
|
|
|
self::$fields[ $opt_name ][ $field['id'] ] = $field;
|
|
}
|
|
|
|
/**
|
|
* Create multiple fields of the option panel and apply to a section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param int|string $section_id Section ID this field belongs to.
|
|
* @param array $fields Array of field arrays.
|
|
*/
|
|
public static function set_fields( string $opt_name = '', $section_id = '', array $fields = array() ) {
|
|
if ( ! is_array( $fields ) || empty( $fields ) || '' === $opt_name || '' === $section_id ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
// phpcs:ignore WordPress.PHP.DevelopmentFunctions
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
foreach ( $fields as $field ) {
|
|
if ( is_array( $field ) ) {
|
|
self::set_field( $opt_name, $section_id, $field );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Removes an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
*
|
|
* @return bool
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function removeField( string $opt_name = '', $id = '' ): bool { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::remove_field( $opt_name, $id )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
return self::remove_field( $opt_name, $id );
|
|
}
|
|
|
|
/**
|
|
* Removes an option panel field.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|int $id Field ID.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function remove_field( string $opt_name = '', $id = '' ): bool {
|
|
if ( '' !== $opt_name && '' !== $id ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( isset( self::$fields[ $opt_name ][ $id ] ) ) {
|
|
foreach ( self::$fields[ $opt_name ] as $key => $field ) {
|
|
if ( $key === $id ) {
|
|
$priority = $field['priority'];
|
|
--self::$priority[ $opt_name ]['fields'];
|
|
unset( self::$fields[ $opt_name ][ $id ] );
|
|
continue;
|
|
}
|
|
|
|
if ( isset( $priority ) && '' !== $priority ) {
|
|
$new_priority = $field['priority'];
|
|
$field['priority'] = $priority;
|
|
self::$fields[ $opt_name ][ $key ] = $field;
|
|
$priority = $new_priority;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets help tabs on option panel admin page.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $tab Tab data.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setHelpTab( string $opt_name = '', array $tab = array() ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_help_tab( $opt_name, $tab )' );
|
|
|
|
self::set_help_tab( $opt_name, $tab );
|
|
}
|
|
|
|
/**
|
|
* Sets help tabs on option panel admin page.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $tab Tab data.
|
|
*/
|
|
public static function set_help_tab( string $opt_name = '', array $tab = array() ) {
|
|
if ( ! is_array( $tab ) && empty( $tab ) ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
if ( ! isset( self::$args[ $opt_name ]['help_tabs'] ) ) {
|
|
self::$args[ $opt_name ]['help_tabs'] = array();
|
|
}
|
|
|
|
if ( isset( $tab['id'] ) ) {
|
|
self::$args[ $opt_name ]['help_tabs'][] = $tab;
|
|
} elseif ( is_array( end( $tab ) ) ) {
|
|
foreach ( $tab as $tab_item ) {
|
|
self::$args[ $opt_name ]['help_tabs'][] = $tab_item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets the help sidebar content.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $content Content.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setHelpSidebar( string $opt_name = '', string $content = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_help_sidebar( $opt_name, $content )' );
|
|
|
|
self::set_help_sidebar( $opt_name, $content );
|
|
}
|
|
|
|
/**
|
|
* Sets the help sidebar content.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $content Content.
|
|
*/
|
|
public static function set_help_sidebar( string $opt_name = '', string $content = '' ) {
|
|
if ( '' === $content || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
self::check_opt_name( $opt_name );
|
|
|
|
self::$args[ $opt_name ]['help_sidebar'] = $content;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets option panel global arguments.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $args Argument data.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setArgs( string $opt_name = '', array $args = array() ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
// phpcs:ignore Squiz.PHP.CommentedOutCode.Found
|
|
// _deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_args( $opt_name, $args )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::set_args( $opt_name, $args );
|
|
}
|
|
|
|
/**
|
|
* Sets option panel global arguments.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param array $args Argument data.
|
|
*/
|
|
public static function set_args( string $opt_name = '', array $args = array() ) {
|
|
if ( empty( $args ) || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( is_array( $args ) ) {
|
|
if ( isset( self::$args[ $opt_name ]['clearArgs'] ) ) {
|
|
self::$args[ $opt_name ] = array();
|
|
}
|
|
self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set's developer key for premium services.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string|array $arg Args data.
|
|
*/
|
|
public static function set_developer( string $opt_name = '', $arg = '' ) {
|
|
if ( empty( $arg ) || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
self::$args[ $opt_name ]['developer'] = $arg;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retries option panel global argument array.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*
|
|
* @return mixed
|
|
* @deprecated No longer camelCase naming convention.
|
|
*/
|
|
public static function getArgs( string $opt_name = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_args( $opt_name )' );
|
|
|
|
return self::get_args( $opt_name );
|
|
}
|
|
|
|
/**
|
|
* Retries option panel global argument array.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Argument key name to be returned.
|
|
*
|
|
* @return mixed|null|array
|
|
*/
|
|
public static function get_args( string $opt_name = '', string $key = '' ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( $opt_name ) && ! empty( $key ) ) {
|
|
if ( ! empty( self::$args[ $opt_name ] ) ) {
|
|
return self::$args[ $opt_name ][ $key ];
|
|
} else {
|
|
return null;
|
|
}
|
|
} elseif ( ! empty( $opt_name ) && ! empty( self::$args[ $opt_name ] ) ) {
|
|
return self::$args[ $opt_name ];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retrieves a single global argument.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Argument name.
|
|
*
|
|
* @return mixed
|
|
* @deprecated No longer using camelCase naming convention and using singular function self::get_args() now.
|
|
*/
|
|
public static function getArg( string $opt_name = '', string $key = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_arg( $opt_name, $key )' );
|
|
|
|
return self::get_args( $opt_name, $key );
|
|
}
|
|
|
|
/**
|
|
* Retrieves a single global argument.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Argument name.
|
|
*
|
|
* @return mixed|array|null
|
|
*/
|
|
public static function get_arg( string $opt_name = '', string $key = '' ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( $opt_name ) && ! empty( $key ) && ! empty( self::$args[ $opt_name ] ) ) {
|
|
return self::$args[ $opt_name ][ $key ];
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Retrieves a single option from the database.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Option key.
|
|
* @param string|array $defaults Default value.
|
|
*
|
|
* @return mixed
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function getOption( string $opt_name = '', string $key = '', $defaults = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_option( $opt_name, $key, $default )' );
|
|
|
|
return self::get_option( $opt_name, $key, $defaults );
|
|
}
|
|
|
|
/**
|
|
* Retrieves meta for a given post page, IE WordPress meta values
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param mixed $the_post Post object to denote the current post, or custom.
|
|
* @param string $key Option key.
|
|
* @param mixed $defaults Default value.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public static function get_post_meta( string $opt_name = '', $the_post = array(), string $key = '', $defaults = null ) {
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( empty( $opt_name ) ) {
|
|
return null;
|
|
}
|
|
|
|
global $post;
|
|
|
|
$redux = ReduxFrameworkInstances::get_instance( $opt_name );
|
|
|
|
$metaboxes = $redux->extensions['metaboxes'];
|
|
|
|
if ( null === $defaults || '' === $defaults ) {
|
|
$defaults = self::get_option( $opt_name, $key );
|
|
}
|
|
|
|
if ( isset( $the_post ) && is_array( $the_post ) ) {
|
|
$the_post = $post;
|
|
} elseif ( ! isset( $the_post ) || 0 === $the_post ) {
|
|
return $defaults;
|
|
} elseif ( is_numeric( $the_post ) ) {
|
|
$the_post = get_post( $the_post );
|
|
} elseif ( ! is_object( $the_post ) ) {
|
|
$the_post = $post;
|
|
}
|
|
|
|
$defaults = self::get_option( $opt_name, $key );
|
|
|
|
return $metaboxes->get_values( $the_post, $key, $defaults );
|
|
}
|
|
|
|
/**
|
|
* Retrieves a single option from the database.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Option key.
|
|
* @param mixed $default Default value.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public static function get_option( string $opt_name = '', string $key = '', $default = null ) { // phpcs:ignore Universal.NamingConventions
|
|
self::check_opt_name( $opt_name );
|
|
|
|
if ( ! empty( $opt_name ) && ! empty( $key ) ) {
|
|
global $$opt_name;
|
|
|
|
if ( empty( $$opt_name ) ) {
|
|
$values = get_option( $opt_name );
|
|
$$opt_name = $values;
|
|
} else {
|
|
$values = $$opt_name;
|
|
}
|
|
|
|
if ( ! isset( $values[ $key ] ) ) {
|
|
if ( null === $default ) {
|
|
$field = self::get_field( $opt_name, $key );
|
|
|
|
if ( false !== $field ) {
|
|
$defaults_class = new Redux_Options_Defaults();
|
|
$sections = self::construct_sections( $opt_name );
|
|
$defaults = $defaults_class->default_values( $opt_name, $sections );
|
|
|
|
if ( isset( $defaults[ $key ] ) ) {
|
|
$default = $defaults[ $key ];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $subkeys ) && is_array( $subkeys ) ) {
|
|
$value = $default;
|
|
|
|
if ( isset( $values[ $key ] ) ) {
|
|
$count = count( $subkeys );
|
|
|
|
if ( 1 === $count ) {
|
|
$value = $values[ $key ][ $subkeys[1] ] ?? $default;
|
|
} elseif ( 2 === $count ) {
|
|
if ( isset( $values[ $key ][ $subkeys[1] ] ) ) {
|
|
$value = $values[ $key ][ $subkeys[1] ][ $subkeys[2] ] ?? $default;
|
|
}
|
|
} elseif ( 3 === $count ) {
|
|
if ( isset( $values[ $key ][ $subkeys[1] ] ) ) {
|
|
if ( isset( $values[ $key ][ $subkeys[1] ][ $subkeys[2] ] ) ) {
|
|
$value = $values[ $key ][ $subkeys[1] ][ $subkeys[2] ][ $subkeys[3] ] ?? $default;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$value = $values[ $key ] ?? $default;
|
|
}
|
|
|
|
return $value;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets an option into the database.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Option key.
|
|
* @param mixed $option Option value.
|
|
*
|
|
* @return bool
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setOption( string $opt_name = '', string $key = '', $option = '' ): bool { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::set_option( $opt_name, $key, $option )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
return self::set_option( $opt_name, $key, $option );
|
|
}
|
|
|
|
/**
|
|
* Sets an option into the database.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Option key.
|
|
* @param mixed $option Option value.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function set_option( string $opt_name = '', string $key = '', $option = '' ): bool {
|
|
if ( '' === $key ) {
|
|
return false;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
$redux = get_option( $opt_name );
|
|
$redux[ $key ] = $option;
|
|
|
|
return update_option( $opt_name, $redux );
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the next available priority for field/section.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $type Field or section.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public static function get_priority( string $opt_name, string $type ) {
|
|
$priority = self::$priority[ $opt_name ][ $type ];
|
|
self::$priority[ $opt_name ][ $type ] += 1;
|
|
|
|
return $priority;
|
|
}
|
|
|
|
/**
|
|
* Check opt_name integrity.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
*/
|
|
public static function check_opt_name( string $opt_name = '' ) {
|
|
if ( empty( $opt_name ) || is_array( $opt_name ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! isset( self::$sections[ $opt_name ] ) ) {
|
|
self::$sections[ $opt_name ] = array();
|
|
self::$priority[ $opt_name ]['sections'] = 1;
|
|
}
|
|
|
|
if ( ! isset( self::$args[ $opt_name ] ) ) {
|
|
self::$args[ $opt_name ] = array();
|
|
self::$priority[ $opt_name ]['args'] = 1;
|
|
}
|
|
|
|
if ( ! isset( self::$fields[ $opt_name ] ) ) {
|
|
self::$fields[ $opt_name ] = array();
|
|
self::$priority[ $opt_name ]['fields'] = 1;
|
|
}
|
|
|
|
if ( ! isset( self::$help[ $opt_name ] ) ) {
|
|
self::$help[ $opt_name ] = array();
|
|
self::$priority[ $opt_name ]['help'] = 1;
|
|
}
|
|
|
|
if ( ! isset( self::$errors[ $opt_name ] ) ) {
|
|
self::$errors[ $opt_name ] = array();
|
|
}
|
|
|
|
if ( ! isset( self::$init[ $opt_name ] ) ) {
|
|
self::$init[ $opt_name ] = false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve metadata from a file. Based on WP Core's get_file_data function
|
|
*
|
|
* @param string $file Path to the file.
|
|
*
|
|
* @return string
|
|
* @since 2.1.1
|
|
*/
|
|
public static function get_file_version( string $file ): string {
|
|
$data = get_file_data( $file, array( 'version' ), 'plugin' );
|
|
|
|
return $data[0];
|
|
}
|
|
|
|
/**
|
|
* Verify extension class name.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $name extension name.
|
|
* @param string $class_file Extension class file.
|
|
*/
|
|
private static function check_extension_class_file( string $opt_name, string $name = '', string $class_file = '' ) {
|
|
$instance = null;
|
|
|
|
if ( file_exists( $class_file ) ) {
|
|
self::$uses_extensions[ $opt_name ] = self::$uses_extensions[ $opt_name ] ?? array();
|
|
|
|
if ( ! in_array( $name, self::$uses_extensions[ $opt_name ], true ) ) {
|
|
self::$uses_extensions[ $opt_name ][] = $name;
|
|
}
|
|
|
|
self::$extensions[ $name ] = self::$extensions[ $name ] ?? array();
|
|
|
|
$version = Redux_Helpers::get_template_version( $class_file );
|
|
|
|
if ( empty( $version ) && ! empty( $instance ) ) {
|
|
if ( isset( $instance->version ) ) {
|
|
$version = $instance->version;
|
|
}
|
|
}
|
|
self::$extensions[ $name ][ $version ] = self::$extensions[ $name ][ $version ] ?? $class_file;
|
|
|
|
$new_name = str_replace( '_', '-', $name );
|
|
$api_check = str_replace(
|
|
array(
|
|
'extension_' . $name,
|
|
'class-redux-extension-' . $new_name,
|
|
),
|
|
array(
|
|
$name . '_api',
|
|
'class-redux-' . $new_name . '-api',
|
|
),
|
|
$class_file
|
|
);
|
|
|
|
if ( file_exists( $api_check ) && ! class_exists( 'Redux_' . ucfirst( $name ) ) ) {
|
|
include_once $api_check;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Sets all extensions in a path.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $path Path to extension folder.
|
|
*
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function setExtensions( string $opt_name, string $path ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.3', 'Redux::get_extensions( $opt_name, $path )' );
|
|
|
|
if ( '' !== $opt_name ) {
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
}
|
|
|
|
self::set_extensions( $opt_name, $path );
|
|
}
|
|
|
|
/**
|
|
* Sets all extensions in a path.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $path Path to extension folder.
|
|
* @param bool $force Make extension reload.
|
|
*/
|
|
public static function set_extensions( string $opt_name, string $path, bool $force = false ) {
|
|
if ( '' === $path || '' === $opt_name ) {
|
|
return;
|
|
}
|
|
|
|
self::check_opt_name( $opt_name );
|
|
|
|
Redux_Functions_Ex::record_caller( $opt_name );
|
|
|
|
if ( is_dir( $path ) ) {
|
|
$path = trailingslashit( $path );
|
|
$folder = str_replace( '.php', '', basename( $path ) );
|
|
|
|
$folder_fix = str_replace( '_', '-', $folder );
|
|
|
|
$files = array(
|
|
$path . 'extension_' . $folder . '.php',
|
|
$path . 'class-redux-extension-' . $folder_fix . '.php',
|
|
);
|
|
|
|
$ext_file = Redux_Functions::file_exists_ex( $files );
|
|
|
|
if ( $ext_file ) {
|
|
self::check_extension_class_file( $opt_name, $folder, $ext_file );
|
|
} else {
|
|
$folders = scandir( $path );
|
|
|
|
foreach ( $folders as $folder ) {
|
|
if ( '.' === $folder || '..' === $folder ) {
|
|
continue;
|
|
}
|
|
|
|
if ( is_dir( $path . $folder ) ) {
|
|
self::set_extensions( $opt_name, $path . $folder );
|
|
}
|
|
}
|
|
}
|
|
} elseif ( file_exists( $path ) ) {
|
|
$name = explode( 'extension_', basename( $path ) );
|
|
if ( ! empty( $name[1] ) ) {
|
|
$name = str_replace( '.php', '', $name[1] );
|
|
self::check_extension_class_file( $opt_name, $name, $path );
|
|
}
|
|
}
|
|
|
|
self::$extension_paths[ $opt_name ] = $path;
|
|
|
|
if ( true === $force ) {
|
|
if ( isset( self::$uses_extensions[ $opt_name ] ) && ! empty( self::$uses_extensions[ $opt_name ] ) ) {
|
|
$redux = self::instance( $opt_name );
|
|
|
|
if ( isset( $redux ) ) {
|
|
self::load_extensions( $redux );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieves all loaded extensions.
|
|
*/
|
|
private static function get_all_extension() {
|
|
$redux = self::all_instances();
|
|
|
|
foreach ( $redux as $instance ) {
|
|
if ( ! empty( self::$uses_extensions[ $instance['args']['opt_name'] ] ) ) {
|
|
continue;
|
|
}
|
|
if ( ! empty( $instance['extensions'] ) ) {
|
|
self::get_instance_extension( $instance['args']['opt_name'], $instance );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets all loaded extensions for the passed ReduxFramework instance.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param object|null $instance ReduxFramework instance.
|
|
*/
|
|
public static function get_instance_extension( string $opt_name, $instance ) {
|
|
if ( ! empty( self::$uses_extensions[ $opt_name ] ) || empty( $opt_name ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( empty( $instance ) ) {
|
|
$instance = self::instance( $opt_name );
|
|
}
|
|
|
|
if ( empty( $instance ) || empty( $instance->extensions ) ) {
|
|
return;
|
|
}
|
|
|
|
foreach ( $instance->extensions as $name => $extension ) {
|
|
if ( 'widget_areas' === $name ) {
|
|
new Redux_Widget_Areas( $instance );
|
|
}
|
|
|
|
if ( isset( self::$uses_extensions[ $opt_name ][ $name ] ) ) {
|
|
continue;
|
|
}
|
|
|
|
if ( isset( $extension->extension_dir ) ) {
|
|
self::set_extensions( $opt_name, str_replace( $name, '', $extension->extension_dir ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deprecated Gets loaded extensions.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Extension name.
|
|
*
|
|
* @return array|bool|mixed
|
|
* @deprecated No longer using camelCase naming convention.
|
|
*/
|
|
public static function getExtensions( string $opt_name = '', string $key = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
|
|
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, 'Redux 4.0.0', 'self::get_extensions( $opt_name, $key )' );
|
|
|
|
return self::get_extensions( $opt_name, $key );
|
|
}
|
|
|
|
/**
|
|
* Gets loaded extensions.
|
|
*
|
|
* @param string $opt_name Panel opt_name.
|
|
* @param string $key Extension name.
|
|
*
|
|
* @return array|bool|mixed
|
|
*/
|
|
public static function get_extensions( string $opt_name = '', string $key = '' ) {
|
|
if ( empty( $opt_name ) ) {
|
|
self::get_all_extension();
|
|
|
|
if ( empty( $key ) ) {
|
|
return self::$extension_paths;
|
|
} elseif ( isset( self::$extension_paths[ $key ] ) ) {
|
|
return self::$extension_paths[ $key ];
|
|
}
|
|
} else {
|
|
if ( empty( self::$uses_extensions[ $opt_name ] ) ) {
|
|
self::get_instance_extension( $opt_name, null );
|
|
}
|
|
|
|
if ( empty( self::$uses_extensions[ $opt_name ] ) ) {
|
|
return false;
|
|
}
|
|
|
|
$instance_extensions = array();
|
|
|
|
foreach ( self::$uses_extensions[ $opt_name ] as $extension ) {
|
|
$class_file = end( self::$extensions[ $extension ] );
|
|
$directory = explode( DIRECTORY_SEPARATOR, $class_file );
|
|
array_pop( $directory );
|
|
$directory = trailingslashit( join( DIRECTORY_SEPARATOR, $directory ) );
|
|
$name = str_replace( '.php', '', basename( $extension ) );
|
|
$extension_class = 'Redux_Extension_' . $name;
|
|
$the_data = array(
|
|
'path' => $class_file,
|
|
'dir' => $directory,
|
|
'class' => $extension_class,
|
|
'version' => Redux_Helpers::get_template_version( $class_file ),
|
|
);
|
|
|
|
if ( is_dir( $the_data['dir'] . $extension ) ) {
|
|
$test_path = trailingslashit( $the_data['dir'] . $extension );
|
|
if ( file_exists( $test_path . 'field_' . str_replace( '-', '', $extension ) . '.php' ) ) {
|
|
$the_data['field'] = $test_path . 'field_' . str_replace( '-', '', $extension ) . '.php';
|
|
}
|
|
// Old extensions!
|
|
if ( file_exists( $test_path . str_replace( '-', '', $extension ) . '.php' ) ) {
|
|
$the_data['field'] = $test_path . str_replace( '-', '', $extension ) . '.php';
|
|
}
|
|
}
|
|
$instance_extensions[ $extension ] = $the_data;
|
|
}
|
|
|
|
return $instance_extensions;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Method to disables Redux demo mode popup.
|
|
*/
|
|
public static function disable_demo() {
|
|
add_action( 'ReduxFrameworkPlugin_admin_notice', 'Redux::remove_demo' );
|
|
add_action( 'redux_framework_plugin_admin_notice', 'Redux::remove_demo' );
|
|
}
|
|
|
|
/**
|
|
* Callback used by self::disable_demo() to remove the demo mode notice from Redux.
|
|
*/
|
|
public static function remove_demo() {
|
|
update_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', '' );
|
|
}
|
|
|
|
/**
|
|
* Function which forces a panel/page to render.
|
|
*
|
|
* @param string|object $redux Panel opt_name or Redux object.
|
|
*/
|
|
public static function render( $redux = '' ) {
|
|
if ( is_string( $redux ) ) {
|
|
$redux = Redux_Instances::get_instance( $redux );
|
|
if ( empty( $redux ) ) {
|
|
return;
|
|
}
|
|
}
|
|
$enqueue = new Redux_Enqueue( $redux );
|
|
$enqueue->init();
|
|
$panel = new Redux_Panel( $redux );
|
|
$panel->init();
|
|
}
|
|
}
|
|
|
|
Redux::load();
|
|
}
|