it-swarm.com.de

Blenden Sie ein Menüelement und seine Untermenüs aus und zeigen Sie einen Link "Anmelden" an, wenn der Benutzer abgemeldet ist

Ich muss irgendwie aktivieren, dass beim Abmelden das Element 'Mein Konto' in der Navigationsleiste ausgeblendet wird und stattdessen einen 'Anmelden'-Link anzeigt. Der Artikel 'Mein Konto' hat auch Untermenüs mit den Artikeln 'Abmelden' und 'Bestellung verfolgen'. Dies sollte auch ausgeblendet sein (Ich denke, es wird ausgeblendet, wenn Sie das übergeordnete Element 'Mein Konto' ausblenden.

Ich benutze das Thema Mystile, WordPress und ich benutze die neueste Version von WooCommerce.

Irgendwelche Vorschläge, wie es geht?

Die JSFiddle der HTML-Quelle meines Menüs: http://jsfiddle.net/qcuckt1f/

<nav id="navigation" class="col-full parent" role="navigation">
    <ul id="main-nav" class="nav fr parent">
        <li id="menu-item-68" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-68"><a href="http://renhud.square-brain.com/">Forside</a>
        </li>
        <li id="menu-item-67" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-67"><a href="http://renhud.square-brain.com/butik/">Butik</a>
        </li>
        <li id="menu-item-61" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-61"><a href="http://renhud.square-brain.com/support/">Kundeservice</a>
        </li>
        <li id="menu-item-62" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-8 current_page_item menu-item-has-children menu-item-62 parent"><a href="http://renhud.square-brain.com/min-konto/">Min Konto</a>
            <ul class="sub-menu">
                <li id="menu-item-63" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-63"><a href="http://renhud.square-brain.com/min-konto/track-din-ordre/">Track din ordre</a>
                </li>
                <li id="menu-item-71" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-71"><a href="http://renhud.square-brain.com/min-konto/log-ud/">Log Ud</a>
                </li>
            </ul>
        </li>
    </ul>
</nav>
1

Es scheint, dass das OP sein/ihr Problem dadurch gelöst hat, was unter Unterschiedliche Menüs für angemeldete Benutzer zu finden ist.

if ( is_user_logged_in() ) {
     wp_nav_menu( array( 'theme_location' => 'logged-in-menu' ) );
} else {
     wp_nav_menu( array( 'theme_location' => 'logged-out-menu' ) );
}

Der kürzere Weg, dies zu erreichen, ist der folgende: veröffentlicht in neuer developer.wordpress.org version:

wp_nav_menu( array(
    'theme_location' => is_user_logged_in() ? 'logged-in-menu' : 'logged-out-menu'
) );

Der robuste Weg, dies zu erreichen, ohne zwei verschiedene Menüs zu erstellen, ist die Verwendung einer benutzerdefinierten 'walker' -Funktion:

  1. Suchen Sie nach der benutzerdefinierten Walker-Klasse, die Ihr Thema in wp_nav_menu() verwendet:

    wp_nav_menu( array(
        // More arguments here..
        'walker'         => new Your_Theme_Custom_Nav_Walker(),
    ) );
    
  2. Schreiben Sie eine neue Klasse in Ihre "functions.php" , erweitern Sie die Klasse Your_Theme_Custom_Nav_Walker (Sie können die Deklaration einfach mit einer IDE durchsuchen) oder erweitern Sie die Klasse Walker_Nav_Menu, wenn sie nicht verwendet wird jeden benutzerdefinierten Walker und kopieren Sie die erforderliche Funktion (s) , um hauptsächlich die Funktion start_el() dieser Walker-Klasse in ihrer Deklaration zu ändern. Hier ist die einfache benutzerdefinierte Klasse, die den von mir erstellten Walker_Nav_Menu entsprechend Ihren Anforderungen erweitert:

    class WP_Custom_Nav_Walker extends Walker_Nav_Menu {
    
    /**
     * Start the element output.
     *
     * @see Walker::start_el()
     *
     * @since 3.0.0
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param object $item   Menu item data object.
     * @param int    $depth  Depth of menu item. Used for padding.
     * @param array  $args   An array of arguments. @see wp_nav_menu()
     * @param int    $id     Current item ID.
     */
    public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
    
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;
    
        /**
         * Filter the CSS class(es) applied to a menu item's list item element.
         *
         * @since 3.0.0
         * @since 4.1.0 The `$depth` parameter was added.
         *
         * @param array  $classes The CSS classes that are applied to the menu item's `<li>` element.
         * @param object $item    The current menu item.
         * @param array  $args    An array of {@see wp_nav_menu()} arguments.
         * @param int    $depth   Depth of menu item. Used for padding.
         */
        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
    
        /**
         * Filter the ID applied to a menu item's list item element.
         *
         * @since 3.0.1
         * @since 4.1.0 The `$depth` parameter was added.
         *
         * @param string $menu_id The ID that is applied to the menu item's `<li>` element.
         * @param object $item    The current menu item.
         * @param array  $args    An array of {@see wp_nav_menu()} arguments.
         * @param int    $depth   Depth of menu item. Used for padding.
         */
        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
    
    
        // MODIFICATION STARTS HERE!!
        $output .= $indent . '<li' . $id . $class_names;
    
        if (apply_filters('the_title', $item->title, $item->ID) === 'My Account') {
            if ( is_user_logged_in() ) {
                $output .= '>';
            } else {
                $output .= '><a href="' . get_site_url() . '/wp-login.php">Log in</a></li>';
                $output .= '<li style="display: none">';
            }
        } else {
            $output .= '>';
        }
        // MODIFICATION ENDS HERE!!
    
    
        $atts = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
        $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
        $atts['href']   = ! empty( $item->url )        ? $item->url        : '';
    
        /**
         * Filter the HTML attributes applied to a menu item's anchor element.
         *
         * @since 3.6.0
         * @since 4.1.0 The `$depth` parameter was added.
         *
         * @param array $atts {
         *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
         *
         *     @type string $title  Title attribute.
         *     @type string $target Target attribute.
         *     @type string $rel    The rel attribute.
         *     @type string $href   The href attribute.
         * }
         * @param object $item  The current menu item.
         * @param array  $args  An array of {@see wp_nav_menu()} arguments.
         * @param int    $depth Depth of menu item. Used for padding.
         */
        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
    
        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }
    
        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        /** This filter is documented in wp-includes/post-template.php */
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;
    
        /**
         * Filter a menu item's starting output.
         *
         * The menu item's starting output only includes `$args->before`, the opening `<a>`,
         * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is
         * no filter for modifying the opening and closing `<li>` for a menu item.
         *
         * @since 3.0.0
         *
         * @param string $item_output The menu item's starting HTML output.
         * @param object $item        Menu item data object.
         * @param int    $depth       Depth of menu item. Used for padding.
         * @param array  $args        An array of {@see wp_nav_menu()} arguments.
         */
        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }
    
    }
    
  3. Sie können diesen WP_Custom_Nav_Walker folgendermaßen verwenden:

    wp_nav_menu( array(
        // More arguments here..
        'walker'         => new WP_Custom_Nav_Walker(),
    ) );
    

Sie können diese Antwort für ein anderes Beispiel überprüfen, wie das getan wird.

3
5ervant

Sie können die WordPress-Funktion is_user_logged_in() verwenden, um dies zu überprüfen und einige grundlegende if-Anweisungen zu erstellen, mit denen der entsprechende Code ein- und ausgeblendet wird.

1
Brian