Support » Allgemeine Fragen » Twentig: An mehreren Positionen wird immer nur dasselbe Menü eingeblendet

  • Hallo,

    ich brauche etwas Hilfe bei einer Code-Anpassung, und zwar geht es darum, dass alle meine Menüs durch eine kleine Funktion immer denselben Inhalt haben.

    Beispiel:
    Neu erstelles Menü: New-Menu
    Position im Theme: New-Menu-Position
    Hauptmenu: Main-Menu

    In dem New-Menu sind vor allem allgemeine Links drin (Über uns, Kontakt etc.).
    Dieses habe ich der über Design > Menüs der Position New-Menu-Position zugewiesen.

    Auf der Seite selbst wird aber an der Stelle New-Menu-Position der Inhalt des Main-Menu angezeigt.

    Das liegt an diesem Code in meiner function.php, die je nachdem ob ein User ein- oder ausgeloggt ist unterschiedliche Menüs anzeigt (aber dafür an anscheinend an jeder Position dasselbe):

    function my_wp_nav_menu_args( $args = “ ) {

    if( is_user_logged_in() ) {
    $args[‚menu‘] = ‚logged-in‘;
    } else {
    $args[‚menu‘] = ‚logged-out‘;
    }
    return $args;
    }

    Wie muss ich diesen Code anpassen, damit NUR das Main-Menu von dieser Logged-In Funktion betroffen ist?

    Vielen Dank und LG
    Vera

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Nachdem ich deinen Thread leider nicht auf Anhieb verstanden habe, habe ich ihn mir heute noch einmal angeschaut. Allerdings habe ich weiterhin Probleme, zu verstehen, was du möchtest.

    und zwar geht es darum, dass alle meine Menüs durch eine kleine Funktion immer denselben Inhalt haben.

    Wieso legst du unterschiedliche Menüs an, wenn „alle Menüs … immer denselben Inhalt haben“? Das ergibt für mich keinen Sinn.

    Dieses habe ich der über Design > Menüs der Position New-Menu-Position zugewiesen.

    Hast du ein Child-Theme erstellt? Wie lautet der Code, den du für die neue Menü-Position verwendet hast?

    Das liegt an diesem Code in meiner function.php, …

    Die Datei heißt functions.php (Plural, „s“ am Ende).

    die je nachdem ob ein User ein- oder ausgeloggt ist unterschiedliche Menüs anzeigt (aber dafür an anscheinend an jeder Position dasselbe):

    Was möchtest du denn erreichen?
    An einer neuen Menü-Position ein andere Menü anzeigen oder
    an der gleichen Position, an der sonst das Haupt-Menü steht, ein anderes Menü anzeigen, wenn BenutzerInnen angemeldet sind?

    function my_wp_nav_menu_args( $args = '' ) { … }

    Wo wird diese Funktion aufgerufen? Was übergibt der Funktion die Argumente?

    Wie muss ich diesen Code anpassen, damit NUR das Main-Menu von dieser Logged-In Funktion betroffen ist?

    Im Template header.php wird das Hauptmenü ab Zeile 92 eingebunden. Ich würde diesen Teil des Templates mit einem if-Statement ergänzen, sinngemäß

    <?php
    if ( has_nav_menu( 'primary' ) ) {
    
        if( is_user_logged_in() ) { 
            $args= array(
                'container'  => '',
                'items_wrap' => '%3$s',
                'theme_location' => 'new_menu',
            ); 
        } else {
            $args= array(
                'container'  => '',
                'items_wrap' => '%3$s',
                'theme_location' => 'primary',
        }
    
        wp_nav_menu( $args);
    
    } elseif ( ! has_nav_menu( 'expanded' ) ) {
    …

    (etwas redundant aber vielleicht besser lesbar).

    Denk bitte daran, dass wir nicht an deinem Computer sitzen. Wir wissen nicht, welchen Code du wohin gepackt hast und sehen nicht woran du arbeitest. Ohne Einblick in den Code sind Fragen zur Programmierung kaum zu beantworten.

    Thread-Starter vera1993

    (@vera1993)

    Hallo Bego Mario Garde,

    erstmal vielen Dank, dass Du versucht hast mir zu helfen und durch meine anscheinend nicht sehr gute Erklärung durchzusteigen.
    Ich glaube ich versuche es am besten noch einmal.

    Hier die URL der Seite: http://dgrw-online.de/wordpress/

    Auf der Seite habe ich zwei Menüs im Header integriert.
    Das erste Menü hat drei Punkte (Publikationen, Über uns, Anmelden)
    Das zweite Menü direkt darunter ist das Hauptmenü mit 6 Punkten.
    Das ist jetzt der Status, wenn ich die obige Funktion in der funtions.php deaktiviere.

    Der eigentliche Sinn der Funktion ist es einem eingeloggten User ein anderes Hauptmenü anzuzeigen als einem nicht eingeloggten User.
    Das hat auch alles funktioniert, bis ich das zweite Menü mit den drei Punkten hinzugefügt habe.

    Ab dem Zeitpunkt wurde für beide Menü-Positionen das Hauptmenü mit den 6 Punkten angezeigt. Ich denke das liegt daran, dass die Funktion mit $args[‚menu‘] nicht zwischen den Menü-Positionen unterscheidet und den Inhalt aller Menüs mit dem „Logged-in“ oder „logged-Out“ Menü füllt.

    Ich würde gerne wissen, wie ich den Code so anpasse, dass ich mit der Funktion eine konkrete Menü-Position anspreche, damit nur die Hauptnavigation angepasst wird.

    
    function my_wp_nav_menu_args( $args = '' ) {
     
    if( is_user_logged_in() ) { 
        $args['menu'] = 'logged-in';
    } else { 
        $args['menu'] = 'logged-out';
    } 
        return $args;
    }
    add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

    Kann ich einfach in $args[‚menu‘] die entsprechende Menü-Position eintragen, die gemeint ist?

    Noch kurz zu den Benennungen:
    Menü-Namen:
    1) New Menü > Menü über dem Haputmenü (Theme Location: new-menu)
    2) logged-in > Haputmenü für eingeloggte User (Theme Location: primary)
    3) logged-out > Hauptmenü für ausgeloggte User (Theme Location: primary)

    Ich hoffe so ist es besser verständlich und Du kannst mir weiterhelfen.
    LG Vera

    PS: Hier auch noch der Original-Code zum Header-Menu (wenn es nicht sein muss, würde ich da ungern ran und das Problem lieber über die funktions.php lösen)
    Das zusätzliche Menü im Header füge ich über ein Header-Footer Plugin an der richtigen Stelle ein.

    <?php
    
    	$mobile_menu_location = '';
    
    	// If the mobile menu location is not set, use the primary and expanded locations as fallbacks, in that order.
    	if ( has_nav_menu( 'mobile' ) ) {
    		$mobile_menu_location = 'mobile';
    	} elseif ( has_nav_menu( 'primary' ) ) {
    		$mobile_menu_location = 'primary';
    	} elseif ( has_nav_menu( 'expanded' ) ) {
    		$mobile_menu_location = 'expanded';
    	}
    
    	if ( has_nav_menu( 'expanded' ) ) {
    
    		$expanded_nav_classes = '';
    
    		if ( 'expanded' === $mobile_menu_location ) {
    			$expanded_nav_classes .= ' mobile-menu';
    		}
    
    		?>
    
    		<nav class="expanded-menu<?php echo esc_attr( $expanded_nav_classes ); ?>" aria-label="<?php esc_attr_e( 'Expanded', 'twentytwenty' ); ?>" role="navigation">
    
    		<ul class="modal-menu reset-list-style">
    				<?php
    				if ( has_nav_menu( 'expanded' ) ) {
    					wp_nav_menu(
    						array(
    							'container'      => '',
    							'items_wrap'     => '%3$s',
    							'show_toggles'   => true,
    							'theme_location' => 'expanded',
    						)
    					);
    				}
    				?>
    			</ul>
    
    		</nav>
    
    		<?php
    	}
    
    	if ( 'expanded' !== $mobile_menu_location ) {
    		?>
    
    		<nav class="mobile-menu" aria-label="<?php esc_attr_e( 'Mobile', 'twentytwenty' ); ?>" role="navigation">
    
    			<ul class="modal-menu reset-list-style">
    
    			<?php
    			if ( $mobile_menu_location ) {
    
    				wp_nav_menu(
    					array(
    						'container'      => '',
    						'items_wrap'     => '%3$s',
    						'show_toggles'   => true,
    						'theme_location' => $mobile_menu_location,
    					)
    				);
    
    			} else {
    
    				wp_list_pages(
    					array(
    						'match_menu_classes' => true,
    						'show_toggles'       => true,
    						'title_li'           => false,
    						'walker'             => new TwentyTwenty_Walker_Page(),
    					)
    				);
    
    			}
    			?>
    
    			</ul>
    
    		</nav>
    
    		<?php
    	}
    	?>

    Kann ich einfach in $args[‚menu‘] die entsprechende Menü-Position eintragen, die gemeint ist?

    Nein, weil sich der Hook dann auf alle Menüs auswirkt.

    Auf mein Code-Schnipsel bist du leider nicht eingegangen.

    Thread-Starter vera1993

    (@vera1993)

    Hallo Bego Mario Garde,

    das mit deinem Code hatte ich erst falsch verstanden. Entschuldigung!

    Ich habe den Code der header.php jetzt an der entsprechenden Stelle angepasst:

    <?php
    	if ( has_nav_menu( 'primary' ) ) {
    
    	if( is_user_logged_in() ) { 
    	$args= array(
    		'container'  => '',
    		'items_wrap' => '%3$s',
    		'theme_location' => 'new_menu',
    	); 
    	} else {
    		$args= array(
    		'container'  => '',
    		'items_wrap' => '%3$s',
    		'theme_location' => 'primary',
    	}
    
    	wp_nav_menu( $args);
    
    } elseif ( ! has_nav_menu( 'expanded' ) ) {
    ...

    Wenn ich es richtig verstehe wird hierüber aber nur die Position der Hauptnavigation von „primary“ zu „new_menu“ verschoben.
    Ich möchte allerdings nicht die Location der Haputnavigation ändern, sondern den Inhalt, also das Menü logged-out mit dem Menu logged-in an der Position „primary“ tauschen.

    Kann man deine Funktion entsprechend anpassen?

    In der functions.php deines Child-Themes definierst du, welche Menü-Positionen es geben soll, damit du anschließend diesen Positionen unter Design > Menüs ein eigenes Menü zuweisen kannst.

    Umgangssprachlich:
    „Ich möchte eine Position für mein Hauptmenu und eine für ein Fußzeilen-Menü. Für das Hauptmenü erstelle ich ein neues Menü „Main“ mit den Seiten ‚Hallo‘ und ‚Über mich‘; für das Fußzeilen-Menü erstelle ich ein neues Menü „Footer“ mit den Seiten ‚Impressum‘ und ‚Datenschutzerklärung‘. Die beiden Menüs weise ich den Menübereichen zu, also Hauptmenü: Main und Fußzeilen-Menü: Footer.
    Jetzt möchte ich noch ein weiteres Menü im Theme unterbringen. Das Menü nenne ich in der functions.php ‚Angemeldet‘. Dazu erstelle ich in Design > Menü auch noch ein Menü mit den Seiten ‚Hallo‘ und ‚Mitglieder‘. Das neue Menü weise ich der Position ‚Angemeldet‘ zu“.

    Mit wp_nav_menu() wird im Template an gewünschten Stellen ein Navigationsmenü eingebunden. Welches Menü angezeigt werden soll, wird durch die Angabe der Menü-Position bestimmt, die du in der functions.php definiert hast. Also in unserem Fall ‚Haupt-Menü‘, ‚Fußzeilen-Menü‘ oder ‚Angemeldet‘.

    An der Stelle, wo sonst das Hauptmenü erscheint, soll für angemeldete Benutzer das Menü ‚Angemeldet‘ erscheinen. Dazu machen wir eine Abfrage, ob der Benutzer angemeldet ist und weisen dann eine andere Menü-Position zu:

    if( is_user_logged_in() ) { 
    	$args= array(
    		'container'  => '',
    		'items_wrap' => '%3$s',
    		'theme_location' => 'angemeldet',
    	); …

    Umgangssprachlich:
    Schau bitte nach, ob der Benutzer angemeldet ist. Verwende dann als Menü-Position ‚angemeldet‘ hinzu. Falls nicht, verwende als Menü-Position ‚Hauptmenü‘.

    Wir rufen also für angemeldete Benutzer ein anderes Menü auf, in dem wir im Template angeben, dass an dieser Stelle eine andere Menü-Positon angezeigt werden soll (tatsächlich ändert sich nichts an der Position auf der Webseite, aber WordPress verwendet nun mal diese Ausdrücke um unterschiedliche „Menü-Platzhalter“ zu bezeichnen).

    Eine etwas vereinfachte Schreibweise findest du im ersten Code-Beispiel in der Dokumentation: https://developer.wordpress.org/reference/functions/wp_nav_menu/#user-contributed-notes

    Es geht auch ohne den Umweg, wenn du garantieren kannst, dass es eigene Menüs mit bestimmten Namen gibt. Nehmen wir dafür an, du hast unter Design > Menüs drei Menüs mit den Namen „main“, „footer“ und „loggedin“ erstellt. Dann kannst du an der Stelle für das Haupt-Menü auch folgendes verwenden:

    $args = array( menu => 'main' );
    wp_nav_menu( $args );

    Möchtest du jetzt wahlweise das eine oder das andere Menü anzeigen, musst du erst abfragen, ob der Benutzer angemeldet ist und damit entscheiden, welches Menü ausgegeben wird:

    if( is_user_logged_in() ) {
    $args = array( menu => 'loggedin' ); 
    } else {
    $args = array( menu => 'main' ); 
    }
    wp_nav_menu( $args );

    Etwas ausführlich, aber hoffentlich besser zu verstehen?

    Thread-Starter vera1993

    (@vera1993)

    Lieber Bego Mario Garde,

    das war tatsächlich sehr, sehr hilfreich! Vielen Dank für deine ausführliche Erklärung & Geduld. Besonders das war mir nicht klar:

    Wir rufen also für angemeldete Benutzer ein anderes Menü auf, in dem wir im Template angeben, dass an dieser Stelle eine andere Menü-Positon angezeigt werden soll (tatsächlich ändert sich nichts an der Position auf der Webseite, aber WordPress verwendet nun mal diese Ausdrücke um unterschiedliche „Menü-Platzhalter“ zu bezeichnen).

    Ich habe die header.php ab Zeile 92 entsprechend angepasst und die Namen der beiden Menüs für ein- und ausgeloggte User eingetragen:

    <?php			
    	if ( has_nav_menu( 'primary' ) ) {		
    			
    		if( is_user_logged_in() ) {	
    			$args = array( menu => 'logged-in' ); 
    		} else {	
    			$args = array( menu => 'logged-out' ); 
    		}	
    		wp_nav_menu( $args );
    			
    	} elseif ( ! has_nav_menu( 'expanded' ) ) {		
    			
    	wp_list_pages(		
    		array(	
    			'match_menu_classes' => true,
    			'show_sub_menu_icons' => true,
    			'title_li' => false,
    			'walker'   => new TwentyTwenty_Walker_Page(),
    		)	
    	);		
    			
    }			
    ?>			

    Wenn ich die Datei jetzt allerdings aktualisiere, wird mir die Hauptnavigation auf der Seite nicht mehr angezeigt, weder die für ein- noch für ausgeloggte User.

    Hast du eine Idee, woran das liegen könnte?
    Habe ich einen Fehler gemacht?

    Mit besten Grüßen
    Vera

    Hm … 

    if ( has_nav_menu( 'primary' ) ) {
    …
    $args = array( menu => 'logged-out' ); 

    … oder wieder umgangssprachlich: wenn du ein Menü ‚primary‘ hast … pff, mir doch egal. Nimm halt ‚logged-out‘. 😛

    Hast du auch Menüs mit diesen Namen angelegt?

    Thread-Starter vera1993

    (@vera1993)

    Hallo Bego Mario Garde,

    ja, ich habe die beiden Menüs unter Design > Menüs erstellt.
    Muss ich die Menüs etwa noch in der funtions.php registrieren?
    So wie ich es verstanden habe, muss das nicht sein, oder?

    Die Syntax vom php Code ist doch richtig soweit, oder nicht?

    Thread-Starter vera1993

    (@vera1993)

    Zumindest habe ich versucht die Menüs zu registrieren und das Problem bleibt dasselbe…

    Mein Registrierungscode in der functions.php:

    function wbq_register_menus() {
      register_nav_menus(
        array(
          'new-menu',__( 'New Menu' ),
          'logged-out' => __( 'logged-out' ),
          'logged-in' => __( 'logged-in' ),
        )
      );
    }
    add_action( 'init', 'wbq_register_menus' );

    Einzige Idee, die ich jetzt noch habe ist den Code folgendermaßen zu ändern:

    ...
          'primary' => __( 'logged-out' ),
          'primary' => __( 'logged-in' ),
    ...

    Könnte das funktionieren?

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „Twentig: An mehreren Positionen wird immer nur dasselbe Menü eingeblendet“ ist für neue Antworten geschlossen.