Eklenti kullanılarak wp_nav_menu tarafından oluşturulan menüye alt menü nasıl eklenir


11

Bir menü ile yarattı wp_nav_menugibi hangi bakış

<ul class="nav-menu" id="menu-top-nav">
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

Eklentimi kullanarak "Öğe 3" e bir alt menü ekleyerek yukarıdaki menüyü değiştirmek istiyorum, bu yüzden aşağıda benim istenen çıktı.

<ul class="nav-menu" id="menu-top-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
   </ul>
  </li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

Filtreleri takip etmeyi denedim, ancak bunlar yukarıdaki çıktıyı elde etmeme yardımcı olmadı.

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Geçici Çözüm 1:

add_filter('wp_nav_menu_items', 'my_custom_menu_item', 10, 2);

function my_custom_menu_item($items, $args)
{
    $parent_item_number = 3;
    $pos = nth_strpos($items, '</a>', $parent_item_number) + 4;
    $cat_id = 9;
    $args = array('numberposts' => 5, 'category' => $cat_id);
    $myposts = get_posts($args);
    if (!empty($myposts))
    {
        $str_to_insert = '<ul class="sub-menu">';
        global $post;
        foreach ($myposts as $post) : 
            setup_postdata($post);
            $str_to_insert .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        endforeach;
        $str_to_insert .= '</ul>';

        $items = substr($items, 0, $pos) . $str_to_insert . substr($items, $pos);
    }
    return $items;
}

function nth_strpos($str, $substr, $n, $stri = false)
{
    if ($stri)
    {
        $str = strtolower($str);
        $substr = strtolower($substr);
    }
    $ct = 0;
    $pos = 0;
    while (($pos = strpos($str, $substr, $pos)) !== false)
    {
        if (++$ct == $n)
        {
            return $pos;
        }
        $pos++;
    }
    return false;
}

Yukarıdaki çözüm işe yarıyor ama bence bu istenen sonuca ulaşmak için uygun bir yol değil. Sizden iyi bir çözüm elde etmek isterim.


Vay, bu soruya başka cevap yok mu? Burada basit bir çözüm de arıyorum. Dizeleri ayrıştırmayı içermeyen bir şey. Daha kolay bir yol olmalı, değil mi?
rgin

Bu html yapısının onayı üzerine WP desteği. Geçici çözüm yalnızca alt menü css sınıf adlarını değiştirmelidir. Daha iyi css sınıflarını wordpress menü yapısı için yeniden yazmaktır.
Foxsk8

Yanıtlar:


2

Yürüteç kullanarak menünüzü değiştirebilirsiniz.

include('subMenu.php');
$menu =  wp_nav_menu( array('menu' => 'YOUR-MENU-NAME','menu_class' => 'megamenu','walker' => new subMenu));

tema klasöründe subMenu.php dosyası oluşturun aşağıdaki kodu ekleyin.

<?php
class subMenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {

    if( 'Item 3' == $item->title ){
        $output .= '<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
        </ul>';
    }
    $output .= "</li>\n";  
    }
}

0

wp_nav_menu_itemsWP Nav Menüsünün yapısına öğe ekleyecekseniz Hook doğru. Statik bir "Ev" bağlantısı eklemek için aşağıdaki örneğe bakın. Bağlantı statik, fonksiyondan home_url()ve ben sadece WP Nav Menu fpr değerleri önce ve sonra argümanlarda empbed. Li-öğe statiktir, bu öğe için bir Walker kullanıyorsanız yalnızca WordPress'te bağlanır. Kanca wp_nav_menu_itemslistenin içindedir ul. Bu yeni öğe içeriği için var tanımladıktan sonra bunu $itemsliste çıktısından önce ayarlanan var varsayılan listesine eklerim . Şimdi sadece tüm içeriğin geri dönüşü.

add_filter( 'wp_nav_menu_items', 'fb_add_home_link', 10, 2 );
function fb_add_home_link( $items, $args ) {

    $home_item =
            '<li>' .
            $args->before .
            '<a href="' . home_url( '/' ) . '" title="Home">' .
            $args->link_before . __( 'Home' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}

Görünüşe göre sorun ifademi okumadınız, böylece çözümünüz istediğim şey değil, menünün başında veya sonunda bir öğe eklemem gerekmiyor, ancak belirli bir üst öğenin altında bir alt menüye ihtiyacım var. Lütfen soruyu okuyun, her şey çok açık bir şekilde açıklanmıştır.
Tahir Yasin

Üzgünüm, evet haklısın; ama çoğu zaman dil problemi arka plan. Ama bir çözüm göreceğim.
bueltge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.