Files
2026-10-29 15:24:15 +03:30

66 lines
2.5 KiB
PHP

<?php
/**
* Nav walker that renders a WordPress menu with the design's markup:
* top-level items with children become a <button class="nav__toggle"> + a
* <ul class="nav__submenu">; everything else is a plain link.
*/
defined( 'ABSPATH' ) || exit;
class Hoho_Nav_Walker extends Walker_Nav_Menu {
private $submenu_id = '';
public function start_lvl( &$output, $depth = 0, $args = null ) {
$output .= '<ul class="nav__submenu" id="' . esc_attr( $this->submenu_id ) . '">';
}
public function end_lvl( &$output, $depth = 0, $args = null ) {
$output .= '</ul>';
}
public function start_el( &$output, $item, $depth = 0, $args = null, $id = 0 ) {
$title = apply_filters( 'the_title', $item->title, $item->ID );
$url = ! empty( $item->url ) ? $item->url : '#';
if ( 0 === $depth ) {
$has_children = ! empty( $args->has_children );
if ( $has_children ) {
$this->submenu_id = 'hoho-sub-' . (int) $item->ID;
$output .= '<li class="nav__item--has-menu">';
$output .= '<button class="nav__link nav__toggle" type="button" aria-expanded="false" aria-controls="' . esc_attr( $this->submenu_id ) . '">';
$output .= '<span>' . esc_html( $title ) . '</span>';
$output .= '<svg class="icon icon--chevron" aria-hidden="true"><use href="#i-chevron"></use></svg>';
$output .= '</button>';
} else {
$output .= '<li><a class="nav__link" href="' . esc_url( $url ) . '">' . esc_html( $title ) . '</a>';
}
} else {
$output .= '<li><a href="' . esc_url( $url ) . '">' . esc_html( $title ) . '</a>';
}
}
public function end_el( &$output, $item, $depth = 0, $args = null ) {
$output .= '</li>';
}
}
/**
* Fallback nav when no menu is assigned to the "HoHo — Header Menu" location,
* so the header is never empty. Links Home + the tours archive.
*/
function hoho_nav_fallback() {
$archive = get_post_type_archive_link( 'viator_tour' );
$archive = $archive ? $archive : home_url( '/' );
echo '<ul class="nav__list">';
echo '<li><a class="nav__link" href="' . esc_url( home_url( '/' ) ) . '">' . esc_html__( 'Home', 'hoponhopoff' ) . '</a></li>';
echo '<li><a class="nav__link" href="' . esc_url( $archive ) . '">' . esc_html__( 'Tours', 'hoponhopoff' ) . '</a></li>';
// Regions + cities from the Viator Collector structure, when active.
if ( class_exists( 'VC_Menu' ) ) {
$items = VC_Menu::items();
if ( $items ) {
echo walk_nav_menu_tree( $items, 2, (object) array( 'walker' => new Hoho_Nav_Walker() ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
}
echo '</ul>';
}