Cum să afișezi doar submeniul folosind wp_nav_menu()
Folosesc acest cod pentru a afișa submeniul paginilor personalizate când te afli pe pagina părinte. Dar acest cod afișează și pagina părinte pe o pagină care nu are submeniu, lucru pe care aș dori să-l ascund. Practic, aș dori să folosesc acest cod doar dacă suntem pe o pagină care are subpagini.
class Selective_Walker extends Walker_Nav_Menu
{
function walk( $elements, $max_depth) {
$args = array_slice(func_get_args(), 2);
$output = '';
if ($max_depth < -1) //parametru invalid
return $output;
if (empty($elements)) //nu există elemente pentru parcurgere
return $output;
$id_field = $this->db_fields['id'];
$parent_field = $this->db_fields['parent'];
// afișare plată
if ( -1 == $max_depth ) {
$empty_array = array();
foreach ( $elements as $e )
$this->display_element( $e, $empty_array, 1, 0, $args, $output );
return $output;
}
/*
* trebuie să afișăm în ordine ierarhică
* separăm elementele în două grupuri: elemente de nivel superior și elemente copil
* children_elements este un array bidimensional, de ex.
* children_elements[10][] conține toate sub-elementele al căror părinte este 10.
*/
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e) {
if ( 0 == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[ $e->$parent_field ][] = $e;
}
/*
* când niciunul dintre elemente nu este de nivel superior
* presupunem că primul trebuie să fie rădăcina sub-elementelor
*/
if ( empty($top_level_elements) ) {
$first = array_slice( $elements, 0, 1 );
$root = $first[0];
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e) {
if ( $root->$parent_field == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[ $e->$parent_field ][] = $e;
}
}
$current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' ); //adăugat de continent7
foreach ( $top_level_elements as $e ){ //modificat de continent7
// coboară doar în arborele curent
$descend_test = array_intersect( $current_element_markers, $e->classes );
if ( !empty( $descend_test ) )
$this->display_element( $e, $children_elements, 2, 0, $args, $output );
}
/*
* dacă afișăm toate nivelurile și children_elements rămas nu este gol,
* atunci avem orfani, care ar trebui afișați oricum
*/
/* eliminat de continent7
if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
$empty_array = array();
foreach ( $children_elements as $orphans )
foreach( $orphans as $op )
$this->display_element( $op, $empty_array, 1, 0, $args, $output );
}
*/
return $output;
}
}
în șablon folosind:
wp_nav_menu(
array(
'theme_location'=>'primary',
'walker'=>new Selective_Walker()
)
);
Am întâmpinat aceeași problemă de multe ori în trecut cu WordPress. În alte CMS-uri pe care le-am folosit, meniurile aveau întotdeauna o opțiune pentru start_depth, ceea ce a făcut foarte ușor să implementez un meniu secundar sau terțiar (meniu divizat).
WordPress nu include această funcție; iar multe dintre soluțiile găsite online folosesc wp_list_pages, care ignoră complet ierarhia din managerul de meniuri.
După ce am încercat diferiți walkers și widget-uri, am decis în cele din urmă să scriu propriul meu plugin care are opțiunea start_depth încorporată.
Folosești astfel:
wp_nav_menu(array('theme_location' => 'primary_navigation', 'start_depth' => 1));
Pentru cei interesați, îl puteți obține gratuit din depozitul de plugin-uri WordPress: https://wordpress.org/plugins/wp-nav-plus/

Am creat un plugin gratuit care rezolvă această problemă!
https://wordpress.org/plugins/wp-nav-menu-extended/
Acest plugin extinde funcția wp_nav_menu din WordPress și adaugă opțiuni suplimentare:
- level : (integer) (obligatoriu pentru funcționarea acestui plugin) Nivelul din meniul de navigație care trebuie afișat. Dacă nu este specificat parametrul child_of, vor fi afișate toate elementele de acest nivel
- child_of : (string|integer) (opțional) Poate fi titlul sau ID-ul elementului părinte din meniu ale cărui elemente copil directe vor fi afișate
Exemplu de utilizare:
$defaults = array( 'theme_location' => 'main_menu', 'level' => 2, 'child_of' => 'Despre Noi', );
wp_nav_menu( $defaults );
