web-dev-qa-db-ja.com

プログラムによるメニュー項目の追加機能は複数のメニューに複製

次のようなコードがあります。

add_filter( 'wp_nav_menu_objects', 'dynamically_add_shop_categories_to_submenu' );
function dynamically_add_shop_categories_to_submenu( $items ) {        
    $taxonomy_name = array( 
        'shop-category'
    );                
    $args = array(
        'orderby'    => 'name', 
        'order'      => 'ASC',
        'hide_empty' => true, 
        'fields'     => 'all', 
        'exclude'    => '160',
    );
    $terms = get_terms( $taxonomy_name, $args );
    $base = 'http://' . $_SERVER['HTTP_Host'] . '/businesses/';
    $bc = '&shop-category=';
    $bt = '?business-type=shops';             
    foreach ( $terms as $term ) {
        $shops = array (
            'title'            => $term->name,
            'menu_item_parent' => 1157,
            'ID'               => '',
            'db_id'            => '',
            'url'              => $base . $bt . $bc . $term->slug
        );        
        $items[] = (object) $shops;
    }
    return $items;    
}

これにより、 'shop-category'分類法のサブメニュー項目がID 1157のトップレベルメニューに正常に追加されます。これは予想どおりに機能します。

1157メニューに追加されるようにこれらの項目を指定しただけなので、これによって影響されないままで残っているより多くのトップレベルメニューがあります、それは正しいです。

ただし、このサイトのフッターにはさらに3つのメニューがあり、そのすべてにこれらのサブメニューが追加されています。なぜコードはそれをしているのですか?メニューにはIDがないように見えますが、コードを変更してそれらを除外するにはどうすればよいでしょうか。

2
pixelkicks

2番目の入力引数$argsを使用して特定のメニューをターゲットにすることができます。

これはあなたのニーズに合わせて調整できるいくつかのチェックを含む例です。

add_filter( 'wp_nav_menu_objects', function( $sorted_menu_items, $args )
{
    if( 
           'primary' === $args->theme_location   // Alternative
        && 'some_menu_slug' === $args->menu->slug  // Alternative
    ) {
        // Your stuff here ...
    }
    return $sorted_menu_items;
}, 10, 2 );

メニュー項目を追加すると、wp_postsテーブルに新しい行が作成されます。これはあなたが参照しているIDです。削除して再度追加すると、新しいIDが取得されます。そのため、メニューテーマの場所またはメニュースラッグをターゲティングすることをお勧めします。代わりに)。

例にカスタムメニュー項目を追加したときに、現在のメニューにmenu_item_parentが存在しない場合は、menu_item_parent = 0を持つ項目としてメニューに追加する必要があります。

2
birgire