web-dev-qa-db-fra.com

Utilisation de filtres pour changer le lien de la page de menu de navigation

J'essaie de trouver un moyen de changer le href d'un lien de page de menu de navigation du nom par défaut du thème parent, qui passe à sa page correspondante, en une autre URL. Par exemple, j'ai un lien de menu "Notre philosophie" qui renvoie à la page "Notre philosophie", mais je souhaite qu'il soit sur timecube.com (rip).

Il semble que l’utilisation d’un filtre (nav_menu_link_attributes?) Pourrait être un moyen simple d’atteindre cet objectif. Cependant, je n'ai pas réussi à comprendre comment utiliser des filtres pour que cela fonctionne.

Je penserais avoir besoin de quelque chose comme:

function change_nav_url( $atts, $item ) {
    // modify $item href?
}
add_filter ( 'nav_menu_link_attributes', 'change_nav_url');

Ma pensée initiale était que j’aurais besoin d’appeler cette fonction quelque part - avec apply_filters() peut-être - et d’avoir besoin d’obtenir $atts et $item manuellement de quelque part et de les transmettre. Mais cela crée le problème - comment puis-je les obtenir et à partir de quoi (un objet de menu?). Et en y réfléchissant, si je dois les récupérer manuellement, je ne vois pas vraiment l'intérêt d'utiliser un filtre plutôt qu'une fonction simple, alors je dois peut-être le mettre dans le dossier du plugin et ça me donnera automatiquement accès à $atts ou quelque chose? (Ça n'a pas marché) De toute façon, je ne comprends clairement pas quelque chose.

J'apprécie toute aide apportant de la lumière à mon ignorance newb.

3
Aristoatle

Vous êtes sur la bonne voie, avec quelques problèmes mineurs.

  1. Vous devez modifier $atts et le renvoyer. Tous les arguments après le premier sont fournis à titre d'information et ne doivent pas être modifiés.
  2. Vous devez dire à add_filter() que vous attendez plus d'un argument.

L'exemple avec du code de débogage serait dans les lignes de:

add_filter( 'nav_menu_link_attributes', function ( $atts, $item, $args, $depth ) {

    var_dump( $atts, $item ); // a lot of stuff we can use

    var_dump( $atts['href'] ); // string(36) "http://dev.rarst.net/our-philosophy/"

    var_dump( get_the_title( $item->object_id ) ); // string(14) "Our Philosophy", note $item itself is NOT a page

    if ( get_the_title( $item->object_id ) === 'Our Philosophy' ) { // for example

        $atts['href'] = 'https://example.com/';
    }

    return $atts;
}, 10, 4 ); // 4 so we get all arguments
5
Rarst

Cela vous permettra de mettre à jour l'URL pour des éléments de menu spécifiques. Dans le cas du PO, "Titre du lien" serait remplacé par "Notre philosophie".

Cela serait placé dans le functions.php de votre thème enfant

 function update_menu_link($items){

    //look through the menu for items with Label "Link Title"
        foreach($items as $item){

            if($item->title === "Link Title"){ // this is the link label your searching for
                $item->url = "http://newlink.com"; //this is the new link
            }
        }
        return $items;
    }

    add_filter('wp_nav_menu_objects', 'update_menu_link', 10,2);
1
dbmpls