要查看如何创建这样的列表,请查看中的代码wp-admin/includes/nav-menu.php
. 不幸的是,它是硬编码的,所以您必须重新创建代码。
首先,让我们创建two menus:
我们可以使用PHP获取这些菜单wp_get_nav_menus()
(包装get_terms()
):
$menus = wp_get_nav_menus();
print \'<pre>\' . htmlspecialchars( print_r( $menus, TRUE ) ) . \'</pre>\';
输出:
Array
(
[0] => stdClass Object
(
[term_id] => 5
[name] => Paradigmatic Inconvenience
[slug] => paradigmatic-inconvenience
[term_group] => 0
[term_taxonomy_id] => 5
[taxonomy] => nav_menu
[description] =>
[parent] => 0
[count] => 0
)
[1] => stdClass Object
(
[term_id] => 6
[name] => Paul
[slug] => paul
[term_group] => 0
[term_taxonomy_id] => 6
[taxonomy] => nav_menu
[description] =>
[parent] => 0
[count] => 0
)
)
现在,我们构建选择器函数:
/**
* Build a dropdown selector for all existing nav menus.
*
* @author Thomas Scholz, toscho.de
* @param string $name Used as name attribute for the select element.
* @param string $selected Slug of the selected menu
* @param bool $print Print output or just return the HTML.
* @return string
*/
function t5_nav_menu_drop_down( $name, $selected = \'\', $print = TRUE )
{
// array of menu objects
$menus = wp_get_nav_menus();
$out = \'\';
// No menu found.
if ( empty ( $menus ) or is_a( $menus, \'WP_Error\' ) )
{
// Give some feedback …
$out .= __( \'There are no menus.\', \'t5_nav_menu_per_post\' );
// … and make it usable …
if ( current_user_can( \'edit_theme_options\' ) )
{
$out .= sprintf(
__( \' <a href="%s">Create one</a>.\', \'t5_nav_menu_per_post\' ),
admin_url( \'nav-menus.php\' )
);
}
// … and stop.
$print and print $out;
return $out;
}
// Set name and ID to let you use a <label for=\'id_$name\'>
$out = "<select name=\'$name\' id=\'id_$name\'>\\n";
foreach ( $menus as $menu )
{
// Preselect the active menu
$active = $selected == $menu->slug ? \'selected\' : \'\';
// Show the description
$title = empty ( $menu->description ) ? \'\' : esc_attr( $menu->description );
$out .= "\\t<option value=\'$menu->slug\' $active $title>$menu->name</option>\\n";
}
$out .= \'</select>\';
$print and print $out;
return $out;
}
正在调用此函数…
t5_nav_menu_drop_down( \'my_nav_select\', \'paul\' );
…将为我们提供一个漂亮、简单的选择元素
\'paul\'
预选:
现在我们需要一个元框来为我们的文章作者提供选择器。简而言之,我只使用了我Basic Meta Box. 基本上,您可以调用meta框中的函数,并将菜单slug另存为post meta。
然后您可以访问所选nav menu slug 在您的主题中,根据:
get_post_meta( get_the_ID(), \'_t5_nav_menu_per_post\', TRUE );
另一种获取
full nav menu 在您的主题中:
// Print a wp_nav_menu
do_action(
\'t5_custom_nav_menu\',
// an array of wp_nav_menu() arguments.
array (
\'menu\' => \'default-menu\',
// you may set a custom post ID
\'post_id\' => get_the_ID()
)
);
因为我非常喜欢你的想法,我添加了一个主题助手功能,并将所有内容都添加到插件中。在GitHub上获取:
T5 Nav Menu Per Post.
哦,欢迎使用WordPress堆栈交换。只要你提出并回答有趣的问题,就不要担心你的英语
更新以将插件与自定义帖子类型一起使用,如portfolio
只需安装插件,激活它并将以下代码添加到注册自定义帖子类型的文件中:
add_filter( \'t5_nav_menu_per_post_post_types\', \'wpse41695_add_post_type\' );
function wpse41695_add_post_type( $post_types )
{
$post_types[] = \'portfolios\';
return $post_types;
}
您的代码仍然存在许多问题:全局变量、缺少前缀、奇怪的缩进。建议阅读:
Coding Standards 和
prefix everything.