web-dev-qa-db-ja.com

Wp_nav_menuに静的アイテムを追加する

私はWordpressのメニューに静的メニュー項目を追加しようとしています。これはfunctions.phpでフィルタ 'wp_nav_menu_items'を使っています。動作しますが、メニューコンテナタグの下には配置されません。

function add_nav_menu_items( $items , $args ) { ?>
    <ul>
        <li><a href="#">PRODUCTS</a>
            <ul>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Sci-Fi')));?>">SCI-FI</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'scifi','showposts'=>-1,'order'=>'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Drama')));?>">Drama</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'drama','showposts'=>-1,'order'=>'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Horror')));?>">HORROR</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'horror','showposts'=>-1,'order'=> 'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
<?php return $items;}

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

私はコードをオンラインで置くとき、このようにそれを見せる

<div id="navigation_top">
    <div id="navmenu_top">
        <ul>  **-->> This is my static menu**
            <li>  
        </ul>
        <ul id="menu-menu-1" class="menu-container">  **-->> This is WP_nav_menu**
            <li class="type menu-item-object-page menu-item-587">
            <li class="type menu-item-object-page menu-item-122">
            <li class="type menu-item-object-page menu-item-121">
            **I want my menu appear here **  
        </ul>
    </div>
</div>

とにかく私はこれを行うことができますか?

何かアドバイスをありがとう...

2
drgky

PRODUCTSメニューが最初に表示されるのは、フィルタ機能の一部としてページに表示されているからです。フィルタに期待されることは、あなたの関数が引数、この場合は$itemsを受け取り、それを修正し、そしてそれを返してコアコードによって使用されることです。

PRODUCTSメニューを生成するコードを書き直さなくても済むように、出力バッファを利用します。

add_filter( 'wp_nav_menu_items', 'add_nav_menu_items', 10, 2 );
function add_nav_menu_items( $items, $args ) {
     ob_start(); // start the output buffer
     ?>
     <ul>
        <li><a href="#">PRODUCTS</a>
            <ul>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Sci-Fi')));?>">SCI-FI</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'scifi','showposts'=>-1,'order'=>'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Drama')));?>">Drama</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'drama','showposts'=>-1,'order'=>'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
                <li><a href="<?php echo esc_url(get_category_link(get_cat_ID('Horror')));?>">HORROR</a>
                    <ul>
                        <?php query_posts( array ('post_type'=>'horror','showposts'=>-1,'order'=> 'ASC') ); while ( have_posts() ) : the_post(); ?>
                            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                        <?php endwhile; wp_reset_query(); ?>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
    <?php
    $products = ob_get_clean(); // store all output from above
    return $items . $products; // add stored output to end of $items and return
}
1
karpstrucking

代わりにコンテナーをハードコーディングし、以下のように削除します。

$args = array(
    'theme_location' => 'XXX',
    'container' => false
)

そしてそれをwp_nav_menuの周りにハードコーディングして、必要な場所に静的セクションを追加することを忘れないでください。

echo '<ul>';
echo '<li><a href="http://...">Static Link</a></li>';
wp_nav_menu($args);
echo '</ul>';

あなたはあなたが望むあなたのナビゲーションを構築するためにその情報を使うことができます。基本的に、コンテナを削除すると、リンクが入ったLI要素がたくさん表示されるので、必要な場所にwp_nav_menuを配置し、それをコーディングします。

1
efreeman