__( 'Add a navigation menu to your sidebar.', 'p2020' ), 'customize_selective_refresh' => true, ] ); add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); } public function enqueue_scripts() { if ( is_active_widget( false, false, self::WIDGET_ID_BASE ) || is_active_widget( false, false, 'monster' ) || is_customize_preview() ) { wp_enqueue_script( 'p2020-sidebar-menu-toggler', get_template_directory_uri() . '/widgets/sidebar-menus/js/tree-toggler.js', [ 'jquery' ], filemtime( get_template_directory() . '/widgets/sidebar-menus/js/tree-toggler.js' ), true ); } } /** * Overrides WP_Nav_Menu_Widget::form(). */ public function form( $instance ) { if ( ! isset( $instance['title'] ) ) { $instance['title'] = __( 'Links', 'p2020' ); } // Guard against cases where a WP_Error object was assigned as // during sidebar redesign migration. if ( isset( $instance['nav_menu'] ) && is_wp_error( $instance['nav_menu'] ) ) { $instance['nav_menu'] = ''; } parent::form( $instance ); } /** * Overrides WP_Nav_Menu_Widget::widget(). */ public function widget( $args, $instance ) { if ( empty( $instance['nav_menu'] ) ) { return; } $nav_menu = wp_get_nav_menu_object( $instance['nav_menu'] ); if ( ! $nav_menu ) { return; } // phpcs:disable WordPress.Security.EscapeOutput // Reason: HTML from theme echo $args['before_widget']; echo $this->widget_header( $args, $instance ); echo $this->widget_content( $args, $instance ); echo $args['after_widget']; // phpcs:enable WordPress.Security.EscapeOutput do_action( 'p2_widgets_stats', self::WIDGET_ID_BASE ); } private function widget_header( $args, $instance ) { $simple_menu = null; if ( is_user_member_of_blog() && current_user_can( 'customize' ) ) { global $wp; $current_url = add_query_arg( $wp->query_vars, home_url( $wp->request ) ); $customizer_menu_url = add_query_arg( 'return', rawurlencode( $current_url ), Navigation\Urls::get_customizer_menu_url() ); $simple_menu = new Navigation\Simple_Menu( 'p2020-nav-menu-widget-menu', __( 'More', 'p2020' ) ); $simple_menu->add_item( __( 'Manage Links', 'p2020' ), $customizer_menu_url ); } // phpcs:disable WordPress.Security.EscapeOutput // Reason: HTML from theme echo $args['before_title']; $default_title = __( 'Links', 'p2020' ); $title = apply_filters( 'widget_title', $instance['title'] ?? $default_title ); echo esc_html( $title ); if ( $simple_menu ) { get_template_part( 'partials/ellipsis-menu', $simple_menu->get_type(), [ 'simple_menu' => $simple_menu ], ); } echo $args['after_title']; // phpcs:enable WordPress.Security.EscapeOutput } private function widget_content( $args, $instance ) { self::print_menu( $instance['nav_menu'] ); } public static function print_menu( $nav_menu ) { $options = array( 'fallback_cb' => '', 'menu' => $nav_menu, 'container' => 'nav', 'container_class' => 'p2020-nav-menu', 'menu_class' => 'menu-root', 'menu_id' => '', ); add_filter( 'nav_menu_submenu_css_class', [ __CLASS__, 'collapse_subtrees' ] ); add_filter( 'walker_nav_menu_start_el', [ __CLASS__, 'add_togglers' ] ); wp_nav_menu( $options ); } /** * Filter: nav_menu_submenu_css_class */ public static function collapse_subtrees( $classes ) { $classes[] = 'is-collapsed'; return $classes; } /** * Filter: walker_nav_menu_start_el */ public static function add_togglers( $item_output ) { return << MENU_ITEM; } }