it-swarm.com.de

Wie zeige ich Untermenüs auf einer Seite an, die auf einem übergeordneten Element der obersten Ebene basiert?

Ich versuche, ein sekundäres Menü auf Seiten anzuzeigen, auf denen alle koordinierenden Unterseiten des Menüelements der obersten Ebene angezeigt werden, von dem aus sie dort navigiert haben. Mein Problem ist jedoch, dass einige Seiten unter mehreren Menüelementen der obersten Ebene angezeigt werden. Da ich weiß, dass ich eine Seite nicht mehreren Eltern zuweisen kann, gibt es eine Möglichkeit, dies mit benutzerdefinierten Feldern oder Taxonomien zu tun? Oder gibt es einen besseren Weg?

Ich erkläre dies wahrscheinlich nicht auf die beste Weise, aber Sie können ein Beispiel dessen, was ich erreichen möchte, auf http://parkered.org sehen. Wenn Sie zu "Vorteile"> "Schlüsselbranchen" navigieren, sehen Sie, wie das gesamte Untermenü "Vorteile" oben angezeigt wird. Die Seite "Schlüsselindustrien" ist jedoch auch unter dem Menüelement "Business Services" vorhanden. Wenn Sie von dort aus darauf klicken, wird stattdessen das Untermenü "Business Services" oben angezeigt.

1
CBlanch

In Ihrem Beispiel ist die Seite "Schlüsselindustrien" unter jedem dieser Menüs auf oberster Ebene eine andere Seite - oder zumindest ist die URL unterschiedlich.

Dies ermöglicht es dem CMS höchstwahrscheinlich, das richtige Untermenü zu unterscheiden und zu verwenden.

Folgendes mache ich, wenn ich dies erreichen möchte:

  1. Hängen Sie sich in wp_nav_menu_objects ein und suchen Sie nach einemcustomsubmenu-Argument, das die ID des übergeordneten Menüelements enthält
  2. Deaktivieren Sie in diesem Hook alle Menüelemente, die nicht dasselbe übergeordnete Element haben
  3. Wenn Sie dann wp_nav_menu() aufrufen, geben Sie ein Argument submenu mit der ID des übergeordneten Menüelements des anzuzeigenden Untermenüs an (im Folgenden wird beschrieben, wie dies getan wird).

In wp_nav_menu_objects einbinden und nicht untergeordnete Menüpunkte deaktivieren:

Hier ist die Funktion, die ich dafür benutze. Bei jedem Aufruf von wp_nav_menu() wird nach dem Argument submenu gesucht. Wenn submenu festgelegt ist, werden alle Elemente entfernt, die kein untergeordnetes Element der Menüelement-ID sind, auf die sich submenu bezieht:

add_filter("wp_nav_menu_objects", "mytheme_submenu_limit", 10, 2);

function mytheme_submenu_limit($items, $args){

    if(empty($args->submenu)){ return $items; } // if no submenu arg is set, return immediately

    $filtered = wp_filter_object_list($items, array("ID" => $args->submenu), "and", "ID");
    $parent_id = array_pop($filtered);
    $children = mytheme_submenu_get_children_ids($parent_id, $items);

    foreach($items as $key => $item){
        if(!in_array($item->ID, $children)){
            unset($items[$key]);
        }
    }

    return $items;

}

function my_theme_submenu_get_children_ids($id, $items){
    $ids = wp_filter_object_list($items, array("menu_item_parent" => $id), "and", "ID");
    foreach($ids as $id){ $ids = array_merge($ids, submenu_get_children_ids($id, $items)); }
    return $ids;
}

Aufruf von wp_nav_menu():

Wenn Sie wp_nav_menu() aufrufen, müssen Sie das benutzerdefinierte Argument submenu hinzufügen, z.

wp_nav_menu(array("theme_location" => "my_menu_area", "submenu" => 240));

Natürlich ist der Schlüssel hier - wie bekommt man diese Untermenü-ID?

Sie können dies manuell tun, wenn Sie dies wirklich möchten. Eine bessere Möglichkeit besteht jedoch darin, automatisch zu bestimmen, wie diese ID lauten soll, indem Sie die aktuelle Abfrage durchsuchen.

Im Wesentlichen möchten Sie nur bestimmen, welche Menüelement-ID auf der aktuell angezeigten Seite angezeigt wird, und dann:

  • wenn dies ein Menüelement der obersten Ebene ist (d. h. das übergeordnete Element ist 0), senden Sie diese Menüelement-ID an das Argument submenu oder
  • wenn dies kein Menüelement der obersten Ebene ist, senden Sie die übergeordnete ID an das Argument submenu

Dies hat dann zur Folge - solange diese Seite natürlich nicht mehrmals im Menü verwendet wird! - im richtigen Untermenü angezeigt.

Die Techniken hierfür variieren abhängig von der Einrichtung Ihrer Site und entscheidend davon, wie viele "Ebenen" von Untermenüs Sie unterstützen möchten. Aber es könnte ungefähr so ​​aussehen:

global $wp_query;
$queried_object = $wp_query->get_queried_object();
$menu_query_args = array("meta_query" => array("key" => "_menu_item_object_id", "value" => $queried_object->ID));

$locations = get_nav_menu_locations();
$menu_objects = wp_get_nav_menu_items($locations["my_menu_area"], $menu_query_args);

if($menu_objects[0]->menu_item_parent == 0){ $submenu_id = $menu_objects[0]->ID; }
else{ $submenu_id = $menu_objects[0]->menu_item_parent; }

wp_nav_menu(array("theme_location" => "my_menu_area", "submenu" => $submenu_id));

Ich muss betonen, dass dies eine wirklich vereinfachte Version ist. Sie müssen verstehen, wie es funktioniert, anstatt es einfach auf Ihrer Website abzulegen. Und Sie müssen wahrscheinlich zusätzliche Logik hinzufügen, damit sich das Verhalten auf Ihrer Site genau so verhält, wie Sie es möchten. Aber hoffentlich ist dies das, was Sie brauchen, um loszulegen!

1
Tim Malone