有没有一种简单的方法可以用页面或帖子替换自定义菜单链接?


14

我一直在寻找插件,却找不到任何东西,我相信这应该是核心功能。

问题:

当前替换自定义链接或任何菜单链接的方法是通过执行以下过程:

  1. 删除旧菜单链接
  2. 插入新链接
  3. 从列表末尾拖动新链接
  4. 将新链接放在所需位置
  5. 重复步骤3和4,直到您中奖为止
  6. 再次输入菜单选项(css,标签等)

为什么会出问题

这是非常低效的,尤其是在以下情况下:(a)处理大型菜单(b)具有许多子级别的菜单(c)替换许多具有自定义选项的菜单项

解决方案要求

  1. 保留菜单位置/层次
  2. 保留选项(css类,标签,标题)
  3. 从页面/帖子/类别等中选择

示范

http://puu.sh/laSEi/81b0d41705.png

应该就是这么简单:

在此处输入图片说明

其他可能的想法是复制/“将子链接添加到此” /,甚至将新链接添加到列表的顶部而不是底部。

任何反馈表示赞赏。


4
为一个精心设计的问题+1-我同意你的看法,这不是很有效。
birgire 2015年

3
这个问题的问题是我看不到任何适合这里格式的简单解决方案。可能需要在几个方面进行一些功能调整。我建议在追踪中打开一张票,因为这听起来像是一项有价值的功能要求。
马克·卡普伦

1
也许您可以从TinyMCE中添加搜索,以找到帖子,URL字段中的页面,脚本wplink.js
bueltge 2015年

1
@MarkKaplun我以为有人可能会为它了解一个不受欢迎的或其他私有插件,无论如何,我按照您的建议创建了追踪请求@ core.trac.wordpress.org/ticket/34648什么是在stackexchange上结束此问题的合适方法是什么?
阿齐兹2015年

2
不要结束,并非所有问题都有可接受甚至有效的答案。有时候,很高兴知道其他人也在看同一个问题,但没有找到答案,有时有人确实回答了很晚
Mark Kaplun 2015年

Answers:


1

尽管这不能直接回答问题,但它所基于的代码提供了功能。代码集为:

函数install_menus(){
    require_once dirname(__FILE__)。'/data.php';
    $ menus = get_menus_data();
    if(!empty($ menus))foreach($ menus as $ menu){
        如果($ menu ['build']){
            $ menu_id = create_nav_menu($ menu);
            add_items_to_menu($ menu_id,$ menu ['slug'],$ menu ['items']);
        }
    }
}

函数create_nav_menu($ menu){
    if($ exists = wp_get_nav_menu_object($ menu ['name'])){
        $ menu_id = $ exists-> term_id;
          if(空($ menu_id)){
            $ menu_id = wp_create_nav_menu($ menu ['name']);
        } 
    }
    其他{
        $ menu_id = wp_create_nav_menu($ menu ['name']);
    }
    返回$ menu_id;
}
函数add_items_to_menu($ menu_id,$ slug,$ items){
    if($ items)foreach($ items as $ item){
        如果($ item ['build']){
            $ slug =($ item ['title'] =='Home')吗?'home':$ item ['slug'];
            如果(!menu_item_exists($ slug,$ menu_id)){
                wp_update_nav_menu_item($ menu_id,0,array(
                    'menu-item-title'=> __($ item ['title']),
                    'menu-item-classes'=>'',
                    'menu-item-url'=> home_url($ item ['slug']。'/'), 
                    '菜单项状态'=>'发布'
                    ));
            }
        }
    }
}
功能menu_item_exists($ slug,$ menu_id){
    $ args =数组(
        '订单'=>'ASC',
        'orderby'=>'menu_order',
        'post_type'=>'nav_menu_item',
        'post_status'=>'发布',
        '输出'=> ARRAY_A,
        '输出密钥'=>'菜单顺序',
        'nopaging'=>是的,
        'update_post_term_cache'=>假); 

    $ existing = wp_get_nav_menu_items($ menu_id,$ args);
    $ found = false;
    foreach($ existing as $ exists){
        if(strpos($ exists-> post_name,$ slug)!== FALSE){//很好的搜索(不精确)。
            $ found = true;
            打破;
        }

    }
    返回$ found;
}

数据文件是:

函数get_menus_data(){
    $ items =数组( 
        数组( 
            '名称'=>'主菜单','子弹'=>'主菜单','生成'=> 1, 
            'items'=>数组(
                array('title'=>'Home','slug'=>'','build'=> 1),// slug应该为空
                数组('title'=>'Blog','slug'=>'blog','build'=> 1),
                数组('title'=>'About','slug'=>'about','build'=> 1),
                数组('title'=>'Contact','slug'=>'contact','build'=> 1),
                ),
        ),
        数组( 
            'name'=>'Secondary Menu','slug'=>'secondary-menu','build'=> 0,
            'items'=>数组(
                数组('title'=>'Home','slug'=>``,'build'=> 1),
                数组('title'=>'Blog','slug'=>'blog','build'=> 1),
                数组('title'=>'About','slug'=>'about','build'=> 1),
                数组('title'=>'Contact','slug'=>'contact','build'=> 1),
                ),
        ),
        数组( 
            'name'=>'Footer Menu','slug'=>'footer-menu','build'=> 1,
            'items'=>数组(
                数组('title'=>'Terms','slug'=>'terms','build'=> 1),
                数组('title'=>'Privacy','slug'=>'privacy','build'=> 1),
                数组('title'=>'Contact','slug'=>'contact','build'=> 1),
                ),
            ) 
    );
    返回$ items;
}

需要在此之上构建一个接口,以允许进行选择,但是此代码正在运行并经过测试。


您好,谢谢您的回答。您能详细解释一下您发布的代码吗?
阿齐兹2015年

如果将代码复制并粘贴到插件或主题的functions.php中,则应创建get_menus_data()函数中包含的菜单项。为了使搜索结果动态地填充菜单项,需要使用WordPress API的功能。这些功能是完整的自安装程序包的一部分,通过该程序包可以预先配置菜单项,理想情况下,无需再执行此操作。由于这些功能提供了“幕后工作”,因此它们可以用作您所追求的搜索功能的基础。
cbos

1

我不确定这是否是答案,但更多的是讨论点。

有没有人考虑过使用高级自定义字段来构建WP菜单?我已经做过几次,它使我能够构建自定义结构以及自定义菜单项属性,并为菜单构建HTML,而无需使用默认WP菜单所需要的复杂的Walker。

在此处输入图片说明

ACF

if( function_exists('acf_add_local_field_group') ):

acf_add_local_field_group(array (
    'key' => 'group_56532ec144a4b',
    'title' => 'Menu',
    'fields' => array (
        array (
            'key' => 'field_5653338918f43',
            'label' => 'Menus',
            'name' => 'menus',
            'type' => 'flexible_content',
            'instructions' => '',
            'required' => 0,
            'conditional_logic' => 0,
            'wrapper' => array (
                'width' => '',
                'class' => '',
                'id' => '',
            ),
            'button_label' => 'Add Menu',
            'min' => '',
            'max' => '',
            'layouts' => array (
                array (
                    'key' => '56533396b10bc',
                    'name' => 'menu',
                    'label' => 'Menu',
                    'display' => 'block',
                    'sub_fields' => array (
                        array (
                            'key' => 'field_56533fc6f25e7',
                            'label' => 'Menu Name',
                            'name' => 'menu__name',
                            'type' => 'text',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'default_value' => '',
                            'placeholder' => '',
                            'prepend' => '',
                            'append' => '',
                            'maxlength' => '',
                            'readonly' => 0,
                            'disabled' => 0,
                        ),
                        array (
                            'key' => 'field_56532ec718f40',
                            'label' => 'Menu Items',
                            'name' => 'menu__items',
                            'type' => 'flexible_content',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'button_label' => 'Add Menu Item',
                            'min' => '',
                            'max' => '',
                            'layouts' => array (
                                array (
                                    'key' => '56532eee6ef81',
                                    'name' => 'menuItem',
                                    'label' => 'Menu Item',
                                    'display' => 'block',
                                    'sub_fields' => array (
                                        array (
                                            'key' => 'field_56532f0418f41',
                                            'label' => 'Label',
                                            'name' => 'menuITem__label',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565333d218f45',
                                            'label' => 'Class',
                                            'name' => 'menuItem__class',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565342ef11b29',
                                            'label' => 'Link Type',
                                            'name' => 'menuItem__type',
                                            'type' => 'radio',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 25,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'choices' => array (
                                                'page' => 'Page',
                                                'cat' => 'Category',
                                                'url' => 'URL',
                                                'cust' => 'Custom',
                                            ),
                                            'other_choice' => 0,
                                            'save_other_choice' => 0,
                                            'default_value' => '',
                                            'layout' => 'vertical',
                                        ),
                                        array (
                                            'key' => 'field_56532f2d18f42',
                                            'label' => 'Page',
                                            'name' => 'menuItem__page',
                                            'type' => 'page_link',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'page',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'post_type' => array (
                                            ),
                                            'taxonomy' => array (
                                            ),
                                            'allow_null' => 0,
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653434f11b2a',
                                            'label' => 'Category',
                                            'name' => 'menuItem__cat',
                                            'type' => 'taxonomy',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cat',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'taxonomy' => 'category',
                                            'field_type' => 'select',
                                            'allow_null' => 0,
                                            'add_term' => 1,
                                            'save_terms' => 0,
                                            'load_terms' => 0,
                                            'return_format' => 'id',
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653439311b2c',
                                            'label' => 'Custom',
                                            'name' => 'menuItem__cstm',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cust',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653437011b2b',
                                            'label' => 'URL',
                                            'name' => 'menuItem__url',
                                            'type' => 'url',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'url',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                        ),
                                    ),
                                    'min' => '',
                                    'max' => '',
                                ),
                            ),
                        ),
                    ),
                    'min' => '',
                    'max' => '',
                ),
            ),
        ),
    ),
    'location' => array (
        array (
            array (
                'param' => 'options_page',
                'operator' => '==',
                'value' => 'acf-options-theme-options',
            ),
        ),
    ),
    'menu_order' => 0,
    'position' => 'normal',
    'style' => 'default',
    'label_placement' => 'top',
    'instruction_placement' => 'label',
    'hide_on_screen' => '',
    'active' => 1,
    'description' => '',
));

endif;

用户体验

function acfMenu($name) {
    if( function_exists('get_field') ) :
        $getMenus = get_field('menus', 'option');
        foreach($getMenus as $menuData) : 
            if( $menuData['menu__name'] == $name ) : 
              // Do stuff to build your menu
            endif;
        endforeach;
    endif;
}

这只是一个简单的示例,但是使用ACF提供的选项,您可以将各种内容添加到菜单项上,然后随意编写UI。

在解决您的特定问题时,可以依次将条件选择应用于您提供的链接类型(请参见下图)。ACF允许许多不同的参数,例如页面链接,类别链接或直接URL。这些项目的有条件选择将允许您更改菜单项的类型,而无需删除类或其他属性。


很高兴看到建议-我相信屏幕截图会帮助您更好地理解您的想法;-)
birgire

我不确定我能得到这么大的屏幕截图。嵌套的ACF功能可能会有些混乱。
Tim Plummer

0

这可能有助于定义正确的方法。

WP背后的虚拟化原理推动了他们首先拥有设置菜单的方式,而这只是WP不能作为处理大量经常更改内容的网站的框架的最佳选择的原因之一。

在尝试使内容管理尽可能地虚假证明时,它将其锁定在特定的范例中,这通常会产生额外的工作,而这通常是没有充分理由的。您不能保存菜单模板,也不能复制现有菜单,也不能安全存储菜单可重复使用的菜单项而不会丢失配置。

我喜欢您的建议,这将是它们提供的本机菜单格式的不错选择,因为它是防伪方法之间的良好中间地带,同时仍提供了更大的灵活性和部署速度。我将添加一个sort参数作为烦人的拖放过程的替代方法,该过程可能会造成很大的麻烦。

但是,尽管我希望更改WP中的菜单管理,但将这一路径推得太远违反了WP的核心哲学,可能意味着它不再适应最低的公分母,这在很大程度上是WP受欢迎的原因。 WP。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.