186 lines
4.4 KiB
PHP
186 lines
4.4 KiB
PHP
<?php
|
|
/**
|
|
* BasicWP MenuItems Class
|
|
*
|
|
* @package BasicWP
|
|
* @since 1.0.0
|
|
*/
|
|
|
|
namespace BasicWP;
|
|
|
|
/**
|
|
* Class MenuItems
|
|
*
|
|
* This class is responsible for managing menu items within the Basic-WP theme.
|
|
*
|
|
* @package Basic-WP
|
|
* @since 1.0.0
|
|
*/
|
|
class MenuItems {
|
|
/**
|
|
* Accepts menu name to populate navigation items.
|
|
*
|
|
* @var string $displayLocation
|
|
*/
|
|
protected $displayLocation;
|
|
|
|
/**
|
|
* First level menu items (menu_item_parent = 0).
|
|
*
|
|
* @var array $topLevelNavItems
|
|
*/
|
|
public $topLevelNavItems;
|
|
|
|
/**
|
|
* True if nav item has children items.
|
|
*
|
|
* @var bool $hasChildren
|
|
*/
|
|
public $hasChildren;
|
|
|
|
/**
|
|
* Children navigation items.
|
|
*
|
|
* @var array $nestedNavItems
|
|
*/
|
|
public $nestedNavItems;
|
|
|
|
/**
|
|
* True if the current page is the same as the menu item.
|
|
*
|
|
* @var bool $currentPage
|
|
*/
|
|
public $currentPage;
|
|
|
|
/**
|
|
* Constructor method for initializing the class with a specific menu name.
|
|
*
|
|
* @param string $menuName The name of the menu to be used. Defaults to 'main_navigation'.
|
|
*/
|
|
public function __construct( $menuName = 'main_navigation' ) {
|
|
$this->displayLocation = $menuName;
|
|
|
|
$this->topLevelNavItems = $this->getTopLevelNavItems();
|
|
$this->hasChildren = function ( $item ) {
|
|
return $this->hasChildren( $item );
|
|
};
|
|
$this->nestedNavItems = function ( $parentItem ) {
|
|
return $this->getNestedNavItems( $parentItem );
|
|
};
|
|
$this->currentPage = function ( $item ) {
|
|
return $this->currentPage( $item );
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Retrieves the list of menus.
|
|
*
|
|
* @return array An array containing menu items.
|
|
*/
|
|
public function getMenus() {
|
|
$menus = get_nav_menu_locations();
|
|
return empty( $menus ) ? array() : $menus;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the navigation items.
|
|
*
|
|
* @return array An array of navigation items.
|
|
*/
|
|
public function getNavItems() {
|
|
$locations = $this->getMenus();
|
|
|
|
// If the menu location doesn't exist, return empty array
|
|
if ( ! isset( $locations[ $this->displayLocation ] ) ) {
|
|
return array();
|
|
}
|
|
|
|
// Get the menu ID for this location
|
|
$menuId = $locations[ $this->displayLocation ];
|
|
|
|
// Direct call to wp_get_nav_menu_items with the menu ID
|
|
$items = wp_get_nav_menu_items( $menuId );
|
|
|
|
// Return empty array if no items
|
|
return is_array( $items ) ? $items : array();
|
|
}
|
|
|
|
/**
|
|
* Checks if the given parent item has child items.
|
|
*
|
|
* @param mixed $parentItem The parent item to check for children.
|
|
* @return bool Returns true if the parent item has children, false otherwise.
|
|
*/
|
|
public function hasChildren( $parentItem ) {
|
|
foreach ( $this->getNavItems() as $item ) {
|
|
if ( $item->menu_item_parent === strval( $parentItem->ID ) ) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the top-level navigation items.
|
|
*
|
|
* @return array An array of top-level navigation items.
|
|
*/
|
|
public function getTopLevelNavItems() {
|
|
$items = array();
|
|
foreach ( $this->getNavItems() as $item ) {
|
|
if ( $item->menu_item_parent === '0' ) {
|
|
array_push( $items, $item );
|
|
}
|
|
}
|
|
return $items;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the nested navigation items for a given parent item.
|
|
*
|
|
* @param mixed $parentItem The parent navigation item for which nested items are to be retrieved.
|
|
* @return array The list of nested navigation items.
|
|
*/
|
|
public function getNestedNavItems( $parentItem ) {
|
|
$childrenItems = array();
|
|
foreach ( $this->getNavItems() as $item ) {
|
|
if ( $item->menu_item_parent === strval( $parentItem->ID ) ) {
|
|
array_push( $childrenItems, $item );
|
|
}
|
|
}
|
|
return $childrenItems;
|
|
}
|
|
|
|
/**
|
|
* Determines the current page based on the provided item.
|
|
*
|
|
* @param mixed $item The item used to determine the current page.
|
|
* @return mixed The current page information.
|
|
*/
|
|
public function currentPage( $item ) {
|
|
global $wp;
|
|
return ( $item->url === home_url( $wp->request ) . '/' ) ? 'true' : 'false';
|
|
}
|
|
|
|
/**
|
|
* Renders the output for the current context.
|
|
*
|
|
* This method is responsible for generating and returning the
|
|
* appropriate output for the current context or request.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function render() {
|
|
global $views;
|
|
|
|
// Extract class properties to local variables
|
|
$location = $this->displayLocation;
|
|
$topLevelNavItems = $this->topLevelNavItems;
|
|
$hasChildren = $this->hasChildren;
|
|
$nestedNavItems = $this->nestedNavItems;
|
|
$currentPage = $this->currentPage;
|
|
|
|
include $views . '/components/menu-items/index.php';
|
|
}
|
|
}
|