向POST管理员添加导航菜单

时间:2012-02-09 作者:user12932

我想插入一个带有菜单列表的下拉菜单,这是我在nav菜单中创建的。php,发布管理。。。

例如,当我创建一篇文章时,我想在一篇文章中插入一个菜单“Paul”(只有我想要的一篇文章),在Admin post的右侧栏中选择一个菜单。

我已复制了行:

add_action( \'init\', \'register_my_menus\' );
function register_my_menus() {
    register_nav_menus(
        array(
            \'primary-menu\' => __( \'Primary Menu\' ),
            \'personal-menu\' => __( \'Personal Menu\' )
        )
    );
} 
在一个岗位上。字段。我创建的php不起作用:(

Link to existing code.

你能帮我解决这个奇妙的问题吗(

ps:对不起,我的英语不好

弗朗西斯科

2 个回复
SO网友:fuxia

要查看如何创建这样的列表,请查看中的代码wp-admin/includes/nav-menu.php. 不幸的是,它是硬编码的,所以您必须重新创建代码。

首先,让我们创建two menus:

enter image description here

我们可以使用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\' 预选:

enter image description here

现在我们需要一个元框来为我们的文章作者提供选择器。简而言之,我只使用了我Basic Meta Box. 基本上,您可以调用meta框中的函数,并将菜单slug另存为post meta。

enter image description here

然后您可以访问所选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 Standardsprefix everything.

SO网友:kpb

在自定义post\\u类型方面存在相同的问题,无法保存数据。这是因为它失败了save_allowed() 在里面basic_meta_box.php.

current_user_can(\'edit_\'.$_POST[\'post_type\'],$post_id) 具有自定义post类型的解析为current_user_can(\'edit_portfolio\',$post_id) - 在wordpress中失败。需要更改为有效的功能,如edit_others_pagesedit_pages.

结束