doesn't get through and mess
// things up.
$addMenu = false;
if ( 'settings.php' != $page_parent ) {
// Establish the needle
$needle = '?post_type=';
// Check if it exists in the page_parent (how I miss instr)
$needlePos = strrpos( $page_parent, $needle );
// It's there, so...
if ( $needlePos > 0 ) {
// Get the post type.
$postType = substr( $page_parent, $needlePos + strlen( $needle ) );
// Ensure it exists.
if ( post_type_exists( $postType ) ) {
// Set flag to add the menu page
$addMenu = true;
}
// custom menu
} elseif ( isset ( $submenu[ $this->args['page_parent'] ] ) ) {
$addMenu = true;
} else {
global $menu;
foreach ( $menu as $menupriority => $menuitem ) {
$needle_menu_slug = isset ( $menuitem ) ? $menuitem[2] : false;
if ( $needle_menu_slug != false ) {
// check if the current needle menu equals page_parent
if ( strcasecmp( $needle_menu_slug, $page_parent ) == 0 ) {
// found an empty parent menu
$addMenu = true;
}
}
}
}
} else {
// The page_parent was settings.php, so set menu add
// flag to true.
$addMenu = true;
}
}
}
/**
* Class Options Page Function, creates main options page.
*
* @since 1.0.0
* @access public
* @return void
*/
public function _options_page() {
if ( $this->args['menu_type'] == 'hidden' ) {
// No menu to add!
} else if ( $this->args['menu_type'] == 'submenu' ) {
$this->add_submenu(
$this->args['page_parent'], $this->args['page_title'], $this->args['menu_title'], $this->args['page_permissions'], $this->args['page_slug']
);
}
add_action( "load-{$this->page}", array( &$this, '_load_page' ) );
}
// _options_page()
/**
* Add admin bar menu
*
* @since 3.1.5.16
* @access public
* @global $menu , $submenu, $wp_admin_bar
* @return void
*/
public function _admin_bar_menu() {
global $menu, $submenu, $wp_admin_bar;
$ct = wp_get_theme();
$theme_data = $ct;
if ( ! is_super_admin() || ! is_admin_bar_showing() || ! $this->args['admin_bar'] || $this->args['menu_type'] == 'hidden' ) {
return;
}
if ( $menu ) {
foreach ( $menu as $menu_item ) {
if ( isset ( $menu_item[2] ) && $menu_item[2] === $this->args["page_slug"] ) {
// Fetch the title
$title = empty ( $this->args['admin_bar_icon'] ) ? $menu_item[0] : ' ' . $menu_item[0];
$nodeargs = array(
'id' => $menu_item[2],
'title' => $title,
'href' => admin_url( 'admin.php?page=' . $menu_item[2] ),
'meta' => array()
);
$wp_admin_bar->add_node( $nodeargs );
break;
}
}
if ( isset ( $submenu[ $this->args["page_slug"] ] ) && is_array( $submenu[ $this->args["page_slug"] ] ) ) {
foreach ( $submenu[ $this->args["page_slug"] ] as $index => $redux_options_submenu ) {
$subnodeargs = array(
'id' => $this->args["page_slug"] . '_' . $index,
'title' => $redux_options_submenu[0],
'parent' => $this->args["page_slug"],
'href' => admin_url( 'admin.php?page=' . $redux_options_submenu[2] ),
);
$wp_admin_bar->add_node( $subnodeargs );
}
}
// Let's deal with external links
if ( isset ( $this->args['admin_bar_links'] ) ) {
if ( ! $this->args['dev_mode'] && $this->omit_admin_items ) {
return;
}
// Group for Main Root Menu (External Group)
$wp_admin_bar->add_node( array(
'id' => $this->args["page_slug"] . '-external',
'parent' => $this->args["page_slug"],
'group' => true,
'meta' => array( 'class' => 'ab-sub-secondary' )
) );
// Add Child Menus to External Group Menu
foreach ( $this->args['admin_bar_links'] as $link ) {
if ( ! isset ( $link['id'] ) ) {
$link['id'] = $this->args["page_slug"] . '-sub-' . sanitize_html_class( $link['title'] );
}
$externalnodeargs = array(
'id' => $link['id'],
'title' => $link['title'],
'parent' => $this->args["page_slug"] . '-external',
'href' => $link['href'],
'meta' => array( 'target' => '_blank' )
);
$wp_admin_bar->add_node( $externalnodeargs );
}
}
} else {
// Fetch the title
$title = empty ( $this->args['admin_bar_icon'] ) ? $this->args['menu_title'] : ' ' . $this->args['menu_title'];
$nodeargs = array(
'id' => $this->args["page_slug"],
'title' => $title,
// $theme_data->get( 'Name' ) . " " . __( 'Options', 'redux-framework-demo' ),
'href' => admin_url( 'admin.php?page=' . $this->args["page_slug"] ),
'meta' => array()
);
$wp_admin_bar->add_node( $nodeargs );
}
}
// _admin_bar_menu()
/**
* Output dynamic CSS at bottom of HEAD
*
* @since 3.2.8
* @access public
* @return void
*/
public function _output_css() {
if ( $this->args['output'] == false && $this->args['compiler'] == false ) {
return;
}
if ( isset ( $this->no_output ) ) {
return;
}
if ( ! empty ( $this->outputCSS ) && ( $this->args['output_tag'] == true || ( isset ( $_POST['customized'] ) ) ) ) {
echo '';
}
}
/**
* Enqueue CSS and Google fonts for front end
*
* @since 1.0.0
* @access public
* @return void
*/
public function _enqueue_output() {
if ( $this->args['output'] == false && $this->args['compiler'] == false ) {
return;
}
/** @noinspection PhpUnusedLocalVariableInspection */
foreach ( $this->sections as $k => $section ) {
if ( isset ( $section['type'] ) && ( $section['type'] == 'divide' ) ) {
continue;
}
if ( isset ( $section['fields'] ) ) {
/** @noinspection PhpUnusedLocalVariableInspection */
foreach ( $section['fields'] as $fieldk => $field ) {
if ( isset ( $field['type'] ) && $field['type'] != "callback" ) {
$field_class = "ReduxFramework_{$field['type']}";
if ( ! class_exists( $field_class ) ) {
if ( ! isset ( $field['compiler'] ) ) {
$field['compiler'] = "";
}
/**
* Field class file
* filter 'redux/{opt_name}/field/class/{field.type}
*
* @param string field class file
* @param array $field field config data
*/
$class_file = apply_filters( "redux/{$this->args['opt_name']}/field/class/{$field['type']}", self::$_dir . "inc/fields/{$field['type']}/field_{$field['type']}.php", $field );
if ( $class_file && file_exists( $class_file ) && ! class_exists( $field_class ) ) {
/** @noinspection PhpIncludeInspection */
require_once $class_file;
}
}
if ( ! empty ( $this->options[ $field['id'] ] ) && class_exists( $field_class ) && method_exists( $field_class, 'output' ) && $this->_can_output_css( $field ) ) {
$field = apply_filters( "redux/field/{$this->args['opt_name']}/output_css", $field );
if ( ! empty ( $field['output'] ) && ! is_array( $field['output'] ) ) {
$field['output'] = array( $field['output'] );
}
$value = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : '';
$enqueue = new $field_class ( $field, $value, $this );
if ( ( ( isset ( $field['output'] ) && ! empty ( $field['output'] ) ) || ( isset ( $field['compiler'] ) && ! empty ( $field['compiler'] ) ) || $field['type'] == "typography" || $field['type'] == "icon_select" ) ) {
$enqueue->output();
}
}
}
}
}
}
// For use like in the customizer. Stops the output, but passes the CSS in the variable for the compiler
if ( isset ( $this->no_output ) ) {
return;
}
if ( ! empty ( $this->typography ) && ! empty ( $this->typography ) && filter_var( $this->args['output'], FILTER_VALIDATE_BOOLEAN ) ) {
$version = ! empty ( $this->transients['last_save'] ) ? $this->transients['last_save'] : '';
$typography = new ReduxFramework_typography ( null, null, $this );
if ( $this->args['async_typography'] && ! empty ( $this->typography ) ) {
$families = array();
foreach ( $this->typography as $key => $value ) {
$families[] = $key;
}
?>
args['disable_google_fonts_link'] ) {
$protocol = ( ! empty ( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443 ) ? "https:" : "http:";
//echo ' ';
wp_register_style( 'redux-google-fonts-' . $this->args['opt_name'], $protocol . $typography->makeGoogleWebfontLink( $this->typography ), '', $version );
wp_enqueue_style( 'redux-google-fonts-' . $this->args['opt_name'] );
}
}
}
// _enqueue_output()
/**
* Enqueue CSS/JS for options page
*
* @since 1.0.0
* @access public
* @global $wp_styles
* @return void
*/
public function _enqueue() {
require_once 'core/enqueue.php';
$enqueue = new reduxCoreEnqueue ( $this );
$enqueue->init();
}
// _enqueue()
/**
* Show page help
*
* @since 1.0.0
* @access public
* @return void
*/
public function _load_page() {
// Do admin head action for this page
add_action( 'admin_head', array( &$this, 'admin_head' ) );
// Do admin footer text hook
add_filter( 'admin_footer_text', array( &$this, 'admin_footer_text' ) );
$screen = get_current_screen();
if ( is_array( $this->args['help_tabs'] ) ) {
foreach ( $this->args['help_tabs'] as $tab ) {
$screen->add_help_tab( $tab );
}
}
// If hint argument is set, display hint tab
if ( true == $this->show_hints ) {
global $current_user;
// Users enable/disable hint choice
$hint_status = get_user_meta( $current_user->ID, 'ignore_hints' ) ? get_user_meta( $current_user->ID, 'ignore_hints', true ) : 'true';
// current page parameters
$curPage = $_GET['page'];
$curTab = '0';
if ( isset ( $_GET['tab'] ) ) {
$curTab = esc_attr( $_GET['tab'] );
}
// Default url values for enabling hints.
$dismiss = 'true';
$s = __( 'Enable', 'virtue' );
// Values for disabling hints.
if ( 'true' == $hint_status ) {
$dismiss = 'false';
$s = __( 'Disable', 'virtue' );
}
// Make URL
$url = '' . $s . ' hints ';
$event = __( 'moving the mouse over', 'virtue' );
if ( 'click' == $this->args['hints']['tip_effect']['show']['event'] ) {
$event = __( 'clicking', 'virtue' );
}
// Construct message
$msg = sprintf( __( 'Hints are tooltips that popup when %d the hint icon, offering addition information about the field in which they appear. They can be %d d by using the link below.', 'virtue' ), $event, strtolower( $s ) ) . ' ' . $url;
// Construct hint tab
$tab = array(
'id' => 'redux-hint-tab',
'title' => __( 'Hints', 'virtue' ),
'content' => '' . $msg . '
'
);
$screen->add_help_tab( $tab );
}
// Sidebar text
if ( $this->args['help_sidebar'] != '' ) {
// Specify users text from arguments
$screen->set_help_sidebar( $this->args['help_sidebar'] );
} else {
// If sidebar text is empty and hints are active, display text
// about hints.
if ( true == $this->show_hints ) {
$screen->set_help_sidebar( 'Redux Framework Hint Tooltip Preferences
' );
}
}
/**
* action 'redux-load-page-{opt_name}'
*
* @deprecated
*
* @param object $screen WP_Screen
*/
do_action( "redux-load-page-{$this->args['opt_name']}", $screen ); // REMOVE
/**
* action 'redux/page/{opt_name}/load'
*
* @param object $screen WP_Screen
*/
do_action( "redux/page/{$this->args['opt_name']}/load", $screen );
}
// _load_page()
/**
* Do action redux-admin-head for options page
*
* @since 1.0.0
* @access public
* @return void
*/
public function admin_head() {
/**
* action 'redux-admin-head-{opt_name}'
*
* @deprecated
*
* @param object $this ReduxFramework
*/
do_action( "redux-admin-head-{$this->args['opt_name']}", $this ); // REMOVE
/**
* action 'redux/page/{opt_name}/header'
*
* @param object $this ReduxFramework
*/
do_action( "redux/page/{$this->args['opt_name']}/header", $this );
}
// admin_head()
/**
* Return footer text
*
* @since 2.0.0
* @access public
* @return string $this->args['footer_credit']
*/
public function admin_footer_text() {
return $this->args['footer_credit'];
}
// admin_footer_text()
/**
* Return default output string for use in panel
*
* @since 3.1.5
* @access public
* @return string default_output
*/
private function get_default_output_string( $field ) {
$default_output = "";
if ( ! isset ( $field['default'] ) ) {
$field['default'] = "";
}
if ( ! is_array( $field['default'] ) ) {
if ( ! empty ( $field['options'][ $field['default'] ] ) ) {
if ( ! empty ( $field['options'][ $field['default'] ]['alt'] ) ) {
$default_output .= $field['options'][ $field['default'] ]['alt'] . ', ';
} else {
// TODO: This serialize fix may not be the best solution. Look into it. PHP 5.4 error without serialize
if ( ! is_array( $field['options'][ $field['default'] ] ) ) {
$default_output .= $field['options'][ $field['default'] ] . ", ";
} else {
$default_output .= serialize( $field['options'][ $field['default'] ] ) . ", ";
}
}
} else if ( ! empty ( $field['options'][ $field['default'] ] ) ) {
$default_output .= $field['options'][ $field['default'] ] . ", ";
} else if ( ! empty ( $field['default'] ) ) {
if ( $field['type'] == 'switch' && isset ( $field['on'] ) && isset ( $field['off'] ) ) {
$default_output .= ( $field['default'] == 1 ? $field['on'] : $field['off'] ) . ', ';
} else {
$default_output .= $field['default'] . ', ';
}
}
} else {
foreach ( $field['default'] as $defaultk => $defaultv ) {
if ( ! empty ( $field['options'][ $defaultv ]['alt'] ) ) {
$default_output .= $field['options'][ $defaultv ]['alt'] . ', ';
} else if ( ! empty ( $field['options'][ $defaultv ] ) ) {
$default_output .= $field['options'][ $defaultv ] . ", ";
} else if ( ! empty ( $field['options'][ $defaultk ] ) ) {
$default_output .= $field['options'][ $defaultk ] . ", ";
} else if ( ! empty ( $defaultv ) ) {
$default_output .= $defaultv . ', ';
}
}
}
if ( ! empty ( $default_output ) ) {
$default_output = __( 'Default', 'virtue' ) . ": " . substr( $default_output, 0, - 2 );
}
if ( ! empty ( $default_output ) ) {
$default_output = '' . $default_output . ' ';
}
return $default_output;
}
// get_default_output_string()
public function get_header_html( $field ) {
global $current_user;
// Set to empty string to avoid wanrings.
$hint = '';
$th = "";
if ( isset ( $field['title'] ) && isset ( $field['type'] ) && $field['type'] !== "info" && $field['type'] !== "section" ) {
$default_mark = ( ! empty ( $field['default'] ) && isset ( $this->options[ $field['id'] ] ) && $this->options[ $field['id'] ] == $field['default'] && ! empty ( $this->args['default_mark'] ) && isset ( $field['default'] ) ) ? $this->args['default_mark'] : '';
// If a hint is specified in the field, process it.
if ( isset ( $field['hint'] ) && ! '' == $field['hint'] ) {
// Set show_hints flag to true, so helptab will be displayed.
$this->show_hints = true;
$hint = apply_filters( 'redux/hints/html', $hint, $field, $this->args );
// Get user pref for displaying hints.
$metaVal = get_user_meta( $current_user->ID, 'ignore_hints', true );
if ( 'true' == $metaVal || empty ( $metaVal ) && empty( $hint ) ) {
// Set hand cursor for clickable hints
$pointer = '';
if ( isset ( $this->args['hints']['tip_effect']['show']['event'] ) && 'click' == $this->args['hints']['tip_effect']['show']['event'] ) {
$pointer = 'pointer';
}
$size = '16px';
if ( 'large' == $this->args['hints']['icon_size'] ) {
$size = '18px';
}
// In case docs are ignored.
$titleParam = isset ( $field['hint']['title'] ) ? $field['hint']['title'] : '';
$contentParam = isset ( $field['hint']['content'] ) ? $field['hint']['content'] : '';
$hint_color = isset ( $this->args['hints']['icon_color'] ) ? $this->args['hints']['icon_color'] : '#d3d3d3';
// Set hint html with appropriate position css
$hint = '
';
}
}
if ( ! empty ( $field['title'] ) ) {
if ( 'left' == $this->args['hints']['icon_position'] ) {
$th = $hint . $field['title'] . $default_mark . "";
} else {
$th = $field['title'] . $default_mark . "" . $hint;
}
}
if ( isset ( $field['subtitle'] ) ) {
$th .= '' . $field['subtitle'] . ' ';
}
}
if ( ! empty ( $th ) ) {
$th = '' . $th . '
';
}
$filter_arr = array(
'editor',
'ace_editor',
'info',
'section',
'repeater',
'color_scheme',
'social_profiles',
'css_layout'
);
if ( $this->args['default_show'] == true && isset ( $field['default'] ) && isset ( $this->options[ $field['id'] ] ) && $this->options[ $field['id'] ] != $field['default'] && ! in_array( $field['type'], $filter_arr ) ) {
$th .= $this->get_default_output_string( $field );
}
return $th;
}
/**
* Register Option for use
*
* @since 1.0.0
* @access public
* @return void
*/
public function _register_settings() {
// TODO - REMOVE
// Not used by new sample-config, but in here for legacy builds
// This is bad and can break things. Hehe.
if ( ! function_exists( 'wp_get_current_user' ) ) {
require_once ABSPATH . "wp-includes/pluggable.php";
}
if ( $this->args['options_api'] == true ) {
register_setting( $this->args['opt_name'] . '_group', $this->args['opt_name'], array(
$this,
'_validate_options'
) );
}
if ( is_null( $this->sections ) ) {
return;
}
if ( empty( $this->options_defaults ) ) {
$this->options_defaults = $this->_default_values();
}
$runUpdate = false;
foreach ( $this->sections as $k => $section ) {
if ( isset ( $section['type'] ) && $section['type'] == 'divide' ) {
continue;
}
$display = true;
if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) {
if ( isset ( $section['panel'] ) && $section['panel'] == false ) {
$display = false;
}
}
// DOVY! Replace $k with $section['id'] when ready
/**
* filter 'redux-section-{index}-modifier-{opt_name}'
*
* @param array $section section configuration
*/
$section = apply_filters( "redux-section-{$k}-modifier-{$this->args['opt_name']}", $section );
/**
* filter 'redux/options/{opt_name}/section/{section.id}'
*
* @param array $section section configuration
*/
if ( isset ( $section['id'] ) ) {
$section = apply_filters( "redux/options/{$this->args['opt_name']}/section/{$section['id']}", $section );
}
if ( empty ( $section ) ) {
unset ( $this->sections[ $k ] );
continue;
}
if ( ! isset ( $section['title'] ) ) {
$section['title'] = "";
}
if ( isset ( $section['customizer_only'] ) && $section['customizer_only'] == true ) {
$section['panel'] = false;
$this->sections[ $k ] = $section;
}
$heading = isset ( $section['heading'] ) ? $section['heading'] : $section['title'];
if ( isset ( $section['permissions'] ) ) {
if ( ! current_user_can( $section['permissions'] ) ) {
$this->hidden_perm_sections[] = $section['title'];
foreach ( $section['fields'] as $num => $field_data ) {
$field_type = $field_data['type'];
if ( $field_type != 'section' || $field_type != 'divide' || $field_type != 'info' || $field_type != 'raw' ) {
$field_id = $field_data['id'];
$default = isset ( $this->options_defaults[ $field_id ] ) ? $this->options_defaults[ $field_id ] : '';
$data = isset ( $this->options[ $field_id ] ) ? $this->options[ $field_id ] : $default;
$this->hidden_perm_fields[ $field_id ] = $data;
}
}
continue;
}
}
if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
$this->no_panel_section[ $k ] = $section;
} else {
add_settings_section( $this->args['opt_name'] . $k . '_section', $heading, array(
&$this,
'_section_desc'
), $this->args['opt_name'] . $k . '_section_group' );
}
$sectionIndent = false;
if ( isset ( $section['fields'] ) ) {
foreach ( $section['fields'] as $fieldk => $field ) {
if ( ! isset ( $field['type'] ) ) {
continue; // You need a type!
}
if ( $field['type'] == "info" && isset( $field['raw_html'] ) && $field['raw_html'] == true ) {
$field['type'] = "raw";
$field['content'] = $field['desc'];
$field['desc'] = "";
$this->sections[ $k ]['fields'][ $fieldk ] = $field;
} else if ( $field['type'] == "info" ) {
if ( ! isset( $field['full_width'] ) ) {
$field['full_width'] = true;
$this->sections[ $k ]['fields'][ $fieldk ] = $field;
}
}
if ( $field['type'] == "raw" ) {
if ( isset( $field['align'] ) ) {
$field['full_width'] = $field['align'] ? false : true;
unset( $field['align'] );
} else if ( ! isset( $field['full_width'] ) ) {
$field['full_width'] = true;
}
$this->sections[ $k ]['fields'][ $fieldk ] = $field;
}
/**
* filter 'redux/options/{opt_name}/field/{field.id}'
*
* @param array $field field config
*/
$field = apply_filters( "redux/options/{$this->args['opt_name']}/field/{$field['id']}/register", $field );
$this->field_types[ $field['type'] ] = isset ( $this->field_types[ $field['type'] ] ) ? $this->field_types[ $field['type'] ] : array();
$this->field_sections[ $field['type'] ][ $field['id'] ] = $k;
$display = true;
if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) {
if ( isset ( $field['panel'] ) && $field['panel'] == false ) {
$display = false;
}
}
if ( isset ( $field['customizer_only'] ) && $field['customizer_only'] == true ) {
$display = false;
}
if ( isset ( $section['customizer'] ) ) {
$field['customizer'] = $section['customizer'];
$this->sections[ $k ]['fields'][ $fieldk ] = $field;
}
if ( isset ( $field['permissions'] ) ) {
if ( ! current_user_can( $field['permissions'] ) ) {
$data = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : $this->options_defaults[ $field['id'] ];
$this->hidden_perm_fields[ $field['id'] ] = $data;
continue;
}
}
if ( ! isset ( $field['id'] ) ) {
echo 'No field ID is set. ';
print_r( $field );
echo " ";
continue;
}
if ( isset ( $field['type'] ) && $field['type'] == "section" ) {
if ( isset ( $field['indent'] ) && $field['indent'] == true ) {
$sectionIndent = true;
} else {
$sectionIndent = false;
}
}
if ( isset ( $field['type'] ) && $field['type'] == "info" && $sectionIndent ) {
$field['indent'] = $sectionIndent;
}
$th = $this->get_header_html( $field );
$field['name'] = $this->args['opt_name'] . '[' . $field['id'] . ']';
// Set the default value if present
$this->options_defaults[ $field['id'] ] = isset ( $this->options_defaults[ $field['id'] ] ) ? $this->options_defaults[ $field['id'] ] : '';
// Set the defaults to the value if not present
$doUpdate = false;
// Check fields for values in the default parameter
if ( ! isset ( $this->options[ $field['id'] ] ) && isset ( $field['default'] ) ) {
$this->options_defaults[ $field['id'] ] = $this->options[ $field['id'] ] = $field['default'];
$doUpdate = true;
// Check fields that hae no default value, but an options value with settings to
// be saved by default
} elseif ( ! isset ( $this->options[ $field['id'] ] ) && isset ( $field['options'] ) ) {
// If sorter field, check for options as save them as defaults
if ( $field['type'] == 'sorter' || $field['type'] == 'sortable' ) {
$this->options_defaults[ $field['id'] ] = $this->options[ $field['id'] ] = $field['options'];
$doUpdate = true;
}
}
// CORRECT URLS if media URLs are wrong, but attachment IDs are present.
if ( $field['type'] == "media" ) {
if ( isset ( $this->options[ $field['id'] ]['id'] ) && isset ( $this->options[ $field['id'] ]['url'] ) && ! empty ( $this->options[ $field['id'] ]['url'] ) && strpos( $this->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
$data = wp_get_attachment_url( $this->options[ $field['id'] ]['id'] );
if ( isset ( $data ) && ! empty ( $data ) ) {
$this->options[ $field['id'] ]['url'] = $data;
$data = wp_get_attachment_image_src( $this->options[ $field['id'] ]['id'], array(
150,
150
) );
$this->options[ $field['id'] ]['thumbnail'] = $data[0];
$doUpdate = true;
}
}
}
if ( $field['type'] == "background" ) {
if ( isset ( $this->options[ $field['id'] ]['media']['id'] ) && isset ( $this->options[ $field['id'] ]['background-image'] ) && ! empty ( $this->options[ $field['id'] ]['background-image'] ) && strpos( $this->options[ $field['id'] ]['background-image'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
$data = wp_get_attachment_url( $this->options[ $field['id'] ]['media']['id'] );
if ( isset ( $data ) && ! empty ( $data ) ) {
$this->options[ $field['id'] ]['background-image'] = $data;
$data = wp_get_attachment_image_src( $this->options[ $field['id'] ]['media']['id'], array(
150,
150
) );
$this->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
$doUpdate = true;
}
}
}
if ( $field['type'] == "slides" ) {
if ( isset ( $this->options[ $field['id'] ] ) && is_array( $this->options[ $field['id'] ] ) && isset ( $this->options[ $field['id'] ][0]['attachment_id'] ) && isset ( $this->options[ $field['id'] ][0]['image'] ) && ! empty ( $this->options[ $field['id'] ][0]['image'] ) && strpos( $this->options[ $field['id'] ][0]['image'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
foreach ( $this->options[ $field['id'] ] as $key => $val ) {
$data = wp_get_attachment_url( $val['attachment_id'] );
if ( isset ( $data ) && ! empty ( $data ) ) {
$this->options[ $field['id'] ][ $key ]['image'] = $data;
$data = wp_get_attachment_image_src( $val['attachment_id'], array(
150,
150
) );
$this->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
$doUpdate = true;
}
}
}
}
// END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present.
if ( true == $doUpdate && ! isset ( $this->never_save_to_db ) ) {
if ( $this->args['save_defaults'] ) { // Only save that to the DB if allowed to
$runUpdate = true;
}
// elseif($this->saved != '' && $this->saved != false) {
// $runUpdate = true;
//}
}
if ( ! isset ( $field['class'] ) ) { // No errors please
$field['class'] = "";
}
$id = $field['id'];
/**
* filter 'redux-field-{field.id}modifier-{opt_name}'
*
* @deprecated
*
* @param array $field field config
*/
$field = apply_filters( "redux-field-{$field['id']}modifier-{$this->args['opt_name']}", $field ); // REMOVE LATER
/**
* filter 'redux/options/{opt_name}/field/{field.id}'
*
* @param array $field field config
*/
$field = apply_filters( "redux/options/{$this->args['opt_name']}/field/{$field['id']}", $field );
if ( empty ( $field ) || ! $field || $field == false ) {
unset ( $this->sections[ $k ]['fields'][ $fieldk ] );
continue;
}
if ( ! empty ( $this->folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default
$field['class'] .= " fold";
}
if ( ! empty ( $this->folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on
$field['class'] .= " foldParent";
}
if ( ! empty ( $field['compiler'] ) ) {
$field['class'] .= " compiler";
$this->compiler_fields[ $field['id'] ] = 1;
}
if ( isset ( $field['unit'] ) && ! isset ( $field['units'] ) ) {
$field['units'] = $field['unit'];
unset ( $field['unit'] );
}
$this->sections[ $k ]['fields'][ $fieldk ] = $field;
if ( isset ( $this->args['display_source'] ) ) {
$th .= '' . var_export( $this->sections[ $k ]['fields'][ $fieldk ], true ) . ' ';
$th .= 'View Source ';
}
/**
* action 'redux/options/{opt_name}/field/field.type}/register'
*/
do_action( "redux/options/{$this->args['opt_name']}/field/{$field['type']}/register", $field );
$this->check_dependencies( $field );
$this->field_head[ $field['id'] ] = $th;
if ( ! $display || isset ( $this->no_panel_section[ $k ] ) ) {
$this->no_panel[] = $field['id'];
} else {
if ( isset ( $field['hidden'] ) && $field['hidden'] ) {
$field['label_for'] = 'redux_hide_field';
}
if ( $this->args['options_api'] == true ) {
add_settings_field(
"{$fieldk}_field", $th, array(
&$this,
'_field_input'
), "{$this->args['opt_name']}{$k}_section_group", "{$this->args['opt_name']}{$k}_section", $field
);
}
}
}
}
}
/**
* action 'redux-register-settings-{opt_name}'
*
* @deprecated
*/
do_action( "redux-register-settings-{$this->args['opt_name']}" ); // REMOVE
/**
* action 'redux/options/{opt_name}/register'
*
* @param array option sections
*/
do_action( "redux/options/{$this->args['opt_name']}/register", $this->sections );
if ( $runUpdate && ! isset ( $this->never_save_to_db ) ) { // Always update the DB with new fields
$this->set_options( $this->options );
}
if ( isset ( $this->transients['run_compiler'] ) && $this->transients['run_compiler'] ) {
$this->no_output = true;
$this->_enqueue_output();
/**
* action 'redux-compiler-{opt_name}'
*
* @deprecated
*
* @param array options
* @param string CSS that get sent to the compiler hook
*/
do_action( "redux-compiler-{$this->args['opt_name']}", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); // REMOVE
/**
* action 'redux/options/{opt_name}a'
*
* @param array options
* @param string CSS that get sent to the compiler hook
*/
do_action( "redux/options/{$this->args['opt_name']}/compiler", $this->options, $this->compilerCSS, $this->transients['changed_values'] );
/**
* action 'redux/options/{opt_name}/compiler/advanced'
*
* @param array options
* @param string CSS that get sent to the compiler hook, which sends the full Redux object
*/
do_action( "redux/options/{$this->args['opt_name']}/compiler/advanced", $this );
unset ( $this->transients['run_compiler'] );
$this->set_transients();
}
}
// _register_settings()
/**
* Register Extensions for use
*
* @since 3.0.0
* @access public
* @return void
*/
private function _register_extensions() {
$path = dirname( __FILE__ ) . '/inc/extensions/';
$folders = scandir( $path, 1 );
/**
* action 'redux/extensions/before'
*
* @param object $this ReduxFramework
*/
do_action( "redux/extensions/before", $this );
/**
* action 'redux/extensions/{opt_name}/before'
*
* @param object $this ReduxFramework
*/
do_action( "redux/extensions/{$this->args['opt_name']}/before", $this );
if ( isset( $this->old_opt_name ) ) {
do_action( "redux/extensions/{$this->old_opt_name}/before", $this );
}
foreach ( $folders as $folder ) {
if ( $folder === '.' || $folder === '..' || ! is_dir( $path . $folder ) || substr( $folder, 0, 1 ) === '.' || substr( $folder, 0, 1 ) === '@' || substr( $folder, 0, 4 ) === '_vti' ) {
continue;
}
$extension_class = 'ReduxFramework_Extension_' . $folder;
/**
* filter 'redux-extensionclass-load'
*
* @deprecated
*
* @param string extension class file path
* @param string $extension_class extension class name
*/
$class_file = apply_filters( "redux-extensionclass-load", "$path/$folder/extension_{$folder}.php", $extension_class ); // REMOVE LATER
/**
* filter 'redux/extension/{opt_name}/{folder}'
*
* @param string extension class file path
* @param string $extension_class extension class name
*/
$class_file = apply_filters( "redux/extension/{$this->args['opt_name']}/$folder", "$path/$folder/extension_{$folder}.php", $class_file );
if ( $class_file ) {
if ( file_exists( $class_file ) ) {
require_once $class_file;
$this->extensions[ $folder ] = new $extension_class ( $this );
}
}
}
/**
* action 'redux-register-extensions-{opt_name}'
*
* @deprecated
*
* @param object $this ReduxFramework
*/
do_action( "redux-register-extensions-{$this->args['opt_name']}", $this ); // REMOVE
/**
* action 'redux/extensions/{opt_name}'
*
* @param object $this ReduxFramework
*/
do_action( "redux/extensions/{$this->args['opt_name']}", $this );
if ( isset( $this->old_opt_name ) && ! empty( $this->old_opt_name ) ) {
do_action( "redux/extensions/{$this->old_opt_name}", $this );
}
}
private function get_transients() {
if ( ! isset ( $this->transients ) ) {
$this->transients = get_option( $this->args['opt_name'] . '-transients', array() );
$this->transients_check = $this->transients;
}
}
public function set_transients() {
if ( ! isset ( $this->transients ) || ! isset ( $this->transients_check ) || $this->transients != $this->transients_check ) {
update_option( $this->args['opt_name'] . '-transients', $this->transients );
$this->transients_check = $this->transients;
}
}
/**
* Validate the Options options before insertion
*
* @since 3.0.0
* @access public
*
* @param array $plugin_options The options array
*
* @return array|mixed|string|void
*/
public function _validate_options( $plugin_options ) {
//print_r($plugin_options);
// exit();
if ( isset ( $this->validation_ran ) ) {
return $plugin_options;
}
$this->validation_ran = 1;
// Save the values not in the panel
if ( isset ( $plugin_options['redux-no_panel'] ) ) {
$keys = explode( '|', $plugin_options['redux-no_panel'] );
foreach ( $keys as $key ) {
$plugin_options[ $key ] = $this->options[ $key ];
}
if ( isset ( $plugin_options['redux-no_panel'] ) ) {
unset ( $plugin_options['redux-no_panel'] );
}
}
if ( ! empty ( $this->hidden_perm_fields ) && is_array( $this->hidden_perm_fields ) ) {
foreach ( $this->hidden_perm_fields as $id => $data ) {
$plugin_options[ $id ] = $data;
}
}
if ( $plugin_options == $this->options ) {
return $plugin_options;
}
$time = time();
// Sets last saved time
$this->transients['last_save'] = $time;
// Import
if ( ( isset( $plugin_options['import_code'] ) && ! empty( $plugin_options['import_code'] ) ) || ( isset( $plugin_options['import_link'] ) && ! empty( $plugin_options['import_link'] ) ) ) {
$this->transients['last_save_mode'] = "import"; // Last save mode
$this->transients['last_compiler'] = $time;
$this->transients['last_import'] = $time;
$this->transients['run_compiler'] = 1;
if ( $plugin_options['import_code'] != '' ) {
$import = $plugin_options['import_code'];
} elseif ( $plugin_options['import_link'] != '' ) {
$import = wp_remote_retrieve_body( wp_remote_get( $plugin_options['import_link'] ) );
}
if ( ! empty ( $import ) ) {
$imported_options = json_decode( $import, true );
}
if ( ! empty ( $imported_options ) && is_array( $imported_options ) && isset ( $imported_options['redux-backup'] ) && $imported_options['redux-backup'] == '1' ) {
$this->transients['changed_values'] = array();
foreach ( $plugin_options as $key => $value ) {
if ( isset ( $imported_options[ $key ] ) && $imported_options[ $key ] != $value ) {
$this->transients['changed_values'][ $key ] = $value;
$plugin_options[ $key ] = $value;
}
}
/**
* action 'redux/options/{opt_name}/import'
*
* @param &array [&$plugin_options, redux_options]
*/
do_action_ref_array( "redux/options/{$this->args['opt_name']}/import", array(
&$plugin_options,
$imported_options,
$this->transients['changed_values']
) );
setcookie( 'redux_current_tab', '', 1, '/', $time + 1000, "/" );
$_COOKIE['redux_current_tab'] = 1;
unset ( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
if ( $this->args['database'] == 'transient' || $this->args['database'] == 'theme_mods' || $this->args['database'] == 'theme_mods_expanded' || $this->args['database'] == 'network' ) {
$this->set_options( $plugin_options );
return;
}
$plugin_options = wp_parse_args( $imported_options, $plugin_options );
$this->set_transients(); // Update the transients
return $plugin_options;
}
}
// Reset all to defaults
if ( ! empty ( $plugin_options['defaults'] ) ) {
if ( empty ( $this->options_defaults ) ) {
$this->options_defaults = $this->_default_values();
}
/**
* apply_filters 'redux/validate/{opt_name}/defaults'
*
* @param &array [ $this->options_defaults, $plugin_options]
*/
$plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/defaults", $this->options_defaults );
$this->transients['changed_values'] = array();
if ( empty ( $this->options ) ) {
$this->options = $this->options_defaults;
}
foreach ( $this->options as $key => $value ) {
if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) {
$this->transients['changed_values'][ $key ] = $value;
}
}
$this->transients['run_compiler'] = 1;
$this->transients['last_save_mode'] = "defaults"; // Last save mode
//setcookie('redux-compiler-' . $this->args['opt_name'], 1, time() + 1000, "/");
//setcookie("redux-saved-{$this->args['opt_name']}", 'defaults', time() + 1000, "/");
$this->set_transients(); // Update the transients
return $plugin_options;
}
// Section reset to defaults
if ( ! empty ( $plugin_options['defaults-section'] ) ) {
if ( isset ( $plugin_options['redux-section'] ) && isset ( $this->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
/**
* apply_filters 'redux/validate/{opt_name}/defaults_section'
*
* @param &array [ $this->options_defaults, $plugin_options]
*/
foreach ( $this->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
if ( isset ( $this->options_defaults[ $field['id'] ] ) ) {
$plugin_options[ $field['id'] ] = $this->options_defaults[ $field['id'] ];
} else {
$plugin_options[ $field['id'] ] = "";
}
if ( isset ( $field['compiler'] ) ) {
$compiler = true;
}
}
$plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/defaults_section", $plugin_options );
}
$this->transients['changed_values'] = array();
foreach ( $this->options as $key => $value ) {
if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) {
$this->transients['changed_values'][ $key ] = $value;
}
}
if ( isset ( $compiler ) ) {
//$this->run_compiler = true;
//setcookie('redux-compiler-' . $this->args['opt_name'], 1, time()+1000, '/');
//$plugin_options['REDUX_COMPILER'] = time();
$this->transients['last_compiler'] = $time;
$this->transients['run_compiler'] = 1;
}
$this->transients['last_save_mode'] = "defaults_section"; // Last save mode
//setcookie("redux-saved-{$this->args['opt_name']}", 'defaults_section', time() + 1000, "/");
unset ( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
$this->set_transients();
return $plugin_options;
}
// if ($this->transients['last_save_mode'] != 'remove') {
$this->transients['last_save_mode'] = "normal"; // Last save mode
// } else {
// $this->transients['last_save_mode'] = '';
// }
/**
* apply_filters 'redux/validate/{opt_name}/before_validation'
*
* @param &array [&$plugin_options, redux_options]
*/
$plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/before_validation", $plugin_options, $this->options );
// Validate fields (if needed)
$plugin_options = $this->_validate_values( $plugin_options, $this->options, $this->sections );
if ( ! empty ( $this->errors ) || ! empty ( $this->warnings ) ) {
$this->transients['notices'] = array( 'errors' => $this->errors, 'warnings' => $this->warnings );
}
/**
* action 'redux-validate-{opt_name}'
*
* @deprecated
*
* @param &array [&$plugin_options, redux_options]
*/
do_action_ref_array( "redux-validate-{$this->args['opt_name']}", array(
&$plugin_options,
$this->options
) ); // REMOVE
if ( ! isset ( $this->transients['changed_values'] ) ) {
$this->transients['changed_values'] = array();
}
/**
* action 'redux/options/{opt_name}/validate'
*
* @param &array [&$plugin_options, redux_options]
*/
do_action_ref_array( "redux/options/{$this->args['opt_name']}/validate", array(
&$plugin_options,
$this->options,
$this->transients['changed_values']
) );
if ( ! empty ( $plugin_options['compiler'] ) ) {
unset ( $plugin_options['compiler'] );
$this->transients['last_compiler'] = $time;
$this->transients['run_compiler'] = 1;
}
$this->transients['changed_values'] = array(); // Changed values since last save
foreach ( $this->options as $key => $value ) {
if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) {
$this->transients['changed_values'][ $key ] = $value;
}
}
unset ( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
if ( $this->args['database'] == 'transient' || $this->args['database'] == 'theme_mods' || $this->args['database'] == 'theme_mods_expanded' ) {
$this->set_options( $plugin_options );
return;
}
if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) {
//echo "here";
$w3_inst = w3_instance( 'W3_ObjectCache' );
$w3 = $w3_inst->instance();
$key = $w3->_get_cache_key( $this->args['opt_name'] . '-transients', 'transient' );
//echo $key;
$w3->delete( $key, 'transient', true );
//set_transient($this->args['opt_name'].'-transients', $this->transients);
//exit();
}
$this->set_transients( $this->transients );
return $plugin_options;
}
public function ajax_save() {
if ( ! wp_verify_nonce( $_REQUEST['nonce'], "redux_ajax_nonce" . $this->args['opt_name'] ) ) {
echo json_encode( array(
'status' => __( 'Invalid security credential. Please reload the page and try again.', 'virtue' ),
'action' => ''
) );
die();
}
if ( ! current_user_can( $this->args['page_permissions'] ) ) {
echo json_encode( array(
'status' => __( 'Invalid user capability. Please reload the page and try again.', 'virtue' ),
'action' => ''
) );
die();
}
$redux = ReduxFrameworkInstances::get_instance( $_POST['opt_name'] );
if ( ! empty ( $_POST['data'] ) && ! empty ( $redux->args['opt_name'] ) ) {
$values = array();
//if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
// $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
// while (list($key, $val) = each($process)) {
// foreach ($val as $k => $v) {
// unset($process[$key][$k]);
// if (is_array($v)) {
// $process[$key][stripslashes($k)] = $v;
// $process[] = &$process[$key][stripslashes($k)];
// } else {
// $process[$key][stripslashes($k)] = stripslashes($v);
// }
// }
// }
// unset($process);
//}
$_POST['data'] = stripslashes( $_POST['data'] );
// Old method of saving, in case we need to go back! - kp
//parse_str( $_POST['data'], $values );
// New method to avoid input_var nonesense. Thanks @harunbasic
$values = $this->redux_parse_str( $_POST['data'] );
$values = $values[ $redux->args['opt_name'] ];
if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
$values = array_map( 'stripslashes_deep', $values );
}
if ( ! empty ( $values ) ) {
try {
if ( isset ( $redux->validation_ran ) ) {
unset ( $redux->validation_ran );
}
$redux->set_options( $redux->_validate_options( $values ) );
$do_reload = false;
if ( isset( $this->reload_fields ) && ! empty( $this->reload_fields ) ) {
if ( ! empty( $this->transients['changed_values'] ) ) {
foreach ( $this->reload_fields as $idx => $val ) {
if ( array_key_exists( $val, $this->transients['changed_values'] ) ) {
$do_reload = true;
}
}
}
}
if ( $do_reload || ( isset ( $values['defaults'] ) && ! empty ( $values['defaults'] ) ) || ( isset ( $values['defaults-section'] ) && ! empty ( $values['defaults-section'] ) ) ) {
echo json_encode( array( 'status' => 'success', 'action' => 'reload' ) );
die ();
}
require_once 'core/enqueue.php';
$enqueue = new reduxCoreEnqueue ( $redux );
$enqueue->get_warnings_and_errors_array();
$return_array = array(
'status' => 'success',
'options' => $redux->options,
'errors' => isset ( $redux->localize_data['errors'] ) ? $redux->localize_data['errors'] : null,
'warnings' => isset ( $redux->localize_data['warnings'] ) ? $redux->localize_data['warnings'] : null,
);
} catch ( Exception $e ) {
$return_array = array( 'status' => $e->getMessage() );
}
} else {
echo json_encode( array( 'status' => __( 'Your panel has no fields. Nothing to save.', 'virtue' ) ) );
}
}
if ( isset ( $this->transients['run_compiler'] ) && $this->transients['run_compiler'] ) {
$this->no_output = true;
$this->_enqueue_output();
try {
/**
* action 'redux-compiler-{opt_name}'
*
* @deprecated
*
* @param array options
* @param string CSS that get sent to the compiler hook
*/
do_action( "redux-compiler-{$this->args['opt_name']}", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); // REMOVE
/**
* action 'redux/options/{opt_name}/compiler'
*
* @param array options
* @param string CSS that get sent to the compiler hook
*/
do_action( "redux/options/{$this->args['opt_name']}/compiler", $this->options, $this->compilerCSS, $this->transients['changed_values'] );
/**
* action 'redux/options/{opt_name}/compiler/advanced'
*
* @param array options
* @param string CSS that get sent to the compiler hook, which sends the full Redux object
*/
do_action( "redux/options/{$this->args['opt_name']}/compiler/advanced", $this );
} catch ( Exception $e ) {
$return_array = array( 'status' => $e->getMessage() );
}
unset ( $this->transients['run_compiler'] );
$this->set_transients();
}
if ( isset( $return_array ) ) {
if ( $return_array['status'] == "success" ) {
require_once 'core/panel.php';
$panel = new reduxCorePanel ( $redux );
ob_start();
$panel->notification_bar();
$notification_bar = ob_get_contents();
ob_end_clean();
$return_array['notification_bar'] = $notification_bar;
}
echo json_encode( apply_filters( "redux/options/{$this->args['opt_name']}/ajax_save/response", $return_array ) );
}
die ();
}
/**
* Validate values from options form (used in settings api validate function)
* calls the custom validation class for the field so authors can override with custom classes
*
* @since 1.0.0
* @access public
*
* @param array $plugin_options
* @param array $options
*
* @return array $plugin_options
*/
public function _validate_values( $plugin_options, $options, $sections ) {
foreach ( $sections as $k => $section ) {
if ( isset ( $section['fields'] ) ) {
foreach ( $section['fields'] as $fkey => $field ) {
if ( is_array( $field ) ) {
$field['section_id'] = $k;
}
if ( isset ( $field['type'] ) && ( $field['type'] == 'checkbox' || $field['type'] == 'checkbox_hide_below' || $field['type'] == 'checkbox_hide_all' ) ) {
if ( ! isset ( $plugin_options[ $field['id'] ] ) ) {
$plugin_options[ $field['id'] ] = 0;
}
}
// Default 'not_empty 'flag to false.
$isNotEmpty = false;
// Make sure 'validate' field is set.
if ( isset ( $field['validate'] ) ) {
// Make sure 'validate field' is set to 'not_empty' or 'email_not_empty'
//if ( $field['validate'] == 'not_empty' || $field['validate'] == 'email_not_empty' || $field['validate'] == 'numeric_not_empty' ) {
if ( strtolower( substr( $field['validate'], - 9 ) ) == 'not_empty' ) {
// Set the flag.
$isNotEmpty = true;
}
}
// Check for empty id value
if ( ! isset ( $field['id'] ) || ! isset ( $plugin_options[ $field['id'] ] ) || ( isset ( $plugin_options[ $field['id'] ] ) && $plugin_options[ $field['id'] ] == '' ) ) {
// If we are looking for an empty value, in the case of 'not_empty'
// then we need to keep processing.
if ( ! $isNotEmpty ) {
// Empty id and not checking for 'not_empty. Bail out...
continue;
}
}
// Force validate of custom field types
if ( isset ( $field['type'] ) && ! isset ( $field['validate'] ) && ! isset( $field['validate_callback'] ) ) {
if ( $field['type'] == 'color' || $field['type'] == 'color_gradient' ) {
$field['validate'] = 'color';
} elseif ( $field['type'] == 'date' ) {
$field['validate'] = 'date';
}
}
if ( isset ( $field['validate'] ) ) {
$validate = 'Redux_Validation_' . $field['validate'];
if ( ! class_exists( $validate ) ) {
/**
* filter 'redux-validateclass-load'
*
* @deprecated
*
* @param string validation class file path
* @param string $validate validation class name
*/
$class_file = apply_filters( "redux-validateclass-load", self::$_dir . "inc/validation/{$field['validate']}/validation_{$field['validate']}.php", $validate ); // REMOVE LATER
/**
* filter 'redux/validate/{opt_name}/class/{field.validate}'
*
* @param string validation class file path
* @param string $class_file validation class file path
*/
$class_file = apply_filters( "redux/validate/{$this->args['opt_name']}/class/{$field['validate']}", self::$_dir . "inc/validation/{$field['validate']}/validation_{$field['validate']}.php", $class_file );
if ( $class_file ) {
if ( file_exists( $class_file ) ) {
require_once $class_file;
}
}
}
if ( class_exists( $validate ) ) {
//!DOVY - DB saving stuff. Is this right?
if ( empty ( $options[ $field['id'] ] ) ) {
$options[ $field['id'] ] = '';
}
if ( isset ( $plugin_options[ $field['id'] ] ) && is_array( $plugin_options[ $field['id'] ] ) && ! empty ( $plugin_options[ $field['id'] ] ) ) {
foreach ( $plugin_options[ $field['id'] ] as $key => $value ) {
$before = $after = null;
if ( isset ( $plugin_options[ $field['id'] ][ $key ] ) && ( ! empty ( $plugin_options[ $field['id'] ][ $key ] ) || $plugin_options[ $field['id'] ][ $key ] == '0' ) ) {
if ( is_array( $plugin_options[ $field['id'] ][ $key ] ) ) {
$before = $plugin_options[ $field['id'] ][ $key ];
} else {
$before = trim( $plugin_options[ $field['id'] ][ $key ] );
}
}
if ( isset ( $options[ $field['id'] ][ $key ] ) && ( ! empty ( $plugin_options[ $field['id'] ][ $key ] ) || $plugin_options[ $field['id'] ][ $key ] == '0' ) ) {
$after = $options[ $field['id'] ][ $key ];
}
$validation = new $validate ( $this, $field, $before, $after );
if ( ! empty ( $validation->value ) || $validation->value == '0' ) {
$plugin_options[ $field['id'] ][ $key ] = $validation->value;
} else {
unset ( $plugin_options[ $field['id'] ][ $key ] );
}
if ( isset ( $validation->error ) ) {
$this->errors[] = $validation->error;
}
if ( isset ( $validation->warning ) ) {
$this->warnings[] = $validation->warning;
}
}
} else {
if ( is_array( $plugin_options[ $field['id'] ] ) ) {
$pofi = $plugin_options[ $field['id'] ];
} else {
$pofi = trim( $plugin_options[ $field['id'] ] );
}
$validation = new $validate ( $this, $field, $pofi, $options[ $field['id'] ] );
$plugin_options[ $field['id'] ] = $validation->value;
if ( isset ( $validation->error ) ) {
$this->errors[] = $validation->error;
}
if ( isset ( $validation->warning ) ) {
$this->warnings[] = $validation->warning;
}
}
continue;
}
}
if ( isset ( $field['validate_callback'] ) && ( is_callable( $field['validate_callback'] ) || ( is_string( $field['validate_callback'] ) && function_exists( $field['validate_callback'] ) ) ) ) {
$callback = $field['validate_callback'];
unset ( $field['validate_callback'] );
$callbackvalues = call_user_func( $callback, $field, $plugin_options[ $field['id'] ], $options[ $field['id'] ] );
$plugin_options[ $field['id'] ] = $callbackvalues['value'];
if ( isset ( $callbackvalues['error'] ) ) {
$this->errors[] = $callbackvalues['error'];
}
// TODO - This warning message is failing. Hmm.
if ( isset ( $callbackvalues['warning'] ) ) {
$this->warnings[] = $callbackvalues['warning'];
}
}
}
}
}
return $plugin_options;
}
/**
* Return Section Menu HTML
*
* @since 3.1.5
* @access public
* @return void
*/
public function section_menu( $k, $section, $suffix = "", $sections = array() ) {
$display = true;
$section['class'] = isset ( $section['class'] ) ? ' ' . $section['class'] : '';
if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) {
if ( isset ( $section['panel'] ) && $section['panel'] == false ) {
$display = false;
}
}
if ( ! $display ) {
return "";
}
if ( empty ( $sections ) ) {
$sections = $this->sections;
}
$string = "";
if ( ( ( isset ( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) || ( isset ( $section['icon_type'] ) && $section['icon_type'] == 'image' ) ) || ( isset( $section['icon'] ) && strpos( $section['icon'], '/' ) !== false ) ) {
//if( !empty( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) {
$icon = ( ! isset ( $section['icon'] ) ) ? '' : ' ';
} else {
if ( ! empty ( $section['icon_class'] ) ) {
$icon_class = ' ' . $section['icon_class'];
} elseif ( ! empty ( $this->args['default_icon_class'] ) ) {
$icon_class = ' ' . $this->args['default_icon_class'];
} else {
$icon_class = '';
}
$icon = ( ! isset ( $section['icon'] ) ) ? ' ' : ' ';
}
if ( strpos( $icon, 'el-icon-' ) !== false ) {
$icon = str_replace( 'el-icon-', 'el el-', $icon );
}
$hide_section = '';
if ( isset ( $section['hidden'] ) ) {
$hide_section = ( $section['hidden'] == true ) ? ' hidden ' : '';
}
$canBeSubSection = ( $k > 0 && ( ! isset ( $sections[ ( $k ) ]['type'] ) || $sections[ ( $k ) ]['type'] != "divide" ) ) ? true : false;
if ( ! $canBeSubSection && isset ( $section['subsection'] ) && $section['subsection'] == true ) {
unset ( $section['subsection'] );
}
if ( isset ( $section['type'] ) && $section['type'] == "divide" ) {
$string .= ' ';
} else if ( ! isset ( $section['subsection'] ) || $section['subsection'] != true ) {
// DOVY! REPLACE $k with $section['ID'] when used properly.
//$active = ( ( is_numeric($this->current_tab) && $this->current_tab == $k ) || ( !is_numeric($this->current_tab) && $this->current_tab === $k ) ) ? ' active' : '';
$subsections = ( isset ( $sections[ ( $k + 1 ) ] ) && isset ( $sections[ ( $k + 1 ) ]['subsection'] ) && $sections[ ( $k + 1 ) ]['subsection'] == true ) ? true : false;
$subsectionsClass = $subsections ? ' hasSubSections' : '';
$subsectionsClass .= ( ! isset ( $section['fields'] ) || empty ( $section['fields'] ) ) ? ' empty_section' : '';
$extra_icon = $subsections ? '' : '';
$string .= '';
$string .= '' . $extra_icon . $icon . '' . wp_kses_post( $section['title'] ) . ' ';
$nextK = $k;
// Make sure you can make this a subsection
if ( $subsections ) {
$string .= '';
$doLoop = true;
while ( $doLoop ) {
$nextK += 1;
$display = true;
if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) {
if ( isset ( $sections[ $nextK ]['panel'] ) && $sections[ $nextK ]['panel'] == false ) {
$display = false;
}
}
if ( count( $sections ) < $nextK || ! isset ( $sections[ $nextK ] ) || ! isset ( $sections[ $nextK ]['subsection'] ) || $sections[ $nextK ]['subsection'] != true ) {
$doLoop = false;
} else {
if ( ! $display ) {
continue;
}
$hide_sub = '';
if ( isset ( $sections[ $nextK ]['hidden'] ) ) {
$hide_sub = ( $sections[ $nextK ]['hidden'] == true ) ? ' hidden ' : '';
}
if ( ( isset ( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) || ( isset ( $sections[ $nextK ]['icon_type'] ) && $sections[ $nextK ]['icon_type'] == 'image' ) ) {
//if( !empty( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) {
$icon = ( ! isset ( $sections[ $nextK ]['icon'] ) ) ? '' : ' ';
} else {
if ( ! empty ( $sections[ $nextK ]['icon_class'] ) ) {
$icon_class = ' ' . $sections[ $nextK ]['icon_class'];
} elseif ( ! empty ( $this->args['default_icon_class'] ) ) {
$icon_class = ' ' . $this->args['default_icon_class'];
} else {
$icon_class = '';
}
$icon = ( ! isset ( $sections[ $nextK ]['icon'] ) ) ? '' : ' ';
}
if ( strpos( $icon, 'el-icon-' ) !== false ) {
$icon = str_replace( 'el-icon-', 'el el-', $icon );
}
$section[ $nextK ]['class'] = isset ( $section[ $nextK ]['class'] ) ? $section[ $nextK ]['class'] : '';
$string .= '';
$string .= '' . $icon . '' . wp_kses_post( $sections[ $nextK ]['title'] ) . ' ';
$string .= ' ';
}
}
$string .= ' ';
}
$string .= ' ';
}
return $string;
}
// section_menu()
/**
* HTML OUTPUT.
*
* @since 1.0.0
* @access public
* @return void
*/
public function generate_panel() {
require_once 'core/panel.php';
$panel = new reduxCorePanel ( $this );
$panel->init();
$this->set_transients();
}
/**
* Section HTML OUTPUT.
*
* @since 1.0.0
* @access public
*
* @param array $section
*
* @return void
*/
public function _section_desc( $section ) {
$id = trim( rtrim( $section['id'], '_section' ), $this->args['opt_name'] );
if ( isset ( $this->sections[ $id ]['desc'] ) && ! empty ( $this->sections[ $id ]['desc'] ) ) {
echo '' . $this->sections[ $id ]['desc'] . '
';
}
}
/**
* Field HTML OUTPUT.
* Gets option from options array, then calls the specific field type class - allows extending by other devs
*
* @since 1.0.0
*
* @param array $field
* @param string $v
*
* @return void
*/
public function _field_input( $field, $v = null ) {
if ( isset ( $field['callback'] ) && ( is_callable( $field['callback'] ) || ( is_string( $field['callback'] ) && function_exists( $field['callback'] ) ) ) ) {
$value = ( isset ( $this->options[ $field['id'] ] ) ) ? $this->options[ $field['id'] ] : '';
/**
* action 'redux-before-field-{opt_name}'
*
* @deprecated
*
* @param array $field field data
* @param string $value field.id
*/
do_action( "redux-before-field-{$this->args['opt_name']}", $field, $value ); // REMOVE
/**
* action 'redux/field/{opt_name}/{field.type}/callback/before'
*
* @param array $field field data
* @param string $value field.id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/callback/before", array(
&$field,
&$value
) );
/**
* action 'redux/field/{opt_name}/callback/before'
*
* @param array $field field data
* @param string $value field.id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/callback/before", array(
&$field,
&$value
) );
call_user_func( $field['callback'], $field, $value );
/**
* action 'redux-after-field-{opt_name}'
*
* @deprecated
*
* @param array $field field data
* @param string $value field.id
*/
do_action( "redux-after-field-{$this->args['opt_name']}", $field, $value ); // REMOVE
/**
* action 'redux/field/{opt_name}/{field.type}/callback/after'
*
* @param array $field field data
* @param string $value field.id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/callback/after", array(
&$field,
&$value
) );
/**
* action 'redux/field/{opt_name}/callback/after'
*
* @param array $field field data
* @param string $value field.id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/callback/after", array(
&$field,
&$value
) );
return;
}
if ( isset ( $field['type'] ) ) {
// If the field is set not to display in the panel
$display = true;
if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) {
if ( isset ( $field['panel'] ) && $field['panel'] == false ) {
$display = false;
}
}
if ( ! $display ) {
return;
}
$field_class = "ReduxFramework_{$field['type']}";
if ( ! class_exists( $field_class ) ) {
// $class_file = apply_filters( 'redux/field/class/'.$field['type'], self::$_dir . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field ); // REMOVE
/**
* filter 'redux/{opt_name}/field/class/{field.type}'
*
* @param string field class file path
* @param array $field field data
*/
$class_file = apply_filters( "redux/{$this->args['opt_name']}/field/class/{$field['type']}", self::$_dir . "inc/fields/{$field['type']}/field_{$field['type']}.php", $field );
if ( $class_file ) {
if ( file_exists( $class_file ) ) {
require_once $class_file;
}
}
}
if ( class_exists( $field_class ) ) {
$value = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : '';
if ( $v !== null ) {
$value = $v;
}
/**
* action 'redux-before-field-{opt_name}'
*
* @deprecated
*
* @param array $field field data
* @param string $value field id
*/
do_action( "redux-before-field-{$this->args['opt_name']}", $field, $value ); // REMOVE
/**
* action 'redux/field/{opt_name}/{field.type}/render/before'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/render/before", array(
&$field,
&$value
) );
/**
* action 'redux/field/{$this->args['opt_name']}/render/before'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/render/before", array(
&$field,
&$value
) );
if ( ! isset ( $field['name_suffix'] ) ) {
$field['name_suffix'] = "";
}
$render = new $field_class ( $field, $value, $this );
ob_start();
$render->render();
/*
echo "";
print_r($value);
echo " ";
*/
/**
* filter 'redux-field-{opt_name}'
*
* @deprecated
*
* @param string rendered field markup
* @param array $field field data
*/
$_render = apply_filters( "redux-field-{$this->args['opt_name']}", ob_get_contents(), $field ); // REMOVE
/**
* filter 'redux/field/{opt_name}/{field.type}/render/after'
*
* @param string rendered field markup
* @param array $field field data
*/
$_render = apply_filters( "redux/field/{$this->args['opt_name']}/{$field['type']}/render/after", $_render, $field );
/**
* filter 'redux/field/{opt_name}/render/after'
*
* @param string rendered field markup
* @param array $field field data
*/
$_render = apply_filters( "redux/field/{$this->args['opt_name']}/render/after", $_render, $field );
ob_end_clean();
//save the values into a unique array in case we need it for dependencies
$this->fieldsValues[ $field['id'] ] = ( isset ( $value['url'] ) && is_array( $value ) ) ? $value['url'] : $value;
//create default data und class string and checks the dependencies of an object
$class_string = '';
$data_string = '';
$this->check_dependencies( $field );
/**
* action 'redux/field/{opt_name}/{field.type}/fieldset/before/{opt_name}'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/fieldset/before/{$this->args['opt_name']}", array(
&$field,
&$value
) );
/**
* action 'redux/field/{opt_name}/fieldset/before/{opt_name}'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/fieldset/before/{$this->args['opt_name']}", array(
&$field,
&$value
) );
//if ( ! isset( $field['fields'] ) || empty( $field['fields'] ) ) {
$hidden = '';
if ( isset ( $field['hidden'] ) && $field['hidden'] ) {
$hidden = 'hidden ';
}
if ( isset( $field['full_width'] ) && $field['full_width'] == true ) {
$class_string .= "redux_remove_th";
}
if ( isset ( $field['fieldset_class'] ) && ! empty( $field['fieldset_class'] ) ) {
$class_string .= ' ' . $field['fieldset_class'];
}
echo '';
//}
echo $_render;
if ( ! empty ( $field['desc'] ) ) {
$field['description'] = $field['desc'];
}
echo ( isset ( $field['description'] ) && $field['type'] != "info" && $field['type'] !== "section" && ! empty ( $field['description'] ) ) ? '' . $field['description'] . '
' : '';
//if ( ! isset( $field['fields'] ) || empty( $field['fields'] ) ) {
echo ' ';
//}
/**
* action 'redux-after-field-{opt_name}'
*
* @deprecated
*
* @param array $field field data
* @param string $value field id
*/
do_action( "redux-after-field-{$this->args['opt_name']}", $field, $value ); // REMOVE
/**
* action 'redux/field/{opt_name}/{field.type}/fieldset/after/{opt_name}'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/fieldset/after/{$this->args['opt_name']}", array(
&$field,
&$value
) );
/**
* action 'redux/field/{opt_name}/fieldset/after/{opt_name}'
*
* @param array $field field data
* @param string $value field id
*/
do_action_ref_array( "redux/field/{$this->args['opt_name']}/fieldset/after/{$this->args['opt_name']}", array(
&$field,
&$value
) );
}
}
}
// _field_input()
/**
* Can Output CSS
* Check if a field meets its requirements before outputting to CSS
*
* @param $field
*
* @return bool
*/
public function _can_output_css( $field ) {
$return = true;
$field = apply_filters( "redux/field/{$this->args['opt_name']}/_can_output_css", $field );
if ( isset ( $field['force_output'] ) && $field['force_output'] == true ) {
return $return;
}
if ( ! empty ( $field['required'] ) ) {
if ( isset ( $field['required'][0] ) ) {
if ( ! is_array( $field['required'][0] ) && count( $field['required'] ) == 3 ) {
$parentValue = $GLOBALS[ $this->args['global_variable'] ][ $field['required'][0] ];
$checkValue = $field['required'][2];
$operation = $field['required'][1];
$return = $this->compareValueDependencies( $parentValue, $checkValue, $operation );
} else if ( is_array( $field['required'][0] ) ) {
foreach ( $field['required'] as $required ) {
if ( ! is_array( $required[0] ) && count( $required ) == 3 ) {
$parentValue = $GLOBALS[ $this->args['global_variable'] ][ $required[0] ];
$checkValue = $required[2];
$operation = $required[1];
$return = $this->compareValueDependencies( $parentValue, $checkValue, $operation );
}
if ( ! $return ) {
return $return;
}
}
}
}
}
return $return;
}
// _can_output_css
/**
* Checks dependencies between objects based on the $field['required'] array
* If the array is set it needs to have exactly 3 entries.
* The first entry describes which field should be monitored by the current field. eg: "content"
* The second entry describes the comparison parameter. eg: "equals, not, is_larger, is_smaller ,contains"
* The third entry describes the value that we are comparing against.
* Example: if the required array is set to array('content','equals','Hello World'); then the current
* field will only be displayed if the field with id "content" has exactly the value "Hello World"
*
* @param array $field
*
* @return array $params
*/
public function check_dependencies( $field ) {
//$params = array('data_string' => "", 'class_string' => "");
if ( isset( $field['ajax_save'] ) && $field['ajax_save'] == false ) {
$this->reload_fields[] = $field['id'];
}
if ( ! empty ( $field['required'] ) ) {
if ( ! isset ( $this->required_child[ $field['id'] ] ) ) {
$this->required_child[ $field['id'] ] = array();
}
if ( ! isset ( $this->required[ $field['id'] ] ) ) {
$this->required[ $field['id'] ] = array();
}
if ( is_array( $field['required'][0] ) ) {
foreach ( $field['required'] as $value ) {
if ( is_array( $value ) && count( $value ) == 3 ) {
$data = array();
$data['parent'] = $value[0];
$data['operation'] = $value[1];
$data['checkValue'] = $value[2];
$this->required[ $data['parent'] ][ $field['id'] ][] = $data;
if ( ! in_array( $data['parent'], $this->required_child[ $field['id'] ] ) ) {
$this->required_child[ $field['id'] ][] = $data;
}
$this->checkRequiredDependencies( $field, $data );
}
}
} else {
$data = array();
$data['parent'] = $field['required'][0];
$data['operation'] = $field['required'][1];
$data['checkValue'] = $field['required'][2];
$this->required[ $data['parent'] ][ $field['id'] ][] = $data;
if ( ! in_array( $data['parent'], $this->required_child[ $field['id'] ] ) ) {
$this->required_child[ $field['id'] ][] = $data;
}
$this->checkRequiredDependencies( $field, $data );
}
}
//return $params;
}
// Compare data for required field
private function compareValueDependencies( $parentValue, $checkValue, $operation ) {
$return = false;
switch ( $operation ) {
case '=':
case 'equals':
$data['operation'] = "=";
if ( is_array( $parentValue ) ) {
foreach ( $parentValue as $idx => $val ) {
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $i => $v ) {
if ( $val == $v ) {
$return = true;
}
}
} else {
if ( $val == $checkValue ) {
$return = true;
}
}
}
} else {
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $i => $v ) {
if ( $parentValue == $v ) {
$return = true;
}
}
} else {
if ( $parentValue == $checkValue ) {
$return = true;
}
}
}
break;
case '!=':
case 'not':
$data['operation'] = "!==";
if ( is_array( $parentValue ) ) {
foreach ( $parentValue as $idx => $val ) {
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $i => $v ) {
if ( $val != $v ) {
$return = true;
}
}
} else {
if ( $val != $checkValue ) {
$return = true;
}
}
}
} else {
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $i => $v ) {
if ( $parentValue != $v ) {
$return = true;
}
}
} else {
if ( $parentValue != $checkValue ) {
$return = true;
}
}
}
// if ( is_array( $checkValue ) ) {
// if ( ! in_array( $parentValue, $checkValue ) ) {
// $return = true;
// }
// } else {
// if ( $parentValue != $checkValue ) {
// $return = true;
// } else if ( is_array( $parentValue ) ) {
// if ( ! in_array( $checkValue, $parentValue ) ) {
// $return = true;
// }
// }
// }
break;
case '>':
case 'greater':
case 'is_larger':
$data['operation'] = ">";
if ( $parentValue > $checkValue ) {
$return = true;
}
break;
case '>=':
case 'greater_equal':
case 'is_larger_equal':
$data['operation'] = ">=";
if ( $parentValue >= $checkValue ) {
$return = true;
}
break;
case '<':
case 'less':
case 'is_smaller':
$data['operation'] = "<";
if ( $parentValue < $checkValue ) {
$return = true;
}
break;
case '<=':
case 'less_equal':
case 'is_smaller_equal':
$data['operation'] = "<=";
if ( $parentValue <= $checkValue ) {
$return = true;
}
break;
case 'contains':
if ( is_array( $parentValue ) ) {
$parentValue = implode( ',', $parentValue );
}
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $idx => $opt ) {
if ( strpos( $parentValue, (string) $opt ) !== false ) {
$return = true;
}
}
} else {
if ( strpos( $parentValue, (string) $checkValue ) !== false ) {
$return = true;
}
}
break;
case 'doesnt_contain':
case 'not_contain':
if ( is_array( $parentValue ) ) {
$parentValue = implode( ',', $parentValue );
}
if ( is_array( $checkValue ) ) {
foreach ( $checkValue as $idx => $opt ) {
if ( strpos( $parentValue, (string) $opt ) === false ) {
$return = true;
}
}
} else {
if ( strpos( $parentValue, (string) $checkValue ) === false ) {
$return = true;
}
}
break;
case 'is_empty_or':
if ( empty ( $parentValue ) || $parentValue == $checkValue ) {
$return = true;
}
break;
case 'not_empty_and':
if ( ! empty ( $parentValue ) && $parentValue != $checkValue ) {
$return = true;
}
break;
case 'is_empty':
case 'empty':
case '!isset':
if ( empty ( $parentValue ) || $parentValue == "" || $parentValue == null ) {
$return = true;
}
break;
case 'not_empty':
case '!empty':
case 'isset':
if ( ! empty ( $parentValue ) && $parentValue != "" && $parentValue != null ) {
$return = true;
}
break;
}
return $return;
}
private function checkRequiredDependencies( $field, $data ) {
//required field must not be hidden. otherwise hide this one by default
if ( ! in_array( $data['parent'], $this->fieldsHidden ) && ( ! isset ( $this->folds[ $field['id'] ] ) || $this->folds[ $field['id'] ] != "hide" ) ) {
if ( isset ( $this->options[ $data['parent'] ] ) ) {
$return = $this->compareValueDependencies( $this->options[ $data['parent'] ], $data['checkValue'], $data['operation'] );
//$return = $this->compareValueDependencies( $data['parent'], $data['checkValue'], $data['operation'] );
}
}
if ( ( isset ( $return ) && $return ) && ( ! isset ( $this->folds[ $field['id'] ] ) || $this->folds[ $field['id'] ] != "hide" ) ) {
$this->folds[ $field['id'] ] = "show";
} else {
$this->folds[ $field['id'] ] = "hide";
if ( ! in_array( $field['id'], $this->fieldsHidden ) ) {
$this->fieldsHidden[] = $field['id'];
}
}
}
/**
* converts an array into a html data string
*
* @param array $data example input: array('id'=>'true')
*
* @return string $data_string example output: data-id='true'
*/
public function create_data_string( $data = array() ) {
$data_string = "";
foreach ( $data as $key => $value ) {
if ( is_array( $value ) ) {
$value = implode( "|", $value );
}
$data_string .= " data-$key='$value' ";
}
return $data_string;
}
/**
* Parses the string into variables without the max_input_vars limitation.
*
* @since 3.5.7.11
* @author harunbasic
* @access public
*
* @param string $string
*
* @return array $result
*/
function redux_parse_str( $string ) {
if ( '' == $string ) {
return false;
}
$result = array();
$pairs = explode( '&', $string );
foreach ( $pairs as $key => $pair ) {
// use the original parse_str() on each element
parse_str( $pair, $params );
$k = key( $params );
if ( ! isset( $result[ $k ] ) ) {
$result += $params;
} else {
$result[ $k ] = $this->redux_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
*
* @since 3.5.7.11
* @author harunbasic
* @access public
*
* @param array $array1
* @param array $array2
*
* @return array $merged
*/
function redux_array_merge_recursive_distinct( array $array1, array $array2 ) {
$merged = $array1;
foreach ( $array2 as $key => $value ) {
if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) {
$merged[ $key ] = $this->redux_array_merge_recursive_distinct( $merged[ $key ], $value );
} else if ( is_numeric( $key ) && isset( $merged[ $key ] ) ) {
$merged[] = $value;
} else {
$merged[ $key ] = $value;
}
}
return $merged;
}
private function change_demo_defaults() {
if ( $this->args['dev_mode'] == true || Redux_Helpers::isLocalHost() == true ) {
if ( ! empty( $this->args['admin_bar_links'] ) ) {
foreach ( $this->args['admin_bar_links'] as $idx => $arr ) {
if ( is_array( $arr ) && ! empty( $arr ) ) {
foreach ( $arr as $x => $y ) {
if ( strpos( strtolower( $y ), 'redux' ) !== false ) {
$msg = __( 'Redux Framework Notice: There are references to the Redux Framework support site in your config\'s admin_bar_links
argument. This is sample data. Please change or remove this data before shipping your product.', 'virtue' );
$this->display_arg_change_notice( 'admin', $msg );
$this->omit_admin_items = true;
continue;
}
}
}
}
}
if ( ! empty( $this->args['share_icons'] ) ) {
foreach ( $this->args['share_icons'] as $idx => $arr ) {
if ( is_array( $arr ) && ! empty( $arr ) ) {
foreach ( $arr as $x => $y ) {
if ( strpos( strtolower( $y ), 'redux' ) !== false ) {
$msg = __( 'Redux Framework Notice: There are references to the Redux Framework support site in your config\'s share_icons
argument. This is sample data. Please change or remove this data before shipping your product.', 'virtue' );
$this->display_arg_change_notice( 'share', $msg );
$this->omit_share_icons = true;
}
}
}
}
}
}
}
private function display_arg_change_notice( $mode, $msg = '' ) {
if ( $mode == 'admin' ) {
if ( ! $this->omit_admin_items ) {
$this->admin_notices[] = array(
'type' => 'error',
'msg' => $msg,
'id' => 'admin_config',
'dismiss' => true,
);
}
}
if ( $mode == 'share' ) {
if ( ! $this->omit_share_icons ) {
$this->admin_notices[] = array(
'type' => 'error',
'msg' => $msg,
'id' => 'share_config',
'dismiss' => true,
);
}
}
}
}
// ReduxFramework
/**
* action 'redux/init'
*
* @param null
*/
do_action( 'redux/init', ReduxFramework::init() );
} // class_exists('ReduxFramework')