JezK
Edit File: helper-conditional-megamenu.php
<?php /** * Must be activated with * * add_theme_support( 'avia_conditionals_for_mega_menu' ); * * * @since ????? */ if( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly if( ! class_exists( 'avia_conditional_mega_menu', false ) ) { add_filter( 'avf_mega_menu_post_meta_fields', 'avia_save_conditional_menu_options', 10, 3 ); function avia_save_conditional_menu_options( $check, $menu_id, $menu_item_db ) { $check = array_merge( $check, array( 'conditional' ) ); return $check; } /** * This class helps the user to hide/show menu items of the mega menu by using conditionals */ class avia_conditional_mega_menu { /** * @since ???? */ public function __construct() { add_action( 'admin_enqueue_scripts', array( $this, 'load_script' ) ); add_action( 'init', array( $this, 'add_conditionals_to_config' ) ); add_action( 'avia_mega_menu_option_fields', array( $this, 'output_conditional_menu_options' ), 10, 4 ); add_filter( 'wp_nav_menu_objects', array( $this, 'apply_conditional_rules' ), 10, 1 ); } /** * @since ???? */ public function __destruct() { } /** * @since ???? * @param string $hook * @return void */ public function load_script( $hook ) { if( $hook != 'nav-menus.php' ) { return; } $vn = avia_get_theme_version(); $min_js = avia_minify_extension( 'js' ); wp_register_script( 'avia-conditional-mega-menu', AVIA_JS_URL . "conditional_load/avia_conditional_mega_menu{$min_js}.js", array( 'jquery' ), $vn, true ); wp_enqueue_script( 'avia-conditional-mega-menu' ); } /** * @since ???? */ public function add_conditionals_to_config() { global $avia_config; /* * Add predefined conditions to the mega menu options * Use the avf_avia_menu_conditions filter to remove or add new conditions */ $avia_config['menu_conditions'] = array( 'is_user_logged_in' => array( 'title' => __( 'User is logged in', 'avia_framework' ) ), 'avia_is_user_logged_out' => array( 'title' => __( 'User is logged out', 'avia_framework' ) ), 'avia_condition_admin' => array( 'title' => __( 'User is Admin', 'avia_framework' ) ), 'avia_condition_editor' => array( 'title' => __( 'User is Editor', 'avia_framework' ) ), 'avia_condition_subscriber' => array( 'title' => __( 'User is Subscriber', 'avia_framework' ) ), 'avia_condition_author' => array( 'title' => __( 'User is Author', 'avia_framework' ) ), 'avia_condition_contributor' => array( 'title' => __( 'User is Contributor', 'avia_framework' ) ), 'is_front_page' => array( 'title' => __( 'Front Page', 'avia_framework' ) ), 'is_single' => array( 'title' => __( 'Single Post', 'avia_framework' ), 'supports_id' => true ), 'is_page' => array( 'title' => __( 'Page', 'avia_framework' ), 'supports_id' => true ) ); $avia_config['menu_conditions'] = apply_filters( 'avf_avia_menu_conditions', $avia_config['menu_conditions'] ); } /** * @since ???? * @param WP_Post $item * @return array */ protected function get_menu_item_settings( $item ) { $conditional_logic = get_post_meta( $item->ID, '_menu-item-avia-conditional', false ); if( is_array( $conditional_logic ) && ! empty( $conditional_logic[0] ) ) { $conditional_logic = $conditional_logic[0]; } else { $conditional_logic = array(); } return $conditional_logic; } /** * @since ???? * @param type $output * @param type $item * @param type $depth * @param type $args */ public function output_conditional_menu_options( $output, $item, $depth, $args ) { global $avia_config; if( ! empty( $avia_config['menu_conditions'] ) && is_array( $avia_config['menu_conditions'] ) ) { $item_id = $item->ID; $key = 'menu-item-avia-conditional'; $value = $this->get_menu_item_settings( $item ); $value['enableconditionallogic'] = ! empty($value['enableconditionallogic']) ? 'checked="checked"' : ''; if( empty( $value['conditional'] ) ) { $value['conditional'] = ''; } if( empty( $value['conditionalid'] ) ) { $value['conditionalid'] = ''; } if( empty( $value['conditionalcss'] ) ) { $value['conditionalcss'] = ''; } if( empty( $value['conditionalvalue'] ) ) { $value['conditionalvalue'] = ''; } ?> <!-- *************** start conditional logic input fields *************** --> <p class="description description-wide avia_conditional_checkbox"> <label for="edit-<?php echo 'menu-item-avia-enableconditionallogic-' . $item_id; ?>"> <input type="checkbox" value="active" id="edit-<?php echo 'menu-item-avia-enableconditionallogic-' . $item_id; ?>" class="menu-item-avia-enableconditionallogic" name="<?php echo $key . "[" . $item_id . "][enableconditionallogic]";?>" <?php echo $value['enableconditionallogic']; ?> /><label><?php _e('Enable Conditional Logic', 'avia_framework'); ?></label> </label> </p> <div class="avia_conditional_logic_field"> <p class="description description-wide"> <select id="edit-<?php echo 'menu-item-avia-conditional-' . $item_id; ?>" class="menu-item-avia-conditional" name="<?php echo $key . "[" . $item_id . "][conditional]"; ?>"> <option <?php selected( 'show', $value['conditional'] ) ?> value="show" class="hide_css_field"><?php _e( 'Show', 'avia_framework' ) ?></option> <option <?php selected( 'hide', $value['conditional'] ) ?> value="hide" class="hide_css_field"><?php _e( 'Hide', 'avia_framework' ) ?></option> <option <?php selected( 'css', $value['conditional'] ) ?> value="css" class="show_css_field"><?php _e( 'Add custom css class', 'avia_framework' ) ?></option> </select> <?php _e( 'if', 'avia_framework' ); ?> <select id="edit-<?php echo 'menu-item-avia-conditional-' . $item_id; ?>" class="menu-item-avia-conditionalvalue" name="<?php echo $key . "[" . $item_id ."][conditionalvalue]"; ?>"> <?php foreach( $avia_config['menu_conditions'] as $condition => $content ): ?> <?php $class = ! empty($content['supports_id'] ) ? 'show_id_field' : 'hide_id_field'; ?> <option <?php selected( $condition, $value['conditionalvalue'] ) ?> class="<?php echo $class; ?>" value="<?php echo $condition; ?>"><?php echo $content['title']; ?></option> <?php endforeach ?> </select> </p> <p class="description description-wide menu-item-avia-conditionalid"> <label for="edit-<?php echo 'menu-item-avia-conditionalid-' . $item_id; ?>"> <?php _e( 'Page/Post ID', 'avia_framework' ); ?><br /> <input type="text" id="edit-<?php echo 'menu-item-avia-conditionalid-' . $item_id; ?>" name="<?php echo $key . "[" . $item_id ."][conditionalid]";?>" value="<?php echo $value['conditionalid']; ?>" /> </label> </p> <p class="description description-wide menu-item-avia-conditionalcss"> <label for="edit-<?php echo 'menu-item-avia-conditionalcss-' . $item_id; ?>"> <?php _e( 'Conditional CSS Class', 'avia_framework' ); ?><br /> <input type="text" id="edit-<?php echo 'menu-item-avia-conditionalcss-' . $item_id; ?>" name="<?php echo $key . "[" . $item_id ."][conditionalcss]";?>" value="<?php echo $value['conditionalcss']; ?>" /> </label> </p> <?php } ?> </div> <!-- *************** end conditional logic input fields *************** --> <?php } /** * @since ???? * @param array $items * @return array */ public function apply_conditional_rules( $items ) { global $avia_config; $hidden_items = array(); foreach( $items as $key => $item ) { $show = true; $conditional_logic = $this->get_menu_item_settings( $item ); /* check if parent item is hidden. If yes we must hide the submenu item too */ if( empty( $conditional_logic['enableconditionallogic'] ) && ! empty( $hidden_items ) ) { if( in_array( $item->menu_item_parent, $hidden_items ) ) { $show = false; } } if( ! empty( $conditional_logic['enableconditionallogic'] ) && ! empty( $avia_config['menu_conditions'] ) && is_array( $avia_config['menu_conditions'] ) ) { $condition_type = ! empty( $conditional_logic['conditional'] ) ? $conditional_logic['conditional'] : ''; $condition = ! empty( $conditional_logic['conditionalvalue'] ) ? $conditional_logic['conditionalvalue'] : ''; $conditionalid = ! empty( $conditional_logic['conditionalid'] ) ? $conditional_logic['conditionalid'] : ''; if( function_exists( $condition ) ) { if( ! empty( $avia_config['menu_conditions'][ $condition ]['supports_id'] ) ) { if( $conditionalid ) { $condition_result = call_user_func( $condition, $conditionalid ); } else { $condition_result = call_user_func( $condition ); } } else { $condition_result = call_user_func( $condition ); } if( $condition_type == 'hide' && $condition_result ) { $show = false; } if( $condition_type == 'show' && !$condition_result ) { $show = false; } if( $condition_type == 'css' && $condition_result ) { if( ! empty( $conditional_logic['conditionalcss'] ) ) { $item->classes[] = $conditional_logic['conditionalcss']; } } } } if( ! $show ) { $hidden_items[] = $item->ID; unset( $items[ $key ] ); } } return $items; } } } new avia_conditional_mega_menu(); /* * some predefined conditional functions * * @since ???? */ if( ! function_exists( 'avia_is_user_logged_out' ) ) { function avia_is_user_logged_out() { if( ! is_user_logged_in() ) { return true; } return false; } } if( ! function_exists( 'avia_condition_admin' ) ) { function avia_condition_admin() { global $current_user; if( is_user_logged_in() ) { return in_array( 'administrator', $current_user->roles ); } return false; } } if( ! function_exists( 'avia_condition_editor' ) ) { function avia_condition_editor() { global $current_user; if( is_user_logged_in() ) { foreach( array( 'administrator', 'editor' ) as $role ) { if( in_array( $role, $current_user->roles ) ) { return true; } } } return false; } } if( ! function_exists( 'avia_condition_author' ) ) { function avia_condition_author() { global $current_user; if( is_user_logged_in() ) { foreach( array( 'administrator', 'editor', 'author' ) as $role ) { if( in_array( $role, $current_user->roles ) ) { return true; } } } return false; } } if( ! function_exists( 'avia_condition_contributor' ) ) { function avia_condition_contributor() { global $current_user; if( is_user_logged_in() ) { foreach( array( 'administrator', 'editor', 'author', 'contributor' ) as $role ) { if( in_array( $role, $current_user->roles ) ) { return true; } } } return false; } } if( ! function_exists( 'avia_condition_subscriber' ) ) { function avia_condition_subscriber() { global $current_user; if( is_user_logged_in() ) { foreach( array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ) as $role ) { if( in_array( $role, $current_user->roles ) ) { return true; } } } return false; } }