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

14

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

Le problème:

La méthodologie actuelle pour remplacer un lien personnalisé ou tout lien de menu consiste à effectuer le processus suivant:

  1. Supprimer l'ancien lien du menu
  2. Insérer un nouveau lien
  3. Faites glisser un nouveau lien depuis 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 atteigniez 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) il s'agit de menus énormes (b) des menus avec de nombreux sous-niveaux (c) en remplaçant de nombreux éléments de menu qui ont des options personnalisées

Exigences de la solution

  1. Conserve la position / la hiérarchie du menu
  2. Conserve les options (classe CSS, étiquette, titre)
  3. Choisissez parmi les pages / messages / catégories, etc.

Manifestation

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

Cela devrait être aussi simple:

entrez la description de l'image ici

D'autres idées possibles sont la duplication / "ajouter un lien enfant à cela" / ou même l'ajout de nouveaux liens en haut de la liste au lieu du bas.

Tout commentaire apprécié.

Aziz
la source
4
+1 pour une question bien formulée - je suis d'accord avec vous, ce n'est pas très efficace.
birgire
3
Le problème avec cette question est que je ne vois pas de solution simple au problème qui puisse s'adapter au format ici. Il est probablement nécessaire de faire quelques ajustements de fonctionnalités dans plusieurs domaines. Je suggère d'ouvrir un ticket pour cela dans trac car cela ressemble à une demande de fonctionnalité digne.
Mark Kaplun
1
Peut-être que vous pouvez ajouter la recherche à partir du TinyMCE pour trouver les messages, les pages dans le champ URL, le script wplink.js
bueltge
1
@MarkKaplun Je pensais que quelqu'un pourrait connaître un plugin impopulaire ou autrement privé pour lui, de toute façon, j'ai suivi votre suggestion et créé une demande de trac @ core.trac.wordpress.org/ticket/34648 quelle est la façon appropriée de terminer cette question sur stackexchange ?
Aziz
2
ne vous y arrêtez pas, toutes les questions n'ont pas une réponse acceptable ou même valide. Parfois, il est bon de savoir que d'autres personnes ont également examiné le même problème et n'ont pas trouvé de réponse, parfois quelqu'un répond très tard
Mark Kaplun

Réponses:

1

Bien que cela ne réponde pas directement à la question, le code sur lequel il est basé fournit la fonctionnalité. L'ensemble de codes est le suivant:

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

function create_nav_menu ($ menu) {
    si ($ existe = wp_get_nav_menu_object ($ menu ['nom'])) {
        $ menu_id = $ existe -> term_id;
          if (vide ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['nom']);
        } 
    }
    autre {
        $ menu_id = wp_create_nav_menu ($ menu ['nom']);
    }
    return $ menu_id;
}
fonction 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' => 'publier'
                    ));
            }
        }
    }
}
fonction menu_item_exists ($ slug, $ menu_id) {
    $ args = tableau (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publier',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => vrai,
        'update_post_term_cache' => false); 

    $ existing = wp_get_nav_menu_items ($ menu_id, $ args);
    $ trouvé = faux;
    foreach ($ existant comme $ existe) {
        if (strpos ($ exist-> post_name, $ slug)! == FALSE) {// assez bonne recherche (pas exacte).
            $ trouvé = vrai;
            Pause;
        }

    }
    return $ found;
}

et le fichier de données est:

fonction get_menus_data () {
    $ items = array ( 
        tableau ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 1, 
            'items' => tableau (
                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' => 'Menu secondaire', 'slug' => 'menu secondaire', 'build' => 0,
            'items' => tableau (
                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),
                ),
        ),
        tableau ( 
            'name' => 'Footer Menu', 'slug' => 'footer-menu', 'build' => 1,
            'items' => tableau (
                array ('title' => 'Terms', 'slug' => 'terms', 'build' => 1),
                array ('title' => 'Privacy', 'slug' => 'privacy', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    retourner $ articles;
}

Une interface devrait être construite en plus de cela pour permettre la sélection demandée, mais ce code fonctionne et est testé.

cbos
la source
Bonjour, merci pour votre réponse. Pourriez-vous élaborer et expliquer le code que vous avez publié?
Aziz
Si vous copiez et collez le code dans un plugin ou le thème functions.php, il devrait créer les éléments de menu contenus dans la get_menus_data()fonction. Pour qu'un résultat de recherche remplisse dynamiquement un élément de menu, des fonctions sont nécessaires qui utilisent l'API WordPress pour ce faire. Ces fonctions font partie d'un package d'auto-installation complet par lequel les éléments de menu peuvent être configurés à l'avance, éliminant idéalement la nécessité de le faire après coup. Étant donné que ces fonctions fournissent le «travail en arrière-plan», elles pourraient être utilisées comme base pour la fonctionnalité de recherche que vous recherchez.
cbos
1

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

Quelqu'un a-t-il déjà envisagé des champs personnalisés avancés pour créer des 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 créer le code HTML du menu sans un marcheur compliqué qui serait nécessaire avec les menus WP par défaut.

entrez la description de l'image ici

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 n'est qu'un échantillon rapide, mais avec les options qu'ACF offre, vous pouvez coller toutes sortes de choses sur un élément de menu, puis coder l'interface utilisateur à volonté.

En application à votre question spécifique, on pourrait à son tour appliquer des sélections conditionnelles au type de lien que vous fournissez (voir l'image jointe). ACF autorise de nombreux paramètres différents tels que les liens de page, les liens de catégorie ou les URL directes. 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.

Tim Plummer
la source
Ravi de voir des suggestions - je suis sûr qu'une capture d'écran aiderait à mieux comprendre votre idée ;-)
birgire
Je ne suis pas sûr de pouvoir obtenir une capture d'écran aussi grande. Les fonctionnalités ACF imbriquées peuvent devenir un peu compliquées.
Tim Plummer
0

Cela peut aider à définir la bonne approche.

La philosophie factice de WP détermine la façon dont ils ont les menus de configuration en premier lieu, et n'est qu'une des raisons pour lesquelles WP peut être un mauvais choix en tant que cadre de gestion d'un site avec de grandes quantités de contenu souvent changeant.

En essayant de rendre la gestion de contenu aussi fictive que possible, elle l'enferme dans des paradigmes particuliers qui créent souvent du travail supplémentaire, souvent sans raison valable. Vous ne pouvez pas enregistrer de modèles de menu, ni dupliquer des 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 fournissent, car c'est un bon compromis entre l'approche à l'épreuve des faux, tout en offrant beaucoup plus de flexibilité et de vitesse de déploiement. Et j'ajouterais un paramètre de tri comme alternative au processus de glisser-déposer ennuyeux qui peut créer tellement de bidouilles.

Cependant, bien que je souhaite que la gestion des menus dans WP soit modifiée, pousser trop loin dans cette voie est contraire à la philosophie de base de WP et pourrait signifier qu'il ne répond plus au plus petit dénominateur commun, ce qui est en grande partie la raison de la popularité de WP.

garth
la source