Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
subversal
/
video
/
wp-content
/
plugins
/
atlas-core
/
framework
/
redux-core
/
inc
/
classes
:
class-redux-functions-ex.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /** * Redux Framework Private Extended Functions Container Class * * @class Redux_Functions_Ex * @since 3.0.0 * @package Redux_Framework/Classes */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; // Don't duplicate me! if ( ! class_exists( 'Redux_Functions_Ex', false ) ) { /** * Redux Functions Class * A Class of useful functions that can/should be shared among all Redux files. * * @since 3.0.0 */ class Redux_Functions_Ex { /** * What is this for? * * @var array */ public static $args; /** * Enqueue Font Awesome. * * @return void */ public static function enqueue_font_awesome() { wp_enqueue_style( 'font-awesome', Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css', array(), '6.5.2' ); wp_enqueue_style( 'font-awesome-4-shims', Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css', array(), '6.5.2' ); } /** * Enqueue Elusive Font. * * @return void */ public static function enqueue_elusive_font() { wp_enqueue_style( 'redux-elusive-icon', Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css', array(), '2.0.0' ); } /** * Output alpha data tag for Iris alpha color picker, if enabled. * * @param array $data Data array. * * @return string */ public static function output_alpha_data( array $data ): string { $index = null; extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract $value = false; if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { if ( is_array( $field['color_alpha'] ) ) { $value = $field['color_alpha'][ $index ] ?? false; } else { $value = $field['color_alpha']; } } return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; } /** * Parses the string into variables without the max_input_vars limitation. * * @param string $str String of data. * * @return array|false $result * @since 3.5.7.11 * @author harunbasic * @access private */ public static function parse_str( string $str ) { if ( '' === $str ) { return false; } $result = array(); $pairs = explode( '&', $str ); foreach ( $pairs as $pair ) { // use the original parse_str() on each element. parse_str( $pair, $params ); $k = key( $params ); if ( ! isset( $result[ $k ] ) ) { $result += $params; } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); } } return $result; } /** * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 * * @param array $array1 array one. * @param array $array2 array two. * * @return array $merged * @since 3.5.7.11 * @author harunbasic * @access private */ public static function array_merge_recursive_distinct( array $array1, array $array2 ): array { $merged = $array1; foreach ( $array2 as $key => $value ) { if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { $merged[] = $value; } else { $merged[ $key ] = $value; } } return $merged; } /** * Records calling function. * * @param string $opt_name Panel opt_name. */ public static function record_caller( string $opt_name = '' ) { global $pagenow; // phpcs:ignore WordPress.Security.NonceVerification if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) { return; } // phpcs:ignore WordPress.PHP.DevelopmentFunctions $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { Redux_Core::$callers[ $opt_name ] = array(); } if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { return; } if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { Redux_Core::$callers[ $opt_name ][] = $caller; } if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { self::$args[ $opt_name ]['callers'][] = $caller; } } } /** * Normalize path. * * @param string $path Path to normalize. * * @return string|string[]|null */ public static function wp_normalize_path( string $path = '' ) { if ( function_exists( 'wp_normalize_path' ) ) { $path = wp_normalize_path( $path ); } else { // Shim for pre WP 3.9. $path = str_replace( '\\', '/', $path ); $path = preg_replace( '|(?<=.)/+|', '/', $path ); if ( ':' === substr( $path, 1, 1 ) ) { $path = ucfirst( $path ); } } return $path; } /** * Action to add generator tag to page HEAD. */ public static function generator() { add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) ); } /** * Callback for wp_head hook to add meta tag. */ public static function meta_tag() { echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />'; } /** * Run URL through a ssl check. * * @param string $url URL to check. * * @return string */ public static function verify_url_protocol( string $url ): string { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://'; if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) { $url = str_replace( $protocol, $new_protocol, $url ); } } return $url; } /** * Check s. * * @access public * @return bool * @since 4.0.0 */ public static function s(): bool { if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) { return true; } } return false; } /** * Is file in theme. * * @param string $file File to check. * * @return bool */ public static function file_in_theme( string $file ): bool { $file_path = self::wp_normalize_path( dirname( $file ) ); if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) { return true; } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) { return true; } return false; } /** * Is Redux embedded inside a plugin? * * @param string $file File to check. * * @return array|bool */ public static function is_inside_plugin( string $file ) { $file = self::wp_normalize_path( $file ); $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) ); if ( self::file_in_theme( $file ) ) { return false; } if ( $plugin_basename !== $file ) { $slug = explode( '/', $plugin_basename ); $slug = $slug[0]; return array( 'slug' => $slug, 'basename' => $plugin_basename, 'path' => $file, 'url' => self::verify_url_protocol( plugins_url( $plugin_basename ) ), 'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ), ); } return false; } /** * Is Redux embedded in a theme? * * @param string $file File to check. * * @return array|bool */ public static function is_inside_theme( string $file = '' ) { if ( ! self::file_in_theme( $file ) ) { return false; } $theme_paths = array( self::wp_normalize_path( get_template_directory() ) => get_template_directory_uri(), // parent. self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(), // child. ); $theme_paths = array_unique( $theme_paths ); $file_path = self::wp_normalize_path( $file ); $filename = explode( DIRECTORY_SEPARATOR, $file ); end( $filename ); $filename = prev( $filename ); foreach ( $theme_paths as $theme_path => $url ) { $real_path = self::wp_normalize_path( realpath( $theme_path ) ); if ( empty( $real_path ) ) { continue; } if ( strpos( $file_path, $real_path ) !== false ) { $slug = explode( '/', $theme_path ); $slug = end( $slug ); $relative_path = explode( $slug . '/', dirname( $file_path ) ); $relative_path = $relative_path[1]; $data = array( 'slug' => $slug, 'path' => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename, 'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename, 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, ); $data['realpath'] = $data['real_path']; // Shim for old extensions. if ( count( $theme_paths ) > 1 ) { $key = array_search( $theme_path, $theme_paths, true ); if ( false !== $key ) { unset( $theme_paths[ $key ] ); } $theme_paths_end = end( $theme_paths ); $parent_slug_end = explode( '/', $theme_paths_end ); $parent_slug_end = end( $parent_slug_end ); $data['parent_slug'] = $parent_slug_end; } return $data; } } return false; } /** * Used to fix 3.x and 4 compatibility for extensions * * @param object $extension The extension parent object. * @param string $path - Path of the file. * @param string $ext_class - Extension class name. * @param string $new_class_name - New dynamic class name. * @param string $name extension name. * * @return object - Extended field class. */ public static function extension_compatibility( $extension, string $path, string $ext_class, string $new_class_name, string $name ) { if ( empty( $new_class_name ) ) { return null; } $upload_dir = ReduxFramework::$_upload_dir . '/extension_compatibility/'; if ( ! file_exists( $upload_dir . $ext_class . '.php' ) ) { if ( ! is_dir( $upload_dir ) ) { $extension->filesystem->mkdir( $upload_dir ); $extension->filesystem->put_contents( $upload_dir . 'index.php', '<?php // Silence is golden.' ); } if ( ! class_exists( $ext_class ) ) { require_once $path; } if ( ! file_exists( $upload_dir . $new_class_name . '.php' ) ) { $class_file = '<?php' . PHP_EOL . PHP_EOL . 'class {{ext_class}} extends Redux_Extension_Abstract {' . PHP_EOL . ' private $c;' . PHP_EOL . ' public function __construct( $parent, $path, $ext_class ) {' . PHP_EOL . ' $this->c = $parent->extensions[\'' . $name . '\'];' . PHP_EOL . ' // Add all the params of the Abstract to this instance.' . PHP_EOL . ' foreach( get_object_vars( $this->c ) as $key => $value ) {' . PHP_EOL . ' $this->$key = $value;' . PHP_EOL . ' }' . PHP_EOL . ' parent::__construct( $parent, $path );' . PHP_EOL . ' }' . PHP_EOL . ' // fake "extends Redux_Extension_Abstract\" using magic function' . PHP_EOL . ' public function __call( $method, $args ) {' . PHP_EOL . ' return call_user_func_array( array( $this->c, $method ), $args );' . PHP_EOL . ' }' . PHP_EOL . '}' . PHP_EOL; $template = str_replace( '{{ext_class}}', $new_class_name, $class_file ); // phpcs:ignore Squiz.PHP.CommentedOutCode.Found // $parent->filesystem->put_contents( $upload_dir . $new_class_name . '.php', $template ); } if ( file_exists( $upload_dir . $new_class_name . '.php' ) ) { if ( ! class_exists( $new_class_name ) ) { require_once $upload_dir . $new_class_name . '.php'; } if ( class_exists( $new_class_name ) ) { return new $new_class_name( $extension, $path, $ext_class ); } } } return null; } /** * Used to merge two deep arrays. * * @param array $a First array to deeply merge. * @param array $b Second array to deeply merge. * * @return array - Deep merge of the two arrays. */ public static function nested_wp_parse_args( array &$a, array $b ): array { $result = $b; foreach ( $a as $k => &$v ) { if ( is_array( $v ) && isset( $result[ $k ] ) ) { $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); } else { $result[ $k ] = $v; } } return $result; } /** * AJAX callback key */ public static function hash_key(): string { $key = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url(); $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; return $key; } /** * Register a class path to be autoloaded. * Registers a namespace to be autoloaded from a given path, using the * WordPress/HM-style filenames (`class-{name}.php`). * * @link https://engineering.hmn.md/standards/style/php/#file-naming * * @param string $prefix Prefix to autoload from. * @param string $path Path to validate. */ public static function register_class_path( string $prefix = '', string $path = '' ) { if ( ! class_exists( 'Redux_Autoloader' ) ) { require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' ); } $loader = new Redux_Autoloader( $prefix, $path ); spl_autoload_register( array( $loader, 'load' ) ); } /** * Check if a string starts with a string. * * @param string $haystack Full string. * @param string $needle String to check if it starts with. * * @return bool */ public static function string_starts_with( string $haystack, string $needle ): bool { $length = strlen( $needle ); return substr( $haystack, 0, $length ) === $needle; } /** * Check if a string ends with a string. * * @param string $haystack Full string. * @param string $needle String to check if it starts with. * * @return bool */ public static function string_ends_with( string $haystack, string $needle ): bool { $length = strlen( $needle ); if ( ! $length ) { return true; } return substr( $haystack, - $length ) === $needle; } /** * Is plugin active. * * @param string $name Plugin name. * * @return bool */ public static function is_plugin_active( string $name ): bool { if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) { return true; } return false; } } }