Neuen Menüpunkt erstellen – WordPress

Lesezeit: 7 Minuten

Ich suche nach einer Möglichkeit, ein neues Element zu erstellen, das einem Menü hinzugefügt werden kann.

Hier sind die Details meines Problems: Ich verwende WPML. WPML hat diese nette Funktion, dass Sie den Umschalter automatisch zu einem Menü hinzufügen können. Es fügt es am Ende des Menüs hinzu, keine Kontrolle darüber.

Die Sache ist, ich möchte, dass mein Sprachumschalter Element 4 von 6 ist. Diese Funktion zum automatischen Hinzufügen des Elements am Ende entspricht nicht meinen Anforderungen.

Also möchte ich ein neues Element erstellen, das im Apparence->Menü verwendet werden kann, um meinen Sprachumschalter genau an der Stelle zu platzieren, an der ich ihn haben möchte.

Gibt es eine Möglichkeit, das zu tun?

TLDR: Ich möchte in der Lage sein, benutzerdefinierten HTML/PHP-Code in ein Menüelement (Apparence->Menu) zu pushen. Irgendwelche Funktionen dazu?

  • interessante Frage, bin gespannt auf die Antwort 😀

    – Fiido93

    6. November 2015 um 17:59 Uhr

  • Wie wäre es, wenn Sie einen benutzerdefinierten Beitragstyp „ui_elements“ oder so erstellen und die Funktionalität mit einem Beitrag verknüpfen. Und dann fügen Sie es dem Menü hinzu.

    – xfan

    6. November 2015 um 19:38 Uhr

  • Ich verwende eine vorgefertigte Vorlage. Daher kann ich eine Vorlage nicht wirklich so hinzufügen/ändern, wie ich es mir wünsche. Und nun, wenn ich den Header manuell ändern könnte, wäre mein Menü direkt im Code erstellt worden.

    – Fredy31

    6. November 2015 um 20:26 Uhr


Aus wp-includes/nav-menu-template.phpin Walker_Nav_Menu::start_el:

/**
 * 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 );

Das bedeutet, dass Sie HTML-Inhalte an einzelne Navigationsmenüpunkte anhängen können (direkt vor der letzten li Tag) mit diesem Filter. $item_output enthält das bisher für das Element generierte HTML. Beispiel:

<?php

add_filter('walker_nav_menu_start_el', function ($item_output) {
    return $item_output . '<span>hello world</span>';
});

Das würde anhängen <span>hello world</span> zu jedem Navigationsmenüpunkt HTML. Ein Abschluss li -Tag wird nach diesem Filter angehängt. Sie können das vierte Argument verwenden ($args), um das aktuell gerenderte Navigationsmenü zu validieren.

  • Selbst wenn dies das Problem behebt, kann ich es nicht als Antwort akzeptieren. Sie sollten NIEMALS den WP-Kern modifizieren.

    – Fredy31

    11. Februar 2016 um 21:53 Uhr

  • Der Haken verändert den Kern nicht. Es wird von Core bereitgestellt und soll von Plugins und Themes für Anpassungen verwendet werden.

    – ojrask

    11. Februar 2016 um 22:03 Uhr

Benutzeravatar von Nikola Miljković
Nikola Miljković

In Ordnung, ich habe eine vorübergehende Lösung.

Dies sind Schritte:

  1. Offen \wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
  2. Gehen Sie irgendwo um die Linie herum 786wo ist function wp_nav_menu_items_filter($items, $args){
  3. Fügen Sie dies direkt nach dem ersten hinzu {:

    $tempitems = $items;  
    $tempitemsexplode = explode("\n", $tempitems);  
    $items = "";  
    $id = 2; //This is where widget will be located: example, if you want it to be at place 4, write 5
    
  4. Kurz bevor if ( $abs_menu_id == $settings_menu_id || false === $abs_menu_id ) { füge das hinzu:

    $id = 2;  
    for ($i = 0; $i < $id; $i++){  
        $items .= $tempitemsexplode[$i];  
    }  
    for($i = 0; $i < count($tempitemsexplode); $i++){  
        If ($i == $id){  
    
  5. Gehen Sie zum Ende der Funktion und vor:
    }
    return $items;

    Hinzufügen: }}

  6. Jetzt, vorher return $items; Hinzufügen:

    for ($i = $id; $i < count($tempitemsexplode); $i++){  
        $items .= $tempitemsexplode[$i];  
    }
    

Wenn Sie nicht weiterkommen, sieht die ganze Funktion für mich so aus:

function wp_nav_menu_items_filter($items, $args){
    $tempitems = $items;
    $tempitemsexplode = explode("\n", $tempitems);
    $items = "";
    global $sitepress_settings, $sitepress;

    $current_language = $sitepress->get_current_language();
    $default_language = $sitepress->get_default_language();
    // menu can be passed as integer or object
    if(isset($args->menu->term_id)) $args->menu = $args->menu->term_id;

    $abs_menu_id = icl_object_id($args->menu, 'nav_menu', false, $default_language );
    $settings_menu_id = icl_object_id( $sitepress_settings[ 'menu_for_ls' ], 'nav_menu', false, $default_language );

    $id = 2;
    for ($i = 0; $i < $id; $i++){
        $items .= $tempitemsexplode[$i];
    }

    for($i = 0; $i < count($tempitemsexplode); $i++){
        If ($i == $id){
            if ( $abs_menu_id == $settings_menu_id  || false === $abs_menu_id ) {

                $languages = $sitepress->get_ls_languages();


                $items .= '<li class="menu-item menu-item-language menu-item-language-current">';
                if(isset($args->before)){
                    $items .= $args->before;
                }
                $items .= '<a href="#" onclick="return false">';
                if(isset($args->link_before)){
                    $items .= $args->link_before;
                }

                $language_name="";
                if ( $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                    $language_name .= $languages[ $current_language ][ 'native_name' ];
                }
                if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                    $language_name .= ' (';
                }
                if ( $sitepress_settings[ 'icl_lso_display_lang' ] ) {
                    $language_name .= $languages[ $current_language ][ 'translated_name' ];
                }
                if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                    $language_name .= ')';
                }



                $alt_title_lang = esc_attr($language_name);

                if( $sitepress_settings['icl_lso_flags'] ){
                    $items .= '<img class="iclflag" src="' . $languages[ $current_language ][ 'country_flag_url' ] . '" width="18" height="12" alt="' . $alt_title_lang . '" title="' . esc_attr( $language_name ) . '" />';
                }

                $items .= $language_name;

                if(isset($args->link_after)){
                    $items .= $args->link_after;
                }
                $items .= '</a>';
                if(isset($args->after)){
                    $items .= $args->after;
                }

                unset($languages[ $current_language ]);
                $sub_items = false;
                $menu_is_vertical = !isset($sitepress_settings['icl_lang_sel_orientation']) || $sitepress_settings['icl_lang_sel_orientation'] == 'vertical';
                if(!empty($languages)){
                    foreach($languages as $lang){
                        $sub_items .= '<li class="menu-item menu-item-language menu-item-language-current">';
                        $sub_items .= '<a href="'.$lang['url'].'">';

                        $language_name="";
                        if ( $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                            $language_name .= $lang[ 'native_name' ];
                        }
                        if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                            $language_name .= ' (';
                        }
                        if ( $sitepress_settings[ 'icl_lso_display_lang' ] ) {
                            $language_name .= $lang[ 'translated_name' ];
                        }
                        if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
                            $language_name .= ')';
                        }
                        $alt_title_lang = esc_attr($language_name);

                        if( $sitepress_settings['icl_lso_flags'] ){
                            $sub_items .= '<img class="iclflag" src="'.$lang['country_flag_url'].'" width="18" height="12" alt="'.$alt_title_lang.'" title="' . $alt_title_lang . '" />';
                        }
                        $sub_items .= $language_name;

                        $sub_items .= '</a>';
                        $sub_items .= '</li>';

                    }
                    if( $sub_items && $menu_is_vertical ) {
                        $sub_items="<ul class="sub-menu submenu-languages">" . $sub_items . '</ul>';
                    }
                }

                if( $menu_is_vertical ) {
                    $items .= $sub_items;
                    $items .= '</li>';
                } else {
                    $items .= '</li>';
                    $items .= $sub_items;
                }
            }
        }
    }

    for ($i = $id; $i < count($tempitemsexplode); $i++){
        $items .= $tempitemsexplode[$i];
    }

    return $items;

}

Ich werde versuchen, es einfacher zu machen, zu ändern, wo Sie das Widget platzieren möchten.
Kommentieren Sie, wenn Sie Probleme haben. Viel Glück!

Bearbeiten: Erklärung, was diese modifizierte Funktion tut.
Diese Funktion wird verwendet, um einen Sprachumschalter zum Menü hinzuzufügen.
Wenn diese Funktion aufgerufen wird, haben wir $items Zeichenfolge, die alle Menüpunkte enthält.
Ich habe alle Menüpunkte aus übertragen $items zu $tempitems und einstellen $items zu einer leeren Zeichenkette.
Wieso den? Denn jetzt können wir Widgets als ersten Menüpunkt oder zwischen einigen Menüpunkten einfügen.

Dann explodieren wir das $tempitems Zeichenfolge, damit wir eine andere Reihenfolge verwenden können.

Wenn Sie jetzt angeben $id dies wird unser Offset.

Und jetzt in der ersten Schleife, mit Hilfe von $idfügen wir einige temporäre Elemente zu leeren hinzu $items String, dann das Sprach-Widget und am Ende die restlichen Menüpunkte.

Benutzeravatar von SER64
SER64

Sie können eine neue Vorlage erstellen, selbst wenn Sie eine vorentwickelte verwenden theme oder template.

Kopieren Sie einfach den Code aus der Vorlage, die Sie verwenden möchten, und ändern Sie ihn entsprechend auf Ihrem localhost und laden Sie die modifizierte Kopie in das Theme-Verzeichnis hoch.

Stellen Sie sicher, dass Sie eine Kopie behalten, falls Sie das Design auf eine neuere Version aktualisieren, da es überschrieben wird.

Eine andere Möglichkeit wäre die Entwicklung eines Kinderthema.

  • Es in ein Child-Theme zu packen tut es. Es ist besser, als WP Core oder den Kern des WPML-Plugins zu modifizieren. Keine Ahnung, warum das so hart abgeschossen wurde.

    – Fredy31

    11. Februar 2016 um 21:54 Uhr

1396920cookie-checkNeuen Menüpunkt erstellen – WordPress

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy