C'è un modo semplice per sostituire un collegamento di menu personalizzato con una pagina o un post?


14

Ho cercato plugin e non ho trovato nulla e credo che questa dovrebbe essere una caratteristica fondamentale.

Il problema:

La metodologia corrente per la sostituzione di un collegamento personalizzato o di qualsiasi collegamento di menu è la seguente procedura:

  1. Rimuovi il vecchio link al menu
  2. Inserisci un nuovo link
  3. Trascina il nuovo link dalla fine dell'elenco
  4. Rilascia il nuovo link nella posizione desiderata
  5. ripetere i passaggi 3 e 4 fino a quando non si raggiunge il jackpot
  6. Immettere nuovamente le opzioni di menu (css, etichetta ecc.)

Perché è un problema

È molto inefficiente, soprattutto quando: (a) gestione di menu di grandi dimensioni (b) menu con molti livelli secondari (c) sostituzione di molte voci di menu con opzioni personalizzate

Requisiti della soluzione

  1. Mantiene la posizione / gerarchia del menu
  2. Conserva le opzioni (classe css, etichetta, titolo)
  3. Scegli tra pagine / post / categorie ecc

Dimostrazione

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

Dovrebbe essere così semplice:

inserisci qui la descrizione dell'immagine

Altre possibili idee sono la duplicazione / "aggiungi link figlio a questo" / o persino l'aggiunta di nuovi link in cima all'elenco anziché in fondo.

Qualsiasi feedback apprezzato.


4
+1 per una domanda ben formulata - Sono d'accordo con te, non è molto efficiente.
birgire,

3
Il problema con questa domanda è che non vedo alcuna soluzione semplice al problema che possa adattarsi al formato qui. Probabilmente è necessario apportare alcune modifiche alla funzionalità in diverse aree. Suggerisco di aprire un ticket in trac in quanto sembra una degna richiesta di funzionalità.
Mark Kaplun,

1
Forse puoi aggiungere la ricerca da TinyMCE per trovare post, pagine nel campo URL, script wplink.js
bueltge

1
@MarkKaplun Pensavo che qualcuno potesse conoscere un plugin impopolare o altrimenti privato per esso, comunque, ho seguito il tuo suggerimento e creato una richiesta trac @ core.trac.wordpress.org/ticket/34648 qual è il modo appropriato per porre fine a questa domanda su stackexchange ?
Aziz,

2
non finire, non tutte le domande hanno una risposta accettabile o addirittura valida. Alcune volte è bene sapere che anche altre persone stavano esaminando lo stesso problema e non hanno trovato una risposta, a volte qualcuno fa una risposta molto tardi
Mark Kaplun,

Risposte:


1

Sebbene questo non risponda direttamente alla domanda, il codice su cui si basa fornisce la funzionalità. Il codice impostato è:

funzione install_menus () {
    richiedono_once dirname (__FILE__). '/Data.php';
    $ menu = get_menus_data ();
    se (! vuoto ($ menu)) foreach ($ menu come $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

funzione create_nav_menu ($ menu) {
    if ($ esiste = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ esiste -> term_id;
          if (vuoto ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['nome']);
        } 
    }
    altro {
        $ menu_id = wp_create_nav_menu ($ menu ['nome']);
    }
    return $ menu_id;
}
funzione add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items as $ 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, array (
                    'menu-item-title' => __ ($ item ['title']),
                    'menu-item-classes' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'pubblica'
                    ));
            }
        }
    }
}
funzione menu_item_exists ($ slug, $ menu_id) {
    $ args = array (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publishing',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => true,
        'update_post_term_cache' => false); 

    $isting = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = false;
    foreach ($ esistente come $ esiste) {
        if (strpos ($ exist-> post_name, $ slug)! == FALSE) {// ricerca abbastanza buona (non esatta).
            $ found = true;
            rompere;
        }

    }
    return $ found;
}

e il file di dati è:

funzione get_menus_data () {
    $ items = array ( 
        Vettore ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 1, 
            'items' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // lo slug dovrebbe essere vuoto
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        Vettore ( 
            'name' => 'Menu secondario', 'slug' => 'menu secondario', 'build' => 0,
            'items' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1),
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        Vettore ( 
            'name' => 'Footer Menu', 'slug' => 'footer-menu', 'build' => 1,
            'items' => array (
                array ('title' => 'Terms', 'slug' => 'terms', 'build' => 1),
                array ('title' => 'Privacy', 'slug' => 'privacy', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    restituire $ articoli;
}

Un'interfaccia dovrebbe essere costruita sopra questo per consentire la selezione richiesta, ma questo codice funziona e testato.


Ciao, grazie per la tua risposta. Potresti per favore elaborare e spiegare il codice che hai pubblicato?
Aziz,

Se copi e incolli il codice in un plugin o nelle funzioni.php di un tema, è necessario creare le voci di menu contenute nella get_menus_data()funzione. Per ottenere un risultato di ricerca popolare in modo dinamico una voce di menu, sono necessarie funzioni che utilizzano l'API di WordPress per farlo. Queste funzioni fanno parte di un pacchetto autoinstallante completo mediante il quale è possibile configurare anticipatamente le voci di menu, eliminando idealmente la necessità di farlo dopo il fatto. Poiché queste funzioni forniscono il "lavoro dietro le quinte", potrebbero essere utilizzate come base per la funzionalità di ricerca che stai cercando.
cbos,

1

Non sono sicuro che questa sia una risposta, ma piuttosto un punto di discussione.

Qualcuno ha mai preso in considerazione campi personalizzati avanzati per la creazione di menu WP? L'ho fatto un paio di volte e mi permette di costruire una struttura personalizzata insieme ad attributi di voci di menu personalizzati e di creare l'HTML per il menu senza un complicato walker che sarebbe necessario con i menu WP predefiniti.

inserisci qui la descrizione dell'immagine

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

Questo è solo un rapido esempio, ma con le opzioni offerte da ACF, puoi aggiungere tutti i tipi di cose su una voce di menu e quindi codificare l'interfaccia utente a piacimento.

In applicazione alla tua domanda specifica, si potrebbe a sua volta applicare selezioni condizionali al tipo di collegamento che stai fornendo (vedi immagine allegata). ACF consente molti parametri diversi come collegamenti a pagine, collegamenti a categorie o URL semplici. Una selezione condizionale di questi elementi consentirebbe di modificare il tipo di voce di menu senza cancellare le classi o altri attributi.


Bello vedere suggerimenti - Sono sicuro che uno screenshot aiuterebbe a capire meglio la tua idea ;-)
birgire,

Non sono sicuro di poter ottenere una schermata così grande. Le funzionalità ACF nidificate possono diventare disordinate.
Tim Plummer,

0

Questo può aiutare a definire l'approccio giusto.

La filosofia fittizia alla base di WP spinge in primo luogo il modo in cui dispongono di menu di configurazione ed è solo uno dei motivi per cui WP può essere una cattiva scelta come framework per la gestione di un sito con grandi quantità di contenuti che cambiano spesso.

Nel tentativo di rendere la gestione dei contenuti la più falsa possibile, la blocca in paradigmi particolari che spesso creano lavoro extra, spesso senza una buona ragione. Non è possibile salvare i modelli di menu, né duplicare i menu esistenti, né memorizzare in modo sicuro le voci di menu riutilizzabili dei menu senza riscontrare la perdita di configurazione.

Mi piace il tuo suggerimento che sarebbe una buona alternativa ai formati di menu nativi che forniscono, in quanto è una buona via di mezzo tra l'approccio fittizio e allo stesso tempo offre molta più flessibilità e velocità di implementazione. E aggiungerei un parametro di ordinamento in alternativa al fastidioso processo di trascinamento della selezione che può creare così tanto armeggiare.

Tuttavia, mentre vorrei che la gestione dei menu in WP fosse cambiata, spingendo troppo in basso questo percorso è contro la filosofia principale del WP e potrebbe significare che non è più adatto al minimo comune denominatore che è in gran parte la ragione della popolarità di WP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.