Adición de texto personalizado en títulos de elementos de wp_nav_menu ()

2

Necesito agregar algo después de cada título de un menú específico llamado por wp_nav_menu ()

Lo intenté

add_filter('wp_nav_title', 'testing_stuff');

con

function testing_stuff() {
$item->title = $item->title . ' testing';
return $item->title;

}

sin ningún éxito, no estoy lo suficientemente familiarizado con la conexión.

Mi propósito:

  • cuando llamé al menú ID = 4;
  • para cada título de cada elemento
  • extraigo datos del meta de la página actual con $ meta_value = get_post_meta ($ post- > ID, $ meta_key, true);
  • Agrego estos datos después del texto de anclaje en un

Por lo tanto, cada elemento del menú tendrá datos específicos agregados a su contenido, datos que podría manipular desde el campo personalizado.

Apreciaría cualquier pista que me guíe por el camino correcto.

Gracias.

    
pregunta Simon 26.01.2012 - 11:47

2 respuestas

4

Los siguientes trabajos, pero con las siguientes advertencias. Se ejecutará para todos los menús , pero no se ejecutará para wp_page_menu , una devolución de llamada predeterminada por lo general si no se puede encontrar un menú.

Finalmente, los elementos del menú no son páginas necesarias, por lo que es posible que desee hacer un poco de lógica para verificar que el elemento del menú con el que está trabajando es una página / publicación desde la que desea obtener los metadatos.

Aquí está el código:

add_filter( 'wp_setup_nav_menu_item','my_item_setup' );
function my_item_setup($item) {
    //Use the following to conduct logic;
    $object_id = (int) $item->object_id; //object ID.
    $object_type = $item->type; //E.g. 'post_type'
    $object_type_label = $item->type_label; //E.g. 'post' or 'page';

    //You could, optionally add classes to the menu item.
    $item_class = $item->classes;

    //Make sure $item_class is an array.
    //Alter the class:
    $item->classes= $item_class;

    //Alter the title:
    $pack_meta_value = get_post_meta($object_id, 'test', true );
     if($pack_meta_value ){
         $item->title = $item->title.'<span>' . $pack_meta_value . '</span>'; 
     }

    return $item;
}

Me interesaría ver si hubiera una mejor manera de hacerlo, preferiblemente un método que le permitiera verificar en qué menú están estos elementos ...

He movido esto de los comentarios. Si desea restringir esta función a un menú en particular, puede probar lo siguiente. Esto no ha sido probado .

Primero elimina el add_filter del código anterior. En su lugar, insértelo en una función que se agrega a un enlace anterior y agrega condicionalmente el filtro (por ejemplo, cuando el menú es 'primario'):

add_filter( 'wp_nav_menu_args','add_my_setup_function' );
    function add_my_setup_function($args) {
        if( $args['theme_location'] == 'primary' ):
         add_filter( 'wp_setup_nav_menu_item','my_item_setup' );
        endif;      
        return $args;
    }

Finalmente, elimine el filtro, una vez que se hayan cargado los elementos, para que no se llame a los menús secundarios:

add_filter('wp_nav_menu_items','remove_my_setup_function', 10, 2);
function remove_my_setup_function( $nav, $args ) {
   remove_filter( 'wp_setup_nav_menu_item', 'my_item_setup' );
    return $nav;
}
    
respondido por el Stephen Harris 26.01.2012 - 13:39
0

Gracias a Stephen: esta es la forma de trabajo del código (eliminé las opciones que no uso de la propuesta original). Acabo de probar si hay un valor no vacío para el valor meta, por lo que no se propaga vacío al html.

function packaging_setup($item) {
//Alter the title:
$ala_page = get_page_by_title( $item->title ); // getting the page itself
$ala_page_id = $ala_page->ID; // the page ID the item is refering to
$pack_meta_key = 'box_packaging_meta'; // my meta key
$pack_meta_value = get_post_meta($ala_page_id, $pack_meta_key, true ); // getting data
    if (!empty($pack_meta_value)) { //so I do not add empty spans
    $item->title = $item->title.'<span>' . $pack_meta_value . '</span>'; //altering
    }
    return $item; 
}

add_filter('wp_setup_nav_menu_item', 'packaging_setup');
    
respondido por el Simon 26.01.2012 - 23:28

Lea otras preguntas en las etiquetas