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();
|