最初のテーマをインストールしたときにカスタムメニュー項目をハードコードすることができる方法はありますか?インストール時にいくつかの共通ページを自動的に作成するテーマを作成しています。クライアントで手動で追加する必要がないように、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
ファイルのナビゲーションメニューに新しい項目を追加するためのコードを追加すると、管理パネルのメニューページにnothingsが発生しますが、現在のメニュー項目はサイトに表示されなくなります。
あなたのコードの問題は、実際にはメニューへのリンクとメニューの出力だけにリンクを追加していないということです。したがって、フィルタ(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);
}
私はそれをもっと簡単にするために全面的にコメントしました。
子ページ/サブページ/第2レベルのメニューを作成するには(どのくらいこれを呼び出してもかまいません)、新しいアイテムに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
を使ってコードで位置を設定することもできます。これは次のように行われると思います。
あなたの元のコードは 非常に近い お金に近いですそして私は@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 )がないことです。
Wordpress 3.4.2にはバグがあります。
手動で関係という用語を作成する必要があります。
$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 を参照してください。
情報については、現在のユーザは用語を追加する権限を持っている必要があります。私のmenu_itemsは作成されましたが、wp_set_current_user(1)への呼び出しを追加する前にテーブルwp_terms_relationshipに追加されませんでした。