Agregue un elemento de menú personalizado usando el filtro wp_nav_menu_items

8

He agregado un fragmento para agregar un enlace "Perfil" al menú de navegación de mi sitio web. Mi código:

add_filter( 'wp_nav_menu_items', 'my_nav_menu_profile_link');
function my_nav_menu_profile_link($menu) {  
    if (!is_user_logged_in()){
         return $menu;
    } else {
         $user_data = bbp_get_user_profile_url( get_current_user_id() );
         $profilelink = '<li><a href="'.$user_data.'&edit" >Profile</a></li>';
         $menu = $menu . $profilelink;
         return $menu;
    }
}

Este código muestra correctamente el enlace de perfil en mi menú, pero ahora quiero mover este enlace de "perfil" como submenú de otro menú principal.

La estructura de mi menú es la siguiente:

Inicio | Mi cuenta | Categorias

Me gustaría agregar el enlace "perfil" en "Mi cuenta". ¿Alguna sugerencia para resolver este problema?

Hafsal
fuente
Eche un vistazo a codex.wordpress.org/Function_Reference/add_submenu_page
bestprogrammerintheworld
@bestprogrammerintheworld: es para el menú de administración, no para el menú frontal.
Stephen Harris
si desea agregar un elemento de menú sin enlace, pruebe este con la ayuda de js. kvcodes.com/2014/07/…
Kvvaradha

Respuestas:

6

He creado estas dos funciones que puede usar para agregar elementos personalizados a un elemento de menú determinado presente en su menú (página, publicación, enlace ...).

En su caso, puede agregar estas funciones a sus functions.php y llamarlas así:

$menu_name = 'Your Menu Name';
$name_of_menu_item_to_append_to = 'My Account';
$id_of_menu_item_to_append_to =  get_wp_object_id( $name_of_menu_item_to_append_to, 'nav_menu_item' );
$new_submenu_item = array(
    'text' => 'Profile',
    'url'  => 'http://someurl.com'
);

add_subitems_to_menu( 
    $menu_name,
    $id_of_menu_item_to_append_to,
    array( $new_submenu_item ) 
);

add_subitems_to_menu ()

/**
 * Adds custom items to a navigation menu
 * Partially based on: 
 * http://teleogistic.net/2013/02/dynamically-add-items-to-a-wp_nav_menu-list/
 * 
 * @param string    $menu_name          The name or slug of the navigation menu
 * @param int       $parent_object_id   The id of the post/page, which must be present 
 *                                      in the menu, and to which we want to add subitems 
 * @param array     $subitems           The sub-items to be added to the menu, as an
 *                                      array( array( 'text' => 'foo', 'url' => '/bar') )
 */
public function add_subitems_to_menu( $menu_name, $parent_object_id, $subitems ) {
    // Don't add anything in admin area. Otherwise WP will try to display the items in the 
    // Menu editor and it won't work fine and cause strange behaviour
    if ( is_admin() ) {
        return;
    }

    // Use wp_get_nav_menu_items filter, is used by Timber to get WP menu items
    add_filter( 'wp_get_nav_menu_items', function( $items, $menu ) 
            use( $menu_name, $parent_object_id, $subitems ) {

        // If no menu found, just return the items without adding anything
        if ( $menu->name != $menu_name && $menu->slug != $menu_name ) {
            return $items;
        }

        // Find the menu item ID corresponding to the given post/page object ID
        // If no post/page found, the subitems won't have any parent (will be on 1st level)
        $parent_menu_item_id = 0;
        foreach ( $items as $item ) {
            if ( $parent_object_id == $item->object_id ) {
                $parent_menu_item_id = $item->ID;
                break;
            }
        }

        $menu_order = count( $items ) + 1;

        foreach ( $subitems as $subitem ) {
            // Create objects containing all (and only) those properties from WP_Post 
            // used by WP to create a menu item
            $items[] = (object) array(
                'ID'                => $menu_order + 1000000000, // ID that WP won't use
                'title'             => $subitem['text'],
                'url'               => $subitem['url'],
                'menu_item_parent'  => $parent_menu_item_id,
                'menu_order'        => $menu_order,
                // These are not necessary, but PHP warning will be thrown if undefined
                'type'              => '',
                'object'            => '',
                'object_id'         => '',
                'db_id'             => '',
                'classes'           => '',
            );
            $menu_order++;
        }
        return $items;
    }, 10, 2);
}

get_wp_object_id ()

 /**
 * Returns the WordPress ID of any post type or page by its title or name
 * In the case you provide an ID it will "validate" it looking for any post with that ID
 *
 * @param mixed     $post_identifier    The title, name or ID of the post/page
 * @param string    $post_type          The post type to look for (default: page)
 *
 * @return int The ID of the post/page if any, or 0
 */
public function get_wp_object_id( $post_identifier, $post_type = 'page' ) {

    $post_id = 0;

    if ( get_page_by_title( $post_identifier, OBJECT, $post_type ) ) {
        $post_id = get_page_by_title( $post_identifier, OBJECT, $post_type )->ID;
    }
    else if ( get_page_by_path( $post_identifier, OBJECT, $post_type ) ) {
        $post_id = get_page_by_path( $post_identifier, OBJECT, $post_type )->ID;
    }
    else if ( get_post( $post_identifier ) ) {
        $post_id = get_post( $post_identifier )->ID;
    }

    return $post_id;
}
MikO
fuente
Gracias MikO por su ayuda 1. Mi cuenta no es la página, he creado un enlace y lo agregué al menú a través de la configuración del menú de administración de wp 2. Revisé su código creando una nueva página y pasando su id a la función, pero no funcionó para mí 3. He cambiado la línea $ my_account_page_id = en $ my_account_item_id
Hafsal
He agregado todo su código en function.php
Hafsal
Ohh Miko, está funcionando ahora, muchas gracias por el código. Pero en lugar de usar la identificación de la página, me gustaría agregar el Perfil debajo de un enlace, que he creado en la configuración del menú de administración de wp
Hafsal
Sin problemas, obtuve una identificación de elemento de menú personalizada al registrar db Así que está solucionado, gracias de nuevo
Hafsal
@ Hafsal, de nada. Edité mi respuesta agregando una función adicional, que puede usar para obtener la ID de cualquier página, publicación o elemento de menú de WordPress, y actualicé la forma en que debería llamar a estas funciones. De lo contrario, puede verificar directamente la ID en la base de datos como lo ha hecho ...
MikO