Überprüfen Sie, ob sich die Seite in einem bestimmten Menü befindet

7

Ich habe einen Client, der zwei "Hauptmenüs" haben wollte, und wir mussten programmgesteuert anzeigen, welches Menü die aktuelle Seite enthielt. Wie kann ich das machen?

Beispiel: Wir befinden uns auf der Seite "Über". Finden Sie heraus, welches der beiden Menüs die Seite "Info" enthält, und zeigen Sie dieses.

mrwweb
quelle
Kann ich fragen, warum sie zwei Hauptmenüs wollten? Klingt seltsam oder als ob sie das nicht wollten, dies ist nur ihre Idee, wie sie das implementieren können, was sie tatsächlich wollen
Tom J Nowell
Ich bin nicht begeistert davon, dies tun zu müssen, aber was sie sowohl in Bezug auf die Site-Struktur als auch in Bezug auf das Design verlangten, erforderte zwei Menüs für zwei größtenteils unabhängige Abschnitte der Site. Ich vermute, dass diese Funktion auch für andere Dinge verwendet werden kann, und ich war überrascht, dass ich so etwas beim ersten Blick nicht gefunden habe.
Mrwweb

Antworten:

18

Hier ist die Funktion, die ich geschrieben habe, um dies herauszufinden. Sie geben ihm einen Menü-Slug / Namen / ID und eine Post / Page-ID und es wird zurückgegeben, TRUEwenn sich dieser Post / diese Seite im angegebenen Menü befindet und FALSEansonsten. Dann war es nur noch eine Frage der schnellen if / else-Anweisung, die beiden Menüs zu überprüfen und das richtige anzuzeigen.

/**
 * Check if post is in a menu
 *
 * @param $menu menu name, id, or slug
 * @param $object_id int post object id of page
 * @return bool true if object is in menu
 */
function cms_is_in_menu( $menu = null, $object_id = null ) {

    // get menu object
    $menu_object = wp_get_nav_menu_items( esc_attr( $menu ) );

    // stop if there isn't a menu
    if( ! $menu_object )
        return false;

    // get the object_id field out of the menu object
    $menu_items = wp_list_pluck( $menu_object, 'object_id' );

    // use the current post if object_id is not specified
    if( !$object_id ) {
        global $post;
        $object_id = get_queried_object_id();
    }

    // test if the specified page is in the menu or not. return true or false.
    return in_array( (int) $object_id, $menu_items );

}

Anwendungsbeispiel:

if( cms_is_in_menu( 'main-menu' ) ) {
    // do something like wp_nav_menu( $args );
}
mrwweb
quelle
Schöner Ausschnitt. Ich musste es verwenden, um ein anderes Header-Bild bereitzustellen, abhängig von dem Menü, dem die Seite zugewiesen wurde. Vielen Dank!
Stephen S.
Warum wird in der ersten Zeile $menudurchgereicht esc_attr?
Luke A. Leber
@ LukeA.Leber Es ist lange her, seit ich das geschrieben habe. Ich glaube, ich habe es in einem Kontext verwendet, in dem Site-Editoren Werte festlegen konnten, die in dieser Funktion verwendet wurden.
Mrwweb
Dies funktioniert anscheinend nur mit einstufigen Menüs.
sicherlich