Чи є простий спосіб замінити користувацьке посилання на сторінку на сторінку чи публікацію?


14

Я шукав плагіни і нічого не міг знайти, і я вважаю, що це має бути основною особливістю.

Проблема:

Поточна методологія заміни користувацького посилання або будь-якого посилання в меню здійснюється за допомогою наступного процесу:

  1. Видалити старе посилання на меню
  2. Вставте нове посилання
  3. Перетягніть нове посилання з кінця списку
  4. Залиште нове посилання у потрібному місці
  5. повторюйте кроки 3 і 4, поки не потрапите в джекпот
  6. Знову введіть параметри меню (css, label тощо)

Чому це проблема

Це дуже неефективно, особливо коли: (a) обробка величезних меню (b) меню з багатьма підрівнями (c) заміна багатьох пунктів меню, які мають спеціальні параметри

Вимоги до рішення

  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

Хоча це не відповідає безпосередньо на питання, але код, на якому він заснований, забезпечує функціональність. Набір коду:

функція install_menus () {
    dirname Requ_once (__FILE__). '/data.php';
    $ меню = get_menus_data ();
    якщо (! порожнє ($ меню)) передбачити ($ меню як $ меню) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ меню);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

функція create_nav_menu ($ меню) {
    якщо ($ існує = wp_get_nav_menu_object ($ меню ['ім'я'])) {
        $ menu_id = $ існує -> term_id;
          if (порожній ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['ім'я']);
        } 
    }
    ще {
        $ menu_id = wp_create_nav_menu ($ menu ['ім'я']);
    }
    повернути $ menu_id;
}
функція add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items як $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Головна')? '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-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'опублікувати'
                    ));
            }
        }
    }
}
функція menu_item_exists ($ slug, $ menu_id) {
    $ args = масив (
        'замовити' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'опублікувати',
        'вихід' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => правда,
        'update_post_term_cache' => помилково); 

    $ існуючі = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = false;
    foreach ($ існує як $ існує) {
        if (strpos ($ postoji-> post_name, $ slug)! == FALSE) {// досить хороший пошук (не точний).
            $ found = вірно;
            перерву;
        }

    }
    повернути $ знайдено;
}

а файл даних:

функція get_menus_data () {
    $ items = масив ( 
        масив ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 1, 
            'items' => масив (
                array ('title' => 'Головна', 'slug' => '', 'build' => 1), // slug повинен бути порожнім
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        масив ( 
            'name' => 'Вторинне меню', 'slug' => 'другорядне меню', 'build' => 0,
            'items' => масив (
                array ('title' => 'Головна', 'slug' => '', 'build' => 1),
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        масив ( 
            'name' => 'Menu Footer', 'slug' => 'footer-menu', 'build' => 1,
            'items' => масив (
                array ('title' => 'Умови', 'slug' => 'умови', 'build' => 1),
                array ('title' => 'Конфіденційність', 'slug' => 'конфіденційність', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    повернути $ позиції;
}

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


Привіт, дякую за вашу відповідь. Чи можете ви, будь ласка, розробити та пояснити код, який ви опублікували?
Азіз

Якщо ви скопіюєте і вставте код у плагін або тему function.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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.