web-dev-qa-db-fra.com

Existe-t-il un moyen simple de remplacer un lien de menu personnalisé par une page ou une publication?

J'ai cherché des plugins et je n'ai rien trouvé. Je pense que cela devrait être une fonctionnalité essentielle.

Le problème:

La méthodologie actuelle pour remplacer un lien personnalisé, ou n’importe quel lien de menu, est la suivante:

  1. Supprimer l'ancien lien de menu
  2. Insérer un nouveau lien
  3. Faites glisser le nouveau lien de la fin de la liste
  4. Déposer un nouveau lien à l'emplacement souhaité
  5. répétez les étapes 3 et 4 jusqu'à ce que vous touchiez le jackpot
  6. Entrez à nouveau les options de menu (css, étiquette, etc.)

Pourquoi est-ce un problème

Il est très inefficace, en particulier lorsque: (a) gérer des menus volumineux (b) des menus comportant de nombreux sous-niveaux (c) remplacer de nombreux éléments de menu comportant des options personnalisées

Configuration requise

  1. Conserve la position/hiérarchie du menu
  2. Conserve les options (classe css, étiquette, titre)
  3. Choisissez parmi Pages/Articles/Catégories etc.

Démonstration

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

Devrait être aussi simple que cela:

 enter image description here 

D'autres idées possibles sont la duplication/"ajouter un lien enfant à cette"/ou même l'ajout de nouveaux liens en haut de la liste plutôt qu'en bas.

Tout commentaire apprécié.

14
Aziz

Je ne suis pas sûr que ce soit une réponse, mais plutôt un sujet de discussion.

Quelqu'un a-t-il déjà envisagé d'utiliser des champs personnalisés avancés pour créer les menus WP? Je l'ai fait plusieurs fois, et cela me permet de créer une structure personnalisée avec des attributs d'élément de menu personnalisés et de générer le code HTML pour le menu sans passer par un marcheur compliqué qui serait nécessaire avec le paramètre par défaut WP menus.

 enter image description here 

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

Ceci est juste un exemple rapide, mais avec les options offertes par ACF, vous pouvez coller toutes sortes de choses sur un élément de menu, puis coder l'interface utilisateur à volonté.

En réponse à votre question, vous pouvez appliquer des sélections conditionnelles au type de lien que vous fournissez (voir l’image ci-jointe). ACF autorise de nombreux paramètres différents, tels que les liens de page, les liens de catégorie ou les URL simples. Une sélection conditionnelle de ces éléments permettrait de changer le type de l'élément de menu sans effacer les classes ou autres attributs.

1
Tim Plummer

Bien que cela ne réponde pas directement à la question, le code sur lequel il est basé fournit la fonctionnalité. Le code est:

function install_menus () {
 require_once dirname (__FILE__). '/data.php';
 $ menus = get_menus_data (); 
 if (! empty ($ menus)) poureach ($ menus as $ menu) {
 if ($ menu ['build']) {
 $ menu_id = create_nav_menu ($ menu); 
 add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']); 
} 
} 
} 
 
 function create_nav_menu ($ menu) {
 if ($ exist = wp_get_nav_menu_object ($ menu [' name ')) {
 $ menu_id = $ existe -> term_id; 
 if (vide ($ menu_id)) {
 $ menu_id = wp_create_nav_menu ($ menu [' nom ' ]); 
} 
} 
 else {
 $ menu_id = wp_create_nav_menu ($ menu ['name']); 
} 
 return $ menu_id; 
} 
 function add_items_to_menu ($ menu_id, $ slug, $ items) {
 if ($ items) pour chaque ($ items en tant que $ 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' => 'publier' 
)); 
} 
} 
} 
} 
 function menu_item_exists ($ slug, $ menu_id) {
 $ args = array (
 'order' => ' ASC ', 
' Orderby '=>' menu_order ', 
' Post_type '=>' nav_menu_item ', 
' Post_status '=>' publier ', 
 'output' => ARRAY_A, 
 'output_key' => 'menu_order', 
 'nopaging' => true, 
 'update_pos t_term_cache '=> false); 
 
 $ existant = wp_get_nav_menu_items ($ menu_id, $ args); 
 $ trouvé = faux; 
 pour chaque recherche ($ existant comme $ existe) {
 if (strpos ($ existe-> post_name, $ slug)! == FALSE) {// Très bonne recherche (pas exacte). 
 $ found = true; 
 break; 
} 
 
} 
 return $ found; 
}

et le fichier de données est:

function get_menus_data () {
 $ items = array (
 array (
 'name' => 'Menu principal', 'slug' => 'menu principal', 'construire '=> 1, 
' Items '=> array (
 Array (' title '=>' Home ',' slug '=>' ',' build '=> 1),// slug doit être vide 
 array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1), 
 array ('title' => 'About', 'slug' => 'about', 'build' => 1), 
 Array ('title' => 'Contact', 'slug' => 'contact', 'build' = > 1), 
), 
), 
 Tableau (
 'Name' => 'Secondary Menu', 'slug' => 'secondary-menu' , 'build' => 0, 
 'items' => array (
 array ('title' => 'Home', 'slug' => '', 'build' => 1 ), 
 array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1), 
 array ('title' => 'À propos de' , 'slug' => 'about', 'build' = > 1), 
 Tableau ('titre' => 'Contact', 'slug' => 'contact', 'build' => 1), 
), 
) , 
 array (
 'name' => 'Footer Menu', 'slug' => 'footer-menu', 'build' => 1, 
 'items' = > tableau (
 tableau ('titre' => 'Conditions', 'slug' => 'termes', 'build' => 1), 
 tableau ('titre' => 'Confidentialité ',' slug '=>' privacy ',' build '=> 1), 
 array (' title '=>' Contact ',' slug '=>' contact ',' build '=> 1 ), 
), 
) 
); 
 renvoyer des éléments $; 
}

Une interface doit être construite au-dessus pour permettre la sélection demandée, mais ce code fonctionne et a été testé.

1
cbos

Cela peut aider à définir la bonne approche.

La philosophie fictive derrière WP détermine en premier lieu la manière dont ils ont les menus de configuration. C’est l’une des raisons pour lesquelles WP peut être un mauvais choix en tant que cadre pour gérer un site avec de grandes quantités de contenu souvent changeant.

En essayant de rendre la gestion de contenu aussi factice que possible, elle la verrouille dans des paradigmes particuliers qui créent souvent un travail supplémentaire, souvent sans raison valable. Vous ne pouvez pas enregistrer les modèles de menu, ni dupliquer les menus existants, ni stocker en toute sécurité des éléments de menu réutilisables sans subir de perte de configuration.

J'aime votre suggestion qui serait une bonne alternative aux formats de menu natifs qu’ils proposent, car c’est un bon compromis entre l’approche factice, tout en offrant beaucoup plus de flexibilité et de rapidité de déploiement. Et j'ajouterais un paramètre de tri comme alternative au processus fastidieux de glisser-déposer qui peut créer tellement de manipulations.

Cependant, bien que je veuille que la gestion des menus dans WP soit modifiée, aller trop loin dans cette voie va à l'encontre de la philosophie de base WP et pourrait signifier qu'elle ne répond plus aux besoins des utilisateurs. plus petit dénominateur commun, ce qui explique en grande partie la popularité de WP.

0
garth