it-swarm.com.de

Einige Navigationsmenü-Filter tun nichts

Also habe ich versucht, ein Plugin zu schreiben, und ich muss den 'nav_menu_link_attributes'-Filter verwenden. Ich habe versucht, den Filter hinzuzufügen, aber er hat überhaupt nicht reagiert. Das heißt, ich habe es mitten im Prozess sterben lassen, nachdem der Filter aufgerufen wurde.

 ... 
 # in der Klassendefinition 
 
 public function __construct () {
 add_filter ('wp_nav_menu_objects', array ($ this, ' filter_menuitem ')); 
} 
 
 public function filter_menuitem ($ attrs) {
 sterben (' SUCCESS !!! '); 
} 
 
 ... 

Ich habe in der Quelle nach nav-menu-template.php gesucht, um zu sehen, welche Filter für was und wann aufgerufen wurden. Daher habe ich versucht, die folgenden Filter nacheinander in der Reihenfolge zu verwenden, in der sie in der Quelle angezeigt werden. manche haben funktioniert, manche haben gar nicht geantwortet:

 function wp_nav_menu () {
 wp_nav_menu_args Responded 
 pre_wp_nav_menu Responded 
 wp_nav_menu_container_allowedtags Hat nicht geantwortet - keine Überraschung 
 antwortete 
 wp_nav_menu_items Hat nicht geantwortet - hätte definitiv antworten sollen 
 wp_nav_menu Hat nicht geantwortet - hätte definitiv geantwortet 
} 

Der einzige Haken, der Sinn gemacht hätte, war, dass der 'pre_wp_nav_menu' verwendet werden kann, um ein benutzerdefiniertes Menü zu generieren, wobei die Standardmethode WP übersprungen wird, die die folgenden Filter aufruft. Aber ich habe versucht, 3 verschiedene Themen zu verwenden, und hätte nicht erwartet, dass dies oft oder sogar jemals der Fall ist.

Vermisse ich etwas? Ist das ein WordPress-Fehler? Ist die Erstellung von benutzerdefinierten Menüs wirklich so verbreitet?

Details:
WordPress 4.4.2
Getestete Themen: Elegante Themen Divi 2.4.6.1, Twenty Thirteen, Twenty Fifteen
Plugins: Nur meine eigenen, von denen keines den 'pre_wp_nav_menu'-Filter verwendet

ANTWORT:
Bei der Antwort von @ Pieter Goosen habe ich in der Quelle der Funktion wp_nav_menu nachgesehen und den Filter 'wp_page_menu' gefunden, der für den vollständigen HTML-Code aufgerufen wird (Nr Zeilenumbrüche (einschließlich Wrapper), sobald sie erstellt wurden. Für den Kontext von dem, was ich tue, ist es ausreichend und nachdem ich es angeschlossen und getestet habe, fand ich, dass es funktioniert!

Ich fand auch, dass der 'wp_list_pages'-Filter auch funktioniert. Anstelle des vollständigen HTML-Codes mit allen Tags werden nur die durch Zeilenumbrüche getrennten <li>-Tags aufgelistet. Es sind keine Wrapper enthalten, auch nicht das Tag <ul>. Ich bin jedoch skeptisch, was diese Funktion sonst noch verwenden könnte. Es kann nicht nur für das Menü aufgerufen werden. Aus Sicherheitsgründen ist es daher möglicherweise besser, den 'wp_page_menu'-Filter beizubehalten.

3
Codesmith

Dies hat mit dem Argument fallback_cb in wp_nav_menu() zu tun. Die meisten Navigationsmenüs legen diesen Parameter nicht fest, daher wird der Standardwert wp_page_menu verwendet.

Wenn Sie sich den Quellcode von wp_nav_menu() ansehen und keinen fallback_cb gesetzt ( defualt wp_page_menu) haben, sind Sie Die folgenden Codezeilen werden ausgeführt

if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
    && isset( $args->fallback_cb ) && $args->fallback_cb && is_callable( $args->fallback_cb ) )
        return call_user_func( $args->fallback_cb, (array) $args );

Dieser Code rettet und lädt wp_page_menu() . Dieser Code wird nach dem Filter pre_wp_nav_menu ausgeführt. Daher wird dieser Filter angezeigt. Alle Filter nach diesen wenigen Zeilen werden nicht ausgeführt, da wp_nav_menu() jetzt wp_page_menu() geladen hat.

Wenn Sie jetzt die Filter in wp_page_menu() testen, werden Sie feststellen, dass sie wie erwartet ausgelöst werden.

Sie können sich meine Antwort hier ansehen , um zu sehen, wie ich damit festgestellt habe, welcher Filter verwendet werden soll

3
Pieter Goosen