web-dev-qa-db-ja.com

Get_pagesのようなメニュー項目を取得する

Wp_nav_menu関数用のカスタムHTMLテンプレートを作成する方法が必要です。私はカスタムウォーカークラスについて聞いたことがありますが、これらは私がやろうとしていることを達成するのに十分に役立つとは思われません。少なくとも私の知る限りでは、ウォーカー機能に関する文書がないためです。私がする必要があるのは、すべてのトップレベルのメニュー項目に「可愛らしい」クラスを追加できるということです。私はメニューが2つのレベルに行くために必要なだけです。最上位レベル、次に子メニュー項目。サブメニューを持つすべてのメニュー項目のアンカー要素に「最上位」クラスを追加する必要があります。すべてのサブメニューリストにクラス 'sub-nav'が必要です。そして、最後のサブメニューリスト項目(li)をすべて 'last'にする必要があります。

これは、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;
?>

このようにwp_nav_menuやwalkerを無意味にする代わりに、メニュー項目を順番に反復して上記のテンプレートを手動で生成できるように、メニュー項目を多次元配列で取得する方法はありますか。

1
Sam

はいあります。代わりにwp_get_nav_menu_items()を使用してください。

<?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 ); ?>

これが WordPress Codexのページです

1
ifdion