web-dev-qa-db-fra.com

Ajout de texte personnalisé dans les titres des éléments à partir de wp_nav_menu ()

J'ai besoin d'ajouter quelque chose après chaque titre d'un menu spécifique appelé par wp_nav_menu ()

J'ai essayé

add_filter('wp_nav_title', 'testing_stuff');

avec

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

}

sans succès, je ne suis pas assez familiarisé avec le hooking.

Mon but :

  • quand j'ai appelé le menu ID = 4;
  • pour chaque titre de chaque article
  • j'extrais les données de la méta de la page en cours avec $ meta_value = get_post_meta ($ post-> ID, $ meta_key, true);
  • J'ajoute ces données après le texte d'ancrage dans un

Donc, chaque élément du menu aura une donnée spécifique ajoutée à son contenu, des données que je pourrais manipuler depuis un champ personnalisé.

J'apprécierais tout indice qui me permettrait d'être sur la bonne voie.

Je vous remercie.

2
Simon

Ce qui suit fonctionne, mais avec les mises en garde suivantes. Il sera exécuté pour chaque menu} _, mais il sera ne sera pas exécuté pour wp_page_menu, un rappel par défaut si un menu est introuvable.

Enfin, les éléments de menu ne sont pas des pages nécessaires - vous pouvez donc choisir une logique pour vérifier que l'élément de menu que vous traitez est une page/publication à partir de laquelle vous souhaitez obtenir les métadonnées.

Voici le code:

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;
}

Je serais intéressé de voir s'il existe un meilleur moyen de le faire, de préférence une méthode qui vous permet de vérifier à quel menu ces éléments sont destinés ...


J'ai déplacé ceci des commentaires. Si vous souhaitez limiter cette fonction à un menu particulier, vous pouvez essayer ce qui suit. Ceci n'a pas été testé .

Commencez par supprimer le add_filter du code ci-dessus. Au lieu de cela, insérez dans une fonction qui est ajoutée à un hook précédent et ajoute conditionnellement le filtre (par exemple, lorsque le menu est 'primaire'):

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;
    }

Enfin, supprimez le filtre, une fois les éléments chargés, afin qu'il ne soit pas appelé pour les menus secondaires:

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;
}
4
Stephen Harris

Merci à Stephen: c’est la forme de travail du code (j’ai supprimé les options que je n’utilise pas dans la proposition originale). Je viens de tester s'il existe une valeur non vide à une valeur méta afin que je ne me répande pas vide au format 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');
0
Simon