Support » Themes » has_nav_menu by id AND slug

  • Gelöst potthe

    (@potthe)


    Hey Ihr,
    ich würde nochmals um Hilfe bitten.

    Ich habe ein menu Aufruf by ID. Der funktioniert auch einwandfrei. Sobald da allerdings ein „Individueller Link“ zum menu hinzugefügt wird, zeigt meine Seite den nicht an, da er die ID dessen nicht über den menu editor abgreifen kann.

    aktueller Code:

    $menu = 'header_menu';
    if ( has_nav_menu( $menu ) ) :
        $items = wp_get_nav_menu_items( $menu );
        foreach ( $items as $item ) {
            $ids[] = get_post_meta( $item->ID, '_menu_item_object_id', true );
        }

    Es wäre super, wenn ich die Chance hätte, dies in etwa so umzusetzen:

    $menu = 'header_menu';
    if ( has_nav_menu( $menu ) ) :
        $items = wp_get_nav_menu_items( $menu );
        foreach ( $items as $item ) {
            $ids[] = get_post_meta( $item->ID, '_menu_item_object_id', true );
        }
        foreach ( $items as $slug ) {
            $slug[] = get_post_meta( $item->slug, '_menu_item_object_slug', true );
        }

    Benötige allerdings für die richtige Umsetzung Hilfe. Onkel Google hat mir leider noch nich arg weiter helfen können, VLLT war ich aber auch so doof und hab nicht richtig gesucht..

    Trotz aller dessen, danke.
    Peace, potthe

    • Dieses Thema wurde geändert vor 1 year, 11 months von potthe.
Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Was genau hast du damit vor?

    Wenn du das Menü ausgeben willst solltest du dir mal das menu Walker Konzept im Codex anschauen.

    Ist etwas gewöhnungsbedürftig, aber äußerst mächtig.

    Ich bin gerade dabei ein One Page Layout zu kreieren, allerdings ein wenig anders als man vorschlägt. Normalerweise macht man dies ja mit Parent und Childpages, aber ich würde gerne diese Struktur behalten dürfen (anderes Thema).

    Das funktioniert auch alles recht gut (Optimierung gibt es immer 😀 ).
    Vor allem funktioniert das nur mit den Seiten, aber nicht mit den custom links, die man in Appearance > Menu, hinzufügen kann. Da ich bereits per page mit slugs arbeite, dachte ich mir, dass man dies dann auch für den menu Aufruf nutzen kann.

    Ja ich kenne das walker menu sys, aber darauf wollte ich mich nicht berufen. je mehr angebotene plugs ich nutze, desto langsamer wird dat ganze, KB 😀

    aktueller Code (Aufruf des menus NUR über die ID):

    $menu = 'header_menu';
    if ( has_nav_menu( $menu ) ) :
        $items = wp_get_nav_menu_items( $menu );
        foreach ( $items as $item ) {
            $ptth_ids[] = get_post_meta( $item->ID, '_menu_item_object_id', true ); 
        }
        if ( isset( $ptth_ids ) ) :
            $parentArgs = array(
                'post_type' => 'page',
                'post__in' => $ptth_ids,
                'post_parent' => '0',
                'orderby' => 'post__in'
            );
        $ptth_query = new WP_query( $parentArgs );
        if ( $ptth_query->have_posts() ) : while ( $ptth_query->have_posts() ) : $ptth_query->the_post();

    in etwa gewünschter code (Aufruf über ID und den slug):

    $menu = 'header_menu';
    if ( has_nav_menu( $menu ) ) :
        $items = wp_get_nav_menu_items( $menu );
        foreach ( $items as $item ) {
            $ptth_ids[] = array(
                    get_post_meta( $item->ID, '_menu_item_object_id', true),
                    get_post_meta( $item->slug, '_menu_item_object_slug', true );
                    );
        }
        if ( isset( $ptth_ids ) ) :
            $parentArgs = array(
                'post_type' => 'page',
                'post__in' => $ptth_ids,
                'post_parent' => '0',
                'orderby' => 'post__in'
            );
        $ptth_query = new WP_query( $parentArgs );
        if ( $ptth_query->have_posts() ) : while ( $ptth_query->have_posts() ) : $ptth_query->the_post();

    Ich danke sehr.!
    Peace, potthe

    • Diese Antwort wurde geändert vor 1 year, 11 months von potthe.

    Also kurz noch als Addition:
    Ich bin nicht dabei ein menu zu erstellen, das habe ich bereits.
    Ich möchte das menu über ID und SLUG abrufen können.

    Wie man am Ende jedes codeschnipsels sehen kann, geht da auch schon der new WP_query los, dH dieser Schnipsel stammt (hier, bei mir) von der front-page.php

    Danke, potthe

    • Diese Antwort wurde geändert vor 1 year, 11 months von potthe.
    • Diese Antwort wurde geändert vor 1 year, 11 months von potthe.

    Ich dachte auch schon an sowas, allerdings, ohne Ausgabe:
    <?php $r4_the_slug = the_slug(); wp_nav_menu( array( 'theme_location' => 'header_menu', 'link_after' => $r4_the_slug) ); ?

    echt großes Sorry für die Störung, aber auch großes Danke für die Hilfe.

    Peace, potthe

    joar, ich dachte man könnte das auch anders angehen:

        <script>
            jQuery(document).ready(function($){    
                $('.menu-item a').attr('href', '#page_<?php echo the_slug(); ?>');
            });
        </script>

    jetzt ist nur noch wichtig, dass bei #page_[hier der slug rein kommt]. natürlich ohne diese Klammern. Dadurch das dies ein onePagelayout ist, bezieht sich der slug, den ich hier einsetze ausschließlich nur auf die starseite, aber ich muss jede Seite ansprechen, dH aktuell:

    startete = http://www.url.de/#page_wp
    blog = http://www.url.de/#page_wp
    test1 = http://www.url.de/#page_wp

    wäre aber nice, wenn:
    startete = http://www.url.de/#page_wp
    blog = http://www.url.de/#page_blog
    test 1 = http://www.url.de/#page_test-1

    ohne sie aber einzeln definiere zu müssen, dh wenn ich die Seite Test 1 in Test 2 umändere, sollte dies auch gleich im menu feststehen.

    Thanks, potthe

    Dein JavaScript könnte die Lösungsidee sein.

    Du willst doch quasi:
    http://www.meineurl.tld/slug_xy/
    in
    http://www.meinurl.tld/#page_slug_xy ändern, und das für alles?

    So, einmal JavaScript/Pseudocode gemisch:

    
    <script>
            jQuery(document).ready(function($){    
                $('.menu-item a').each(function() {
    var old_url=$(this).attr('href');
    // alles außer des Slugs aus old_url entfernen
    $(this).attr('href', '#page_' + old_url );
    });
            });
        </script>
    

    Das ganze könntest du auch ggf mit PHP und output buffering machen. Nicht elegant, aber zielführend.

    http://php.net/manual/de/book.outcontrol.php

    Ja, das mit jQuery dachte und hatte ich auch, aber für das wofür ich das brauchte, musste das Serverseitig passieren, ansonsten hätte WP damit nicht arbeiten können. Ich hab dann in der Tat mich auf das walker_el berufen müssen und hab folgendes gestaltet:

    $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( str_replace(home_url() . '/',home_url() . '/#_',$item->url)). '"' : '';

    Das einzige was ich daran noch optimieren muss, ist die Ausnahme bei der Startseite, da dachte ich, ich gehe wie folgt ran:

    if ( !is_page( 'Startseite' ) ){
        $attributes .= ! empty( $item->url )        ? ' href="' . esc_attr( $item->url ) . '"' : '';
        }else{
            $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( str_replace(home_url() . '/',home_url() . '/#_',$item->url)). '"' : '';
        };

    Aber das hat leider nicht den gewünschten Effekt. Das kommt noch, oder jmd hier hat die Lösung für mich 😀

    Peace, potthe

    p.s. PHP output kümmert sich nur um die Ausgabe, nicht um die Funktion 😉

    • Diese Antwort wurde geändert vor 1 year, 11 months von potthe.

    Hi,

    spontan habe ich keine Lösung für dich, aber einen Vorschlag.
    Ich würde allerdings is_home() als condition wählen.

    Ausdrücke mit dem ?: Operator sind kurz, schnell unübersichtlich und schlecht zu warten.

    Wenn ich Probleme damit habe, schreibe ich die auch gern einfach mal wieder in if/else um.
    Oft erschließt sich das Problem allein dadurch. Und vor allem kann man sich Zwischenschritte ausgeben lassen.
    Was du auch machen kannst ist dir eine Funktion zu schreiben, die genau das machen soll was du willst. Also z.B.

    function get_my_onepage_url( $url ) {
    if ( is_home() ) {
    //code für startseite
    
    return $url;
    } else {
    // code für unterseiten
    
    return $url;
    }
    }
     

    Gruß

    Das hatter er nicht genommen, deswegen hab ich es so gemacht:

    if ($args->theme_location == 'header_menu' ) {
            if ((string)$item->url == home_url() . '/'){..}

    Danke für die Inspirationen 😉
    Peace, potthe

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „has_nav_menu by id AND slug“ ist für neue Antworten geschlossen.