Özel Gezinme yürüteç mevcut menü öğesi çocuk veya hiçbir çocuk kardeş görüntülemek


14

Ben etrafında karışıklık / saat arıyor ve hala bu işe alamıyorum, bu yüzden sonunda veriyorum ve bazı yardım istiyorum.

Ben sadece geçerli sayfaları çocuk gösteren özel bir yürüteç yazmaya çalışıyorum, ya da çocuk yoksa sayfalar kardeşleri görüntülemek.

Örneğin, aşağıdaki menü ağacını alın:

  • 1.0
    • 1.2.0
      • 1.3.0
      • 1.3.1
      • 1.3.2
    • 1.2.1
    • 1.2.2
  • 2.0

Mevcut sayfa 1.2.0'da olduğumu varsayalım. Bu sayfada çocuklarını göstermek istiyorum (1.3.0, 1.3.1, 1.3.2)

Ancak, ben 1.2.2 sayfasında ise, herhangi bir çocuğu olmadığı için, onun mevcut düzey kardeşler göstermelidir, bu yüzden bana göstermelidir (1.2.0, 1.2.1, 1.2.2).


4
Lütfen çözümünüzü başkaları için daha açık olması ve soruların siteyi yanıtsız bırakmaması için bir cevaba taşıyın.
Rarst

@Rarst ne dedi! Bir çözüm bulacağınızı neredeyse özledim.
Chris Krycho

Necro cevap. Yaklaşık 2 yıl önce SO hakkında aşağı yukarı aynı soruyu çok iyi bir cevapla sordum. stackoverflow.com/questions/5826609/…
Stoosh

Cevabı ayrı cevap için soru içinde taşıdı. OP: Lütfen takip et.
kaiser

Yanıtlar:


4

Bu, yürürlükteki menü öğesinin yalnızca alt öğelerini görüntülemek için kullandığım yürüteç. Ya da kendi çocuğu yoksa kardeşler menü öğeleri.

Sınıf boyunca her bölümü açıklayan yorumlar var

<?php

class SH_Child_Only_Walker extends Walker_Nav_Menu {

private $ID;
private $depth;
private $classes = array();
private $child_count = 0;
private $have_current = false;


// Don't start the top level
function start_lvl(&$output, $depth=0, $args=array()) {

    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::start_lvl($output, $depth,$args);
}

// Don't end the top level
function end_lvl(&$output, $depth=0, $args=array()) {
    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::end_lvl($output, $depth,$args);
}

// Don't print top-level elements
function start_el(&$output, $item, $depth=0, $args=array()) {

    $is_current = in_array('current-menu-item', $this->classes);

    if( 0 == $depth || ! $is_current )
        return;

    parent::start_el($output, $item, $depth, $args);
}

function end_el(&$output, $item, $depth=0, $args=array()) {
    if( 0 == $depth )
        return;

    parent::end_el($output, $item, $depth, $args);
}

// Only follow down one branch
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

    // Check if element is in the current tree to display
    $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );
    $this->classes = array_intersect( $current_element_markers, $element->classes );

    // If element has a 'current' class, it is an ancestor of the current element
    $ancestor_of_current = !empty($this->classes);

    // check if the element is the actual page element we are on.
    $is_current = in_array('current-menu-item', $this->classes);

    // if it is the current element
    if($is_current) {

        // set the count / ID / and depth to use in the other functions.
        $this->child_count = ( isset($children_elements[$element->ID]) ) ? count($children_elements[$element->ID]) : 0;
        $this->ID = $element->ID;
        $this->depth = $depth;
        $this->have_current = true;

        if($this->child_count > 0) {

            // if there are children loop through them and display the kids.
            foreach( $children_elements[$element->ID] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        } else {
            // no children so loop through kids of parent item.
            foreach( $children_elements[$element->menu_item_parent] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        }
    }

    // if depth is zero and not in current tree go to the next element
    if ( 0 == $depth && !$ancestor_of_current)
        return;

    // if we aren't on the current element proceed as normal
    if(! $this->have_current )
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}

Bir wp_nav_menu üzerindeki diğer herhangi bir özel yürüteçle yaptığınız gibi ekleyin

<?php
wp_nav_menu( array(
    'menu' => 'primary-menu'
    ,'container' => 'nav'
    ,'container_class' => 'subpages'
    ,'depth' => 0
    ,'walker' => new SH_Child_Only_Walker()
 ));
?>

@ Stoosh'un buraya işaret ettiği yorumu belirtmek istiyorum. stackoverflow.com/questions/5826609/… Bu başka bir iyi çözümdür
jchamb

0

Buna benzer birşey yaşadım. Sayfa mantığını yürüteç dışına taşımayı düşünmek isteyebilirsiniz. Temel olarak, geçerli sayfa hiyerarşisini nesne olarak derleyin. Ardından wp_nav_menu işlevinde 'exclude' parametresini kullanın. Artık hariç tutulan sayfalar, geçerli sayfanın alt öğesi olup olmadığına bağlı olacaktır. Hiçbir çocuk kardeş göstermiyorsa; çocuklar && bu çocuklar çizginin sonu ise kardeşler ve çocuklar; çocuklar ve torunlar varsa kardeşleri dışarıda bırakın ve çocuklara ve torunlara gösterin.


Bahsettiğiniz bu excludeparametre nedir ? Belgelere bakıyorum ve herhangi bir referans görmüyorum.
Chris Krycho

1
Yanlış yaptığım için özür dilerim. 'Hariç tut' parametresi olmadığından emin olursunuz. "Wp_list_pages" işlevini kullanmak istedim.
Steve Fischer

Çok iyi ve endişelenme. Belgelenmemiş bir şey olup olmadığını merak ettim ama arka uçta - bunun daha önce olduğunu gördüm. Temizlediğiniz için teşekkürler! wp_list_pages()Bu bağlamda kullanmayı düşünmemiştim, bu yüzden bu ilginç bir fikir.
Chris Krycho
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.