Есть ли простой способ заменить пользовательскую ссылку меню на страницу или сообщение?

14

Я искал плагины и не смог ничего найти, и я считаю, что это должно быть основной функцией.

Проблема:

Текущая методология замены пользовательской ссылки или любой ссылки в меню заключается в выполнении следующего процесса:

  1. Удалить старую ссылку меню
  2. Вставить новую ссылку
  3. Перетащите новую ссылку из конца списка
  4. Перетащите новую ссылку в нужное место
  5. повторяйте шаги 3 и 4, пока не получите джекпот
  6. Введите параметры меню снова (CSS, метка и т. Д.)

Почему это проблема?

Это очень неэффективно, особенно когда: (а) работа с огромными меню (б) меню с большим количеством подуровней (в) замена множества пунктов меню, которые имеют пользовательские опции

Требования к решению

  1. Сохраняет позицию меню / иерархию
  2. Сохраняет параметры (класс CSS, метка, заголовок)
  3. Выберите из Страницы / Сообщения / Категории и т. Д.

демонстрация

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

Должно быть так просто:

введите описание изображения здесь

Другими возможными идеями являются дублирование / «добавить дочернюю ссылку к этому» / или даже добавление новых ссылок вверху списка, а не внизу.

Любые отзывы приветствуются.

Азиз
источник
4
+1 за хорошо сформулированный вопрос - я согласен с вами, это не очень эффективно.
Birgire
3
Проблема с этим вопросом заключается в том, что я не вижу простого решения проблемы, которое могло бы соответствовать формату здесь. Там, вероятно, необходимо внести некоторые функциональные корректировки в нескольких областях. Я предлагаю открыть тикет для него в trac, так как это звучит как достойный запрос.
Марк Каплун
1
Может быть, вы можете добавить поиск из TinyMCE, чтобы найти посты, страницы в поле URL, скрипт wplink.js
bueltge
1
@MarkKaplun Я думал, что кто-то может знать непопулярный или иным образом приватный плагин для него, так или иначе, я последовал вашему предложению и создал запрос trac @ core.trac.wordpress.org/ticket/34648, каков подходящий способ закончить этот вопрос на stackexchange ?
Азиз
2
не заканчивайте это, не все вопросы имеют приемлемый или даже действительный ответ. Иногда полезно знать, что другие люди также смотрели на ту же проблему и не нашли ответа, иногда кто-то делает очень запоздалый ответ
Марк Каплун

Ответы:

1

Хотя это не дает прямого ответа на вопрос, код, на котором он основан, обеспечивает функциональность. Кодовый набор:

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

функция create_nav_menu ($ menu) {
    if ($ exist = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ существующие -> 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 как $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Home')? 'home': $ item ['slug'];
            if (! menu_item_exists ($ slug, $ menu_id)) {
                wp_update_nav_menu_item ($ menu_id, 0, массив (
                    'menu-item-title' => __ ($ item ['title']),
                    'menu-item-classes' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'Опубликовать'
                    ));
            }
        }
    }
}
function menu_item_exists ($ slug, $ menu_id) {
    $ args = array (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publish',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => правда,
        'update_post_term_cache' => false); 

    $ существующие = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = false;
    foreach ($ существует как $ существует) {
        if (strpos ($ exist-> post_name, $ slug)! == FALSE) {// довольно хороший поиск (не точный).
            $ found = true;
            перемена;
        }

    }
    вернуть $ найдено;
}

и файл данных:

function get_menus_data () {
    $ items = array ( 
        массив ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 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' => 'second-menu', 'build' => 0,
            'items' => array (
                массив ('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' => array (
                массив ('title' => 'Terms', 'slug' => 'rules', 'build' => 1),
                массив ('title' => 'Privacy', 'slug' => 'privacy', 'build' => 1),
                массив ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    вернуть $ предметов;
}

Вдобавок к этому нужно было бы построить интерфейс, чтобы обеспечить выбор, который запрашивается, но этот код работает и проверен.

ОБО
источник
Здравствуйте, спасибо за ваш ответ. Не могли бы вы уточнить и объяснить код, который вы разместили?
Азиз
Если вы копируете и вставляете код в плагин или в файл functions.php темы, он должен создать пункты меню, содержащиеся в get_menus_data()функции. Для того, чтобы результат поиска динамически заполнял пункт меню, необходимы функции, которые используют для этого API WordPress. Эти функции являются частью полного самоустановочного пакета, с помощью которого элементы меню можно настраивать заранее, в идеале исключая необходимость делать это после факта. Так как эти функции обеспечивают «скрытую работу», они могут использоваться в качестве основы для функции поиска, к которой вы стремитесь.
cbos
1

Я не уверен, что это ответ, а скорее предмет для обсуждения.

Кто-нибудь когда-нибудь рассматривал расширенные пользовательские поля для создания меню WP? Я делал это пару раз, и это позволяет мне создавать пользовательскую структуру вместе с пользовательскими атрибутами пунктов меню и создавать HTML-код для меню без сложного обходчика, который был бы необходим для стандартных меню WP.

введите описание изображения здесь

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;

UX

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, вы можете прикрепить все элементы к элементу меню и затем кодировать пользовательский интерфейс по своему желанию.

Применительно к вашему конкретному вопросу можно, в свою очередь, применить условный выбор к тому типу ссылки, которую вы предоставляете (см. Прикрепленное изображение). ACF допускает множество различных параметров, таких как ссылки на страницы, ссылки на категории или прямые URL-адреса. Условный выбор этих пунктов позволил бы изменить тип пункта меню, не стирая классы или другие атрибуты.

Тим Пламмер
источник
Приятно видеть предложения - я уверен, что скриншот поможет лучше понять вашу идею ;-)
birgire
Я не уверен, что смогу сделать такой снимок экрана. Вложенные функции ACF могут быть немного грязными.
Тим Пламмер
0

Это может помочь определить правильный подход.

Философия пустышки, лежащая в основе WP, определяет способ настройки меню в первую очередь и является лишь одной из причин, по которым WP может оказаться плохим выбором в качестве основы для работы с сайтом с большим количеством часто меняющегося контента.

Пытаясь сделать управление контентом как можно более фиктивным доказательством, оно привязывает его к определенным парадигмам, что часто создает дополнительную работу, часто без веской причины. Вы не можете ни сохранять шаблоны меню, ни дублировать существующие меню, ни безопасно хранить пункты меню, которые можно использовать повторно, без потери конфигурации.

Мне нравится ваше предложение, которое было бы хорошей альтернативой родным форматам меню, которые они предоставляют, поскольку оно является хорошим промежуточным звеном между подходом, обеспечивающим защиту от пустышек, и в то же время предлагает гораздо большую гибкость и скорость развертывания. И я бы добавил параметр сортировки в качестве альтернативы надоедливому процессу перетаскивания, который может создать много поводов для беспокойства.

Однако, хотя я бы хотел, чтобы управление меню в WP было изменено, слишком далеко продвигаться по этому пути противоречит основной философии WP, и это может означать, что он больше не удовлетворяет наименьшему общему знаменателю, что в значительной степени является причиной популярности WP.

огороженное место
источник