Czy istnieje prosty sposób zastąpienia niestandardowego łącza menu stroną lub postem?

14

Szukałem wtyczek i nie mogłem nic znaleźć i uważam, że powinna to być podstawowa funkcja.

Problem:

Obecna metodologia zastępowania niestandardowego łącza lub dowolnego łącza menu polega na wykonaniu następującego procesu:

  1. Usuń stary link menu
  2. Wstaw nowy link
  3. Przeciągnij nowy link z końca listy
  4. Upuść nowy link w wybranej lokalizacji
  5. powtarzaj kroki 3 i 4, aż trafisz jackpota
  6. Wprowadź ponownie opcje menu (css, etykieta itp.)

Dlaczego to jest problem?

Jest to bardzo nieefektywne, szczególnie gdy: (a) radzenie sobie z dużymi menu (b) menu z wieloma podpoziomami (c) zastępowanie wielu pozycji menu z niestandardowymi opcjami

Wymagania dotyczące rozwiązania

  1. Zachowuje pozycję / hierarchię menu
  2. Zachowuje opcje (klasa css, etykieta, tytuł)
  3. Wybierz spośród stron / postów / kategorii itp

Demonstracja

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

Powinno być tak proste:

wprowadź opis zdjęcia tutaj

Inne możliwe pomysły to powielanie / „dodawanie łącza potomnego do tego” / lub nawet dodawanie nowych linków na górze listy zamiast na dole.

Wszelkie opinie są mile widziane.

Aziz
źródło
4
+1 za dobrze sformułowane pytanie - zgadzam się z tobą, nie jest to zbyt wydajne.
birgire,
3
Problem z tym pytaniem polega na tym, że nie widzę żadnego prostego rozwiązania problemu, który pasowałby do tego formatu. Prawdopodobnie istnieje potrzeba wprowadzenia korekt funkcjonalności w kilku obszarach. Sugeruję, aby otworzyć bilet na trac, ponieważ brzmi to jak godna prośba o funkcję.
Mark Kaplun,
1
Może możesz dodać wyszukiwanie z TinyMCE, aby znaleźć posty, strony w polu adresu URL, skrypt wplink.js
bueltge
1
@MarkKaplun Myślałem, że ktoś może poznać niepopularną lub w inny sposób prywatną wtyczkę, w każdym razie zastosowałem się do Twojej sugestii i utworzyłem polecenie śledzenia śledzenia core.trac.wordpress.org/ticket/34648 jaki jest właściwy sposób zakończenia tego pytania na stackexchange ?
Aziz,
2
nie kończ tego, nie wszystkie pytania mają akceptowalną lub nawet prawidłową odpowiedź. Czasami dobrze jest wiedzieć, że inni również patrzyli na ten sam problem i nie znaleźli odpowiedzi, czasem ktoś bardzo późno udziela odpowiedzi
Mark Kaplun

Odpowiedzi:

1

Chociaż nie odpowiada to bezpośrednio na pytanie, kod, na którym jest oparty, zapewnia funkcjonalność. Zestaw kodów to:

funkcja install_menus () {
    nazwa_kontroli_zadania (__FILE__). „/data.php”;
    $ menu = get_menus_data ();
    if (! puste ($ menu)) foreach ($ menu jako $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

funkcja create_nav_menu ($ menu) {
    if ($ istnieje = wp_get_nav_menu_object ($ menu ['nazwa'])) {
        $ menu_id = $ istnieje -> term_id;
          if (pusty ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    jeszcze {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    return $ menu_id;
}
funkcja add_items_to_menu ($ menu_id, $ slug, $ items) {
    jeśli ($ items) foreach ($ items as $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Home')? „home”: $ item ['slug'];
            if (! menu_item_exists ($ ślimak, $ menu_id)) {
                wp_update_nav_menu_item ($ identyfikator_menu, 0, tablica (
                    „menu-item-title” => __ ($ item ['title']),
                    'menu-item-class' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    „menu-item-status” => „opublikuj”
                    ));
            }
        }
    }
}
funkcja menu_item_exists ($ ślimak, $ menu_id) {
    $ args = tablica (
        „zamówienie” => „ASC”,
        'orderby' => 'menu_order',
        „post_type” => „nav_menu_item”,
        „post_status” => „opublikuj”,
        „wynik” => ARRAY_A,
        'output_key' => 'menu_order',
        „nopaging” => true,
        'update_post_term_cache' => false); 

    $ exist = wp_get_nav_menu_items ($ id_menu, $ args);
    $ znaleziono = fałsz;
    foreach ($ istnieje, ponieważ $ istnieje) {
        if (strpos ($ istnieje-> nazwa postu, $ ślimak)! == FAŁSZ) {// całkiem dobre wyszukiwanie (nie jest dokładne).
            $ znaleziono = prawda;
            przerwa;
        }

    }
    zwróć $ znaleziono;
}

a plik danych to:

funkcja get_menus_data () {
    $ items = tablica ( 
        tablica ( 
            „name” => „Main Menu”, „slug” => „main-menu”, „build” => 1, 
            „items” => tablica (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // ślimak powinien być pusty
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                tablica („tytuł” ​​=> „Kontakt”, „ślimak” => „kontakt”, „kompilacja” => 1),
                ),
        ),
        tablica ( 
            „name” => „Secondary Menu”, „slug” => „wtórne menu”, „build” => 0,
            „items” => tablica (
                array ('title' => 'Home', 'slug' => '', 'build' => 1),
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                tablica („tytuł” ​​=> „Kontakt”, „ślimak” => „kontakt”, „kompilacja” => 1),
                ),
        ),
        tablica ( 
            „name” => „Footer Menu”, „slug” => „footer-menu”, „build” => 1,
            „items” => tablica (
                tablica („tytuł” ​​=> „Warunki”, „ślimak” => „warunki”, „kompilacja” => 1),
                array ('title' => „Privacy”, „slug” => „privacy”, „build” => 1),
                tablica („tytuł” ​​=> „Kontakt”, „ślimak” => „kontakt”, „kompilacja” => 1),
                ),
            ) 
    );
    zwrócić $ przedmiotów;
}

Musi zostać zbudowany interfejs, aby umożliwić wybór, o który prosi się, ale ten kod działa i jest testowany.

cbos
źródło
Witam, dziękuję za odpowiedź. Czy mógłbyś opracować i wyjaśnić kod, który opublikowałeś?
Aziz,
Jeśli skopiujesz i wkleisz kod do wtyczki lub funkcji motywu. Php powinien utworzyć pozycje menu zawarte w get_menus_data()funkcji. Aby wynik wyszukiwania dynamicznie wypełniał element menu, potrzebne są funkcje korzystające z interfejsu API WordPress. Funkcje te są częścią kompletnego pakietu samoinstalacyjnego, dzięki któremu elementy menu mogą być konfigurowane z wyprzedzeniem, co idealnie eliminuje konieczność wykonania tego po fakcie. Ponieważ funkcje te zapewniają „działanie za kulisami”, można je wykorzystać jako podstawę poszukiwanej funkcji wyszukiwania.
cbos,
1

Nie jestem pewien, czy to odpowiedź, ale raczej kwestia dyskusji.

Czy ktoś kiedykolwiek rozważał zaawansowane niestandardowe pola do tworzenia menu WP? Zrobiłem to kilka razy i pozwala mi to zbudować niestandardową strukturę wraz z niestandardowymi atrybutami pozycji menu i rozwinąć HTML dla menu bez skomplikowanego walkera, który byłby potrzebny z domyślnymi menu WP.

wprowadź opis zdjęcia tutaj

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;
}

To tylko krótka próbka, ale dzięki opcjom, które oferuje ACF, możesz przypiąć wszelkiego rodzaju rzeczy do elementu menu, a następnie dowolnie kodować interfejs użytkownika.

W zależności od konkretnego pytania można z kolei zastosować selekcję warunkową do rodzaju dostarczanego linku (patrz załączony obraz). ACF pozwala na wiele różnych parametrów, takich jak linki do stron, linki kategorii lub proste adresy URL. Warunkowy wybór tych elementów pozwoliłby zmienić typ pozycji menu bez usuwania klas lub innych atrybutów.

Tim Plummer
źródło
Miło widzieć sugestie - jestem pewien, że zrzut ekranu pomoże lepiej zrozumieć Twój pomysł ;-)
birgire
Nie jestem pewien, czy mogę zrobić tak duży zrzut ekranu. Zagnieżdżone funkcje ACF mogą być nieco nieporządne.
Tim Plummer,
0

Może to pomóc w zdefiniowaniu właściwego podejścia.

Filozofia manekina leżąca u podstaw WP decyduje przede wszystkim o sposobie konfigurowania menu i jest tylko jednym z powodów, dla których WP może być złym wyborem jako platforma do obsługi witryny z dużą ilością często zmieniających się treści.

Starając się, aby zarządzanie treścią było jak najbardziej atrapą dowodu, blokuje je w określonych paradygmatach, co często tworzy dodatkową pracę, często bez uzasadnionego powodu. Nie można zapisywać szablonów menu, powielać istniejących menu ani bezpiecznie przechowywać elementów menu wielokrotnego użytku bez utraty konfiguracji.

Podoba mi się twoja sugestia, która byłaby dobrą alternatywą dla natywnych formatów menu, które zapewniają, ponieważ jest to dobry środek między podejściami odpornymi na atrapę, a jednocześnie oferuje znacznie większą elastyczność i szybkość wdrażania. Dodałbym parametr sortujący jako alternatywę dla irytującego procesu przeciągania i upuszczania, który może powodować tak wiele zamieszania.

Chociaż chciałbym jednak zmienić zarządzanie menu w WP, zbyt daleko posunięcie tej ścieżki jest sprzeczne z podstawową filozofią WP i może oznaczać, że nie jest już zgodne z najniższym wspólnym mianownikiem, który jest w dużej mierze przyczyną popularności WP.

garth
źródło