Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Find a TOP parent menu object according to the current page viewed
<?php
/**
* Menu Inspector
*
* Find a TOP parent menu object according to the current page viewed
*
* @package MenuLocator
* @author Enrique Chavez <noone@tmeister.net>
* @license GPL-2.0+
* @link http://enriquechavez.co
* @copyright 2014
*
* @wordpress-plugin
* Plugin Name: Menu Parent Locator
* Plugin URI: http://enriquechavez.co
* Description: Find a TOP parent menu object according to the current page viewed
* Version: 1.0.0
* Author: Enrique Chavez
* Author URI: http://enriquechavez.co
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
*/
Class Menu_Inspector
{
// variable para almacenar el ultimo menu padre
var $parent_menu;
/**
* Inicializamos la clase, tomando los objectos del menu
*/
function __construct()
{
add_filter('wp_nav_menu_objects', array( &$this, 'menu_inspector' )) ;
}
/**
* Tomamos los objectos del menu, y los parseamos para encontrar el padre de la pagina actual.
*/
function menu_inspector( $sorted_menu_items, $a = null )
{
global $ml_current_parent_menu;
/**
* ESTE ES EL NOMBRE DEL MENU DONDE BUSCAREMOS LAS COINCIDENCIAS
* Este se configura en el theme y el apartado de Menus en el Admin
*/
$menu_name = 'primary';
$locations = get_nav_menu_locations();
/**
* Obtenemos los items del menu
*/
if( $locations && $locations[$menu_name] )
{
$menu_items = wp_get_nav_menu_items( $locations[ $menu_name ] );
}else{
wp_die('No se encuentra el menu ' . $menu_name);
}
/**
* Recorremos los menus buscando el "current" y a partir del ID buscamos si tiene padre
*/
foreach ( $sorted_menu_items as $item )
{
if( $item->current ){
$this->parent_menu = $item->ID;
$this->get_parent_menu( $menu_items, $item->ID );
}
}
/**
* Al llegar a este punto, $this->parent_menu contiene el ID del menu padre
* Hacemos un ultimo foreach para buscar el objecto del menu de acuerdo al ID
*/
foreach ($sorted_menu_items as $item) {
if( $item ->ID == $this->parent_menu)
{
/**
* Aqui Ya tenemos el Objecto del menu y lo colocamos en una variable Global para
* poder accesarlo desde los templates
*/
//echo "El menu padre es " . $item->title;
//echo "<br>El TIpo de objeto es " . $item->object; //Page, Category, etc
//echo "<br>El ID del objeto es " . $item->object_id; //El ID
//var_dump($item);
$ml_current_parent_menu = $item;
}
}
/**
* Regresamos los menus para que se pueda crear la vista.
*/
return $sorted_menu_items;
}
/**
* Funcion recursiva para encontrar el padre inicial de cualquier menu a cualquier nivel
*/
function get_parent_menu( $menu_items, $itemID )
{
foreach ($menu_items as $menu_item)
{
if( $menu_item->ID == $itemID )
{
if( $menu_item->menu_item_parent )
{
$this->parent_menu = $menu_item->menu_item_parent;
$this->get_parent_menu( $menu_items, $this->parent_menu );
}
}
}
return $this->parent_menu;
}
}
new Menu_Inspector();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.