2015-11-06 22 views
12

Ich suche nach einer Möglichkeit, ein neues Element zu erstellen, das zu einem Menü hinzugefügt werden kann.Erstellen eines neuen Menüelements - Wordpress

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

Das ist, ich möchte meine Sprachumschalter Element 4 von 6 sein. Diese Funktion, um das Element am Ende automatisch hinzuzufügen, passt nicht meine Bedürfnisse.

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

Gibt es eine Möglichkeit, das zu tun?

TLDR: Ich möchte in der Lage sein, benutzerdefinierten HTML/PHP-Code in einem Menüelement (Appernance-> Menü) zu drücken. Irgendwelche Funktionen dazu?

+0

interessante Frage, nach vorne mit der Antwort: D – Fiido93

+0

Wie wäre es, Sie erstellen einen benutzerdefinierten Beitragstyp "ui_elements" oder so und verknüpfen Sie die Funktionalität zu einem Beitrag. Und dann fügst du es dem Menü hinzu. – xphan

+0

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

Antwort

-2

Sie können eine neue Vorlage erstellen, auch wenn Sie eine vordefinierte theme oder template verwenden.

Kopieren Sie einfach den Code aus der Vorlage, die Sie verwenden möchten, und ändern Sie sie entsprechend auf Ihrem localhost und laden Sie die geänderte Kopie in das Themenverzeichnis hoch.

Stellen Sie sicher, dass Sie eine Kopie behalten, wenn Sie das Design auf eine neuere Version aktualisieren, da es überschrieben wird. Eine andere Option wäre, eine child theme zu entwickeln.

+0

Dies funktioniert nicht ... –

+0

Putting es in einem untergeordneten Thema tut. Es ist besser als WP Core oder der Kern des WPML-Plugins zu modifizieren. Ich weiß nicht, warum das so hart abgeschossen wurde. – Fredy31

3

Von wp-includes/nav-menu-template.php, in 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, Sie zu einzelnen nav Menüpunkt HTML Inhalt (rechts vor dem letzten li-Tag) anhängen können diesen Filter verwenden. $item_output enthält den HTML-Code, der bisher für den Artikel generiert wurde. Beispiel:

<?php 

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

Das <span>hello world</span> zu jedem nav Menüpunkt HTML anhängen würde. Ein schließendes li Tag wird nach diesem Filter angehängt. Sie können das vierte Argument ($args) verwenden, um das aktuell angezeigte Navigationsmenü zu überprüfen.

+0

Auch wenn dies das Problem behebt, kann ich es nicht als Antwort akzeptieren.Sie sollten niemals, immer, WP-Kern ändern. – Fredy31

+0

Der Haken ändert den Kern nicht. Es wird von core bereitgestellt und soll von Plugins und Themes für Anpassungen verwendet werden. – ojrask

1

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

Diese Schritte sind:

  1. öffnen \wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
  2. irgendwo um die Linie gehen , wo function wp_nav_menu_items_filter($items, $args){ dieses Recht hinzufügen nach dem ersten {
  3. ist:

    $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. Rechts vor if ($abs_menu_id == $settings_menu_id || false === $abs_menu_id) { fügen Sie diese:

    $id = 2; 
    for ($i = 0; $i < $id; $i++){ 
        $items .= $tempitemsexplode[$i]; 
    } 
    for($i = 0; $i < count($tempitemsexplode); $i++){ 
        If ($i == $id){ 
    
  5. zur Unterseite der Funktion gehen und vor:
    }
    return $items;
    Anzahl: }}

  6. Nun, bevor return $items; Anzahl:

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

Wenn Sie hier stecken ist, wie das ganze Funktion für mich aussieht:

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 leichter zu ändern, in dem Sie Widget platzieren möchten.
Kommentar, wenn Sie Probleme haben. Viel Glück!

Edit: Erklärung, was diese modifizierte Funktion macht.
Diese Funktion wird verwendet, um den Sprachumschalter zum Menü hinzuzufügen.
Wenn diese Funktion aufgerufen wird, haben wir $items Zeichenfolge, die alle Menüelemente enthält.
Ich übertrage alle Menüpunkte von $items nach $tempitems und setze $items auf leere Zeichenfolge.
Warum? Weil wir jetzt Widget als ersten Menüpunkt oder zwischen einigen Menüpunkten einfügen können.

Dann explodieren wir diese $tempitems Zeichenfolge, so dass wir eine andere Reihenfolge verwenden konnten.

Wenn Sie jetzt $id angeben, wird dies unser Offset.

Und jetzt in der ersten Schleife, mit Hilfe von $id, fügen wir einige temporäre Elemente zu leeren $items Zeichenfolge, und dann Sprache Widget und am Ende verbleibenden Menüpunkte.

Verwandte Themen