it-swarm.com.de

Hinzufügen von benutzerdefiniertem Text in Elementtiteln aus wp_nav_menu ()

Ich muss nach jedem Titel eines bestimmten Menüs, das von wp_nav_menu () aufgerufen wird, etwas hinzufügen

Ich habe es versucht

add_filter('wp_nav_title', 'testing_stuff');

mit

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

}

ohne erfolg kenne ich mich mit hooking nicht aus.

Mein Zweck:

  • als ich anrief menu ID = 4;
  • für jeden Titel jedes Artikels
  • ich hole Daten aus der aktuellen Meta-Seite mit $ meta_value = get_post_meta ($ post-> ID, $ meta_key, true);
  • Ich füge diese Daten nach dem Ankertext in ein

So werden jedem Menüelement bestimmte Daten hinzugefügt, die ich über ein benutzerdefiniertes Feld bearbeiten kann.

Ich würde mich über jeden Hinweis freuen, der mich auf den richtigen Weg bringt.

Vielen Dank.

2
Simon

Das Folgende funktioniert, aber mit den folgenden Einschränkungen. Es wird für jedes Menü ausgeführt, aber es wird nicht für wp_page_menuausgeführt), ein Standard-Rückruf, wenn ein Menü nicht gefunden werden kann.

Schließlich sind Menüelemente keine erforderlichen Seiten. Daher möchten Sie möglicherweise logisch prüfen, ob es sich bei dem betreffenden Menüelement um eine Seite/einen Beitrag handelt, von der/dem Sie die Metadaten abrufen möchten.

Hier ist der 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;
}

Es würde mich interessieren, ob es einen besseren Weg gibt, dies zu tun, vorzugsweise eine Methode, mit der Sie überprüfen können, für welches Menü diese Elemente bestimmt sind ...


Ich habe dies aus den Kommentaren verschoben. Wenn Sie diese Funktion auf ein bestimmtes Menü beschränken möchten, können Sie trythe following. Dies wurde nicht getestet .

Entfernen Sie zuerst den add_filter aus dem obigen Code. Fügen Sie stattdessen in eine Funktion ein, die einem früheren Hook hinzugefügt wurde, und fügen Sie den Filter bedingt hinzu (sagen Sie, wenn das Menü "primär" ist):

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

Entfernen Sie schließlich den Filter, sobald die Elemente geladen wurden, damit er nicht für sekundäre Menüs aufgerufen wird:

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

Dank an Stephen: Dies ist die Arbeitsform des Codes (ich habe Optionen, die ich nicht benutze, aus dem ursprünglichen Vorschlag entfernt). Ich teste nur, ob es einen nicht leeren Wert für den Meta-Wert gibt, damit ich mich nicht leer im HTML verbreite.

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