quadmenu/lib/frontend/walker/class-quadmenu-walker.php
2025-01-20 16:38:41 +05:30

156 lines
4.9 KiB
PHP

<?php
namespace QuadLayers\QuadMenu\Frontend\Walker;
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
/**
* QuadMenuWalker Class
*/
class QuadMenu_Walker extends \Walker_Nav_Menu {
var $item_stack = array();
var $current_umitem;
var $auto_child = '';
function __construct() {
}
function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
if ( ! $element ) {
return;
}
$id_field = $this->db_fields['id'];
$has_children = ! empty( $children_elements[ $element->{$id_field} ] );
if ( isset( $args[0] ) && is_array( $args[0] ) ) {
$args[0]['has_children'] = $has_children;
}
$cb_args = array_merge( array( &$output, $element, $depth ), $args );
$id = $element->{$id_field}; // Moved up
$umitem_obect_class = apply_filters( 'quadmenu_item_object_class', '\\QuadLayers\\QuadMenu\\Frontend\\Walker\\QuadMenu_Item_Default', $element, $id, $this->auto_child );
if ( ! class_exists( $umitem_obect_class ) ) {
$umitem_obect_class = '\\QuadLayers\\QuadMenu\\Frontend\\Walker\\QuadMenu_Item_Default';
}
$umitem = new $umitem_obect_class( $output, $element, $depth, $cb_args[3], $id, $this, $has_children, $children_elements ); // The $args that get passed to start_el are $cb[3] -- i.e. the 4the element in the array merged above
$this->push_item( $umitem );
call_user_func_array( array( $this, 'start_el' ), $cb_args );
// descend only when the depth is right and there are childrens for this element
if ( ( $max_depth == 0 || $max_depth > $depth + 1 ) && isset( $children_elements[ $id ] ) ) {
foreach ( $children_elements[ $id ] as $child ) {
if ( ! isset( $newlevel ) ) {
$newlevel = true;
// start the child delimiter
$cb_args = array_merge( array( &$output, $depth ), $args );
call_user_func_array( array( $this, 'start_lvl' ), $cb_args );
}
$this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
}
// Unset this item's children elements
unset( $children_elements[ $id ] ); // TODO!!!
}
if ( isset( $newlevel ) && $newlevel ) {
// end the child delimiter
$cb_args = array_merge( array( &$output, $depth ), $args );
call_user_func_array( array( $this, 'end_lvl' ), $cb_args );
}
$cb_args = array_merge( array( &$output, $element, $depth ), $args );
call_user_func_array( array( $this, 'end_el' ), $cb_args );
}
function start_lvl( &$output, $depth = 0, $args = array() ) {
// $indent = str_repeat("\t", $depth);
$this->current_umitem->start_lvl();
}
function end_lvl( &$output, $depth = 0, $args = array() ) {
// $indent = str_repeat("\t", $depth);
$this->current_umitem->end_lvl();
}
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
$this->current_umitem->start_el();
}
function end_el( &$output, $item, $depth = 0, $args = array() ) {
$this->current_umitem->end_el();
$this->pop_item();
}
function push_item( $umitem ) {
$this->item_stack[] = $umitem;
$this->current_umitem = $umitem;
}
function pop_item() {
$umitem = array_pop( $this->item_stack );
$this->current_umitem = $this->current_item();
}
function current_item() {
return end( $this->item_stack );
}
public static function fallback( $args ) {
global $_wp_registered_nav_menus;
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
extract( $args );
ob_start();
?>
<li class="quadmenu-item quadmenu-item-object-custom quadmenu-item-level-0 quadmenu-item-type-default quadmenu-has-title quadmenu-has-icon quadmenu-has-link">
<a title="<?php printf( esc_html__( 'Add a menu to %1$s', 'quadmenu' ), $_wp_registered_nav_menus[ $theme_location ] ); ?>" href="<?php echo admin_url( 'nav-menus.php' ); ?>">
<span class="quadmenu-item-content">
<span class="quadmenu-text"><?php printf( esc_html__( 'Add a menu to %1$s', 'quadmenu' ), $_wp_registered_nav_menus[ $theme_location ] ); ?></span>
</span>
</a>
</li>
<li class="quadmenu-item quadmenu-item-object-custom quadmenu-item-level-0 quadmenu-item-type-default quadmenu-has-title quadmenu-has-icon quadmenu-has-link">
<a title="<?php esc_html_e( 'Documentation', 'quadmenu' ); ?>" href="<?php echo esc_url( QUADMENU_DOCUMENTATION_URL ); ?>">
<span class="quadmenu-item-content">
<span class="quadmenu-text"><?php esc_html_e( 'Documentation', 'quadmenu' ); ?></span>
</span>
</a>
</li>
<li class="quadmenu-item quadmenu-item-object-custom quadmenu-item-level-0 quadmenu-item-type-default quadmenu-has-title quadmenu-has-icon quadmenu-has-link">
<a title="<?php esc_html_e( 'Demo', 'quadmenu' ); ?>" href="<?php echo esc_url( QUADMENU_DEMO_URL ); ?>">
<span class="quadmenu-item-content">
<span class="quadmenu-text"><?php esc_html_e( 'Demo', 'quadmenu' ); ?></span>
</span>
</a>
</li>
<?php
$menu = ob_get_clean();
$nav_menu = sprintf( $items_wrap, esc_attr( $menu_id ), esc_attr( $menu_class ), $menu );
return quadmenu_layout( $nav_menu, (object) $args );
}
}