145 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Kadence\Nav_Menus\Component class
 | |
|  *
 | |
|  * @package kadence
 | |
|  */
 | |
| 
 | |
| namespace Kadence\Nav_Menus;
 | |
| 
 | |
| use Kadence\Component_Interface;
 | |
| use Kadence\Templating_Component_Interface;
 | |
| use function Kadence\kadence;
 | |
| use WP_Post;
 | |
| use WP_Query;
 | |
| use function add_action;
 | |
| use function add_filter;
 | |
| use function register_nav_menus;
 | |
| use function has_nav_menu;
 | |
| use function wp_nav_menu;
 | |
| 
 | |
| /**
 | |
|  * Class for adding collapse option to navigation widget.
 | |
|  */
 | |
| class Nav_Widget_Settings {
 | |
| 	/**
 | |
| 	 * Default settings.
 | |
| 	 *
 | |
| 	 * @var array;
 | |
| 	 */
 | |
| 	protected $defaults = array(
 | |
| 		'collapse' => false,
 | |
| 	);
 | |
| 	/**
 | |
| 	 * Default widgets.
 | |
| 	 *
 | |
| 	 * @var array;
 | |
| 	 */
 | |
| 	protected $widgets = array(
 | |
| 		'nav_menu',
 | |
| 	);
 | |
| 	/**
 | |
| 	 * Construct.
 | |
| 	 *
 | |
| 	 * @var array;
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		// Hook in all the right places.
 | |
| 		add_action( 'in_widget_form', array( $this, 'add_settings' ), 10, 3 );
 | |
| 		add_filter( 'widget_update_callback', array( $this, 'save_settings' ), 10, 4 );
 | |
| 		add_filter( 'widget_nav_menu_args', array( $this, 'frontend_settings' ), 10, 4 );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Adds the custom settings to all widgets' forms.
 | |
| 	 *
 | |
| 	 * @param WP_Widget $widget   An instance of a WP_Widget derived subclass.
 | |
| 	 * @param mixed     $return   Return null if new fields are added.
 | |
| 	 * @param array     $instance An array of the widget's settings.
 | |
| 	 */
 | |
| 	public function add_settings( $widget, $return, $instance ) {
 | |
| 		if ( ! $this->is_supported( $widget ) ) {
 | |
| 			return null;
 | |
| 		}
 | |
| 
 | |
| 		// Make sure $instance contains at least our default values.
 | |
| 		$instance = wp_parse_args( $instance, $this->defaults );
 | |
| 		?>
 | |
| 		<p>
 | |
| 			<input type="checkbox" class="checkbox" id="<?php echo esc_attr( $widget->get_field_id( 'collapse' ) ); ?>" name="<?php echo esc_attr( $widget->get_field_name( 'collapse' ) ); ?>"<?php checked( $instance['collapse'] ); ?> />
 | |
| 			<label for="<?php echo esc_attr( $widget->get_field_id( 'collapse' ) ); ?>"><?php esc_html_e( 'Collapse sub menu items', 'kadence' ); ?></label>
 | |
| 		</p>
 | |
| 		<?php
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Saves the custom settings.
 | |
| 	 *
 | |
| 	 * @param array     $instance     The current widget instance's settings.
 | |
| 	 * @param array     $new_instance Array of new widget settings.
 | |
| 	 * @param array     $old_instance Array of old widget settings.
 | |
| 	 * @param WP_Widget $widget       The current widget instance.
 | |
| 	 *
 | |
| 	 * @return array The widget instance's settings to get saved.
 | |
| 	 */
 | |
| 	public function save_settings( $instance, $new_instance, $old_instance, $widget ) {
 | |
| 		if ( ! $this->is_supported( $widget ) ) {
 | |
| 			return $instance;
 | |
| 		}
 | |
| 
 | |
| 		// Make sure $instance contains at least our default values.
 | |
| 		$instance = wp_parse_args( $instance, $this->defaults );
 | |
| 
 | |
| 		// Now check that a value is actually present, and assign it sanitized.
 | |
| 		if ( isset( $new_instance['collapse'] ) ) {
 | |
| 			$instance['collapse'] = ! empty( $new_instance['collapse'] ) ? 1 : 0;
 | |
| 		}
 | |
| 
 | |
| 		return $instance;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the arguments for the Navigation Menu widget.
 | |
| 	 *
 | |
| 	 * @since 4.2.0
 | |
| 	 * @since 4.4.0 Added the `$instance` parameter.
 | |
| 	 *
 | |
| 	 * @param array   $nav_menu_args {
 | |
| 	 *     An array of arguments passed to wp_nav_menu() to retrieve a navigation menu.
 | |
| 	 *
 | |
| 	 *     @type callable|bool $fallback_cb Callback to fire if the menu doesn't exist. Default empty.
 | |
| 	 *     @type mixed         $menu        Menu ID, slug, or name.
 | |
| 	 * }
 | |
| 	 * @param WP_Term $nav_menu      Nav menu object for the current menu.
 | |
| 	 * @param array   $args          Display arguments for the current widget.
 | |
| 	 * @param array   $instance      Array of settings for the current widget.
 | |
| 	 */
 | |
| 	public function frontend_settings( $nav_menu_args, $nav_menu, $args, $instance ) {
 | |
| 		if ( isset( $instance['collapse'] ) && $instance['collapse'] ) {
 | |
| 			$nav_menu_args['show_toggles']    = true;
 | |
| 			$nav_menu_args['container_class'] = 'collapse-sub-navigation';
 | |
| 			$nav_menu_args['menu_class']      = 'menu has-collapse-sub-nav';
 | |
| 			if ( ! isset( $nav_menu_args['menu_id'] ) && isset( $args['widget_id'] ) ) {
 | |
| 				$nav_menu_args['menu_id'] = 'menu-' . $args['widget_id'];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $nav_menu_args;
 | |
| 	}
 | |
| 	/**
 | |
| 	 * Checks to make sure this is only for nav widget.
 | |
| 	 *
 | |
| 	 * @param WP_Widget $widget       The current widget instance.
 | |
| 	 *
 | |
| 	 * @return bool if the right widget.
 | |
| 	 */
 | |
| 	protected function is_supported( $widget ) {
 | |
| 		if ( in_array( $widget->id_base, $this->widgets, true ) ) {
 | |
| 			return true;
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| new Nav_Widget_Settings();
 |