カスタムメニュー項目をハードコードする方法


22

最初のテーマがインストールされたときにカスタムメニュー項目をハードコーディングできる方法はありますか?インストール時にいくつかの共通ページを自動的に作成するテーマを作成しています。クライアントが手動で追加する必要がないように、Wordpressカスタムメニューにも追加できるかどうかを知る必要がありますか?

つまり、プログラムでカスタムメニュー項目を挿入/作成する方法は?

不明な点があれば教えてください。適切なコーデックスページへのガイドを歓迎します。ありがとう!


更新:ここからコードを試しましたwp_nav_menu_itemsで特定のメニューをターゲットにします

メニュー登録:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

テンプレートの使用:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

新しいアイテムを追加するためのコード:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

functions.phpファイルのnavメニューに新しい項目を追加するためのコードを追加すると、管理パネルのメニューページでは何も起こりませんが、現在のメニュー項目はサイトにありません!

回答:


23

コードの問題は、実際にはメニューにリンクを追加せず、メニューの出力にのみ追加するため、フィルター(add_filter)を使用するため、実際にはメニューの出力をフィルタリングしなくてもメニューを使用すると、使用しているコードとともにリンクが表示されます。ただし、リンクを作成してメニューに追加するには、次のコードを使用できます。

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

簡単にするためにコメントしました。

子ページ/サブページ/セカンドレベルメニューを作成するには(どのように呼び出すこともできます)、menu-item-parent-id新しいアイテムに設定するだけです。たとえば:

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

また、コードで位置を設定することもできますが、menu-item-position これは次のように行われると思います:

  • 最初のアイテム-'menu-item-position' => 1
    • 最初のアイテムの最初の子-'menu-item-position' => 1
    • 最初のアイテム2番目の子-'menu-item-position' => 1
      • 最初のアイテム2番目の子最初の子-'menu-item-position' => 1
  • 2番目の項目-'menu-item-position' => 2
  • 3番目の項目-'menu-item-position' => 3
  • 4番目の項目-'menu-item-position' => 4

これらは、私は:)コーデックス探していた機能は、私は家の項目に項目の子を追加することができますどのようにこれら:(もう一つ質問が含まれていないされている私はあなたのようにすぐに私は私のPCに取得するようお知らせいたしますありがとうございました。。!
Sisir

@Sisir:子ページの作成方法の例を更新しました
Bainternet

@Bainternet:最初にコードを実行したときにこのエラーが発生しましたFatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25。しかし、メニューは作成され、ページが更新されるとすべてが機能しますが、Appearance -> Menu Theme Locationセクションには何も表示されません。私たちは本当に近いです:)ありがとう!
シシル

@Bainternet:私の推測では、コードを実行しようとするとコードがエラーになっ$locations = get_theme_mod('nav_menu_locations');ています。
シシル

@Sisir:コードは正常に機能しています。テーマの場所の名前は何ですか。使用している正確なコードを教えてください。
Bainternet

8

あなたの元のコードはお金に非常に近く、@ Bainternetによるこの長い解決策(攻撃なし)は過剰すぎると真剣に考えていますので、代わりにこれを見てください:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

唯一の問題は、関数が正しいメニューをチェックした後に$ itemsを返さず、チェックを行うために必要な2番目のコールバック引数($ args)がなかったことです。


この方法を使用して、メニュー項目の場所をどのように設定しますか?
マイケルN 14年

1

Wordpress 3.4.2にはバグがあります。

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

関係という用語を手動で作成する必要があります。

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

簡単なメニュー作成のMenuクラスの例については、https://gist.github.com/4148529を参照してください


0

詳細については、現在のユーザーは用語を追加する権限を持っている必要があります。wp_set_current_user(1)への呼び出しを追加する前に、menu_itemsは作成されましたが、テーブルwp_terms_relationshipには追加されませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.