web-dev-qa-db-fra.com

Obtention d'éléments de menu tels que get_pages

J'ai besoin d'un moyen de créer un modèle HTML personnalisé pour la fonction wp_nav_menu. J'ai entendu parler de classes de marcheurs personnalisées, mais celles-ci ne semblent pas assez utiles pour réussir ce que j'essaie de faire. du moins autant que je sache en raison du manque de documentation sur les fonctions du marcheur. Ce que je dois faire, c'est pouvoir ajouter une classe "passable" à tous les éléments de menu de niveau supérieur. J'ai seulement besoin du menu pour aller sur deux niveaux; niveau supérieur, puis éléments de menu enfant. J'ai besoin d'ajouter une classe de "niveau supérieur" à tous les éléments d'ancrage d'élément de menu qui ont un sous-menu. J'ai besoin que toutes les listes de sous-menus aient la classe 'sub-nav'. Et je dois avoir tous les derniers éléments de la liste des sous-menus (li) pour avoir une classe 'dernier'.

Voici le code que j'ai en ce moment qui génère mon menu de la manière exacte dont j'ai besoin pour qu'il soit généré à l'aide de la fonction get_pages:

<?php
$pages = get_pages(array(
    'parent' => 0,
    'sort_order' => 'ASC',
    'sort_column' => 'menu_order'
));

$num_pages = count($pages);
$p = 0;

$exclude = '"pastor.php","service.php","gallery.php","audio.php","video.php"';
$exclude_list = $wpdb->get_results("SELECT GROUP_CONCAT(t1.ID) AS IDS FROM " . $wpdb->posts . " AS t1 INNER JOIN " . $wpdb->postmeta . " AS t2 ON (t1.ID = t2.post_id) WHERE t1.post_type = 'page' AND (t1.post_status = 'publish' OR t1.post_status = 'private') AND t2.meta_key = '_wp_page_template' AND t2.meta_value IN (" . $exclude . ")  ORDER BY t1.post_date DESC");

foreach($pages as &$page) :
    $children = get_pages(array(
        'sort_order' => 'ASC',
        'sort_column' => 'menu_order',
        'hierarchical' => 0,
        'childof' => $page->ID,
        'parent' => $page->ID,
        'exclude' => $exclude_list[0]->IDS
    ));
    $num_children = count($children);
    $has_children = $num_children > 0;
    ?>
    <li class="nav-item<?php echo ($has_children ? ' hoverable' : '') . ($num_pages == ++$p ? ' last' : '') . ($page->post_name === $root_parent->post_name ? ' active' : '')?>">
        <a href="<?php echo get_page_link($page->ID)?>" class="top-level"><?php echo $page->post_title?></a>

        <?php if($has_children) : ?>
            <ul class="sub-nav">
                <?php
                $c = 0;
                foreach($children as &$child) : ?>
                    <li class="nav-item<?php echo ($num_children == ++$c ? ' last' : '')?>">
                        <a href="<?php echo get_page_link($child->ID)?>"><?php echo $child->post_title?></a>
                    </li>
                <?php endforeach;?>
            </ul>
        <?php endif;?>
    </li>
    <?php
endforeach;
?>

Existe-t-il un moyen d'extraire les éléments de menu dans un tableau multidimensionnel d'ordre afin de pouvoir simplement les parcourir et générer le modèle ci-dessus manuellement, au lieu de tout cela wp_nav_menu et walker none

1
Sam

Oui il y a. Utilisez wp_get_nav_menu_items() à la place.

<?php $items = wp_get_nav_menu_items( $menu, $args ); ?> 


<?php $args = array(
    'order'                  => 'ASC',
    'orderby'                => 'menu_order',
    'post_type'              => 'nav_menu_item',
    'post_status'            => 'publish',
    'output'                 => ARRAY_A,
    'output_key'             => 'menu_order',
    'nopaging'               => true,
    'update_post_term_cache' => false ); ?>

Voici la page sur WordPress Codex

1
ifdion