web-dev-qa-db-de.com

Verwenden von Filtern zum Ändern der HF des Navigationsmenü-Seitenlinks

Ich versuche, eine Möglichkeit zu finden, die href eines Navigationsmenüseiten-Links von der Standardeinstellung des übergeordneten Themas, die zu seiner relativen Seite führt, zu einer anderen URL zu ändern. Zum Beispiel habe ich einen Menü-Link "Unsere Philosophie", der auf die Seite "Unsere Philosophie" verweist, aber ich möchte, dass sie zu timecube.com (rip) wechselt.

Möglicherweise könnte die Verwendung eines Filters (nav_menu_link_attributes?) Eine einfache Möglichkeit sein, dies zu erreichen. Ich war jedoch nicht in der Lage, mich mit Filtern zu beschäftigen, um dies zum Laufen zu bringen.

Ich würde denken, ich würde etwas brauchen wie:

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

Mein erster Gedanke wäre, ich müsste diese Funktion irgendwo aufrufen - mit apply_filters() vielleicht - und von irgendwoher $atts und $item manuell abrufen und übergeben. Aber das schafft das Problem - wie bekomme ich sie und von was (einem Menüobjekt?). Und wenn ich darüber nachdenke, dass ich sie manuell abrufen muss, sehe ich nicht wirklich den Sinn, einen Filter gegenüber einer normalen Funktion zu verwenden, also muss ich ihn vielleicht in den Plugin-Ordner legen und er gibt mir automatisch Zugriff auf $atts oder so? (Das hat nicht funktioniert). Auf jeden Fall verstehe ich etwas eindeutig nicht.

Ich freue mich über jede Hilfe, die meiner Unwissenheit Licht einbringt.

3
Aristoatle

Sie sind auf dem richtigen Weg, mit wenigen kleinen Knicken.

  1. Sie müssen $atts ändern und zurückgeben. Argumente nach dem ersten dienen der Information und sollten nicht geändert werden.
  2. Sie müssen add_filter() mitteilen, dass Sie mehr als ein Argument erwarten.

Das Beispiel mit einigem Debug-Code sieht folgendermaßen aus:

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

Auf diese Weise können Sie die URL für bestimmte Menüelemente aktualisieren. Im Falle des OP würde "Link Title" durch "Our Philosophy" ersetzt.

Dies würde in die functions.php Ihres Kinderthemas eingefügt

 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