¿Hay alguna manera fácil de reemplazar un enlace de menú personalizado con una página o publicación?

14

Busqué complementos y no pude encontrar nada y creo que esta debería ser una característica central.

El problema:

La metodología actual para reemplazar un enlace personalizado o cualquier enlace de menú es mediante el siguiente proceso:

  1. Eliminar el antiguo enlace del menú
  2. Insertar nuevo enlace
  3. Arrastre un nuevo enlace desde el final de la lista
  4. Suelta el nuevo enlace en la ubicación deseada
  5. repita los pasos 3 y 4 hasta llegar al premio gordo
  6. Ingrese las opciones del menú nuevamente (css, etiqueta, etc.)

Por qué es un problema

Es muy ineficiente, especialmente cuando: (a) trata con menús enormes (b) menús con muchos subniveles (c) reemplaza muchos elementos de menú que tienen opciones personalizadas

Requisitos de la solución

  1. Conserva la posición / jerarquía del menú
  2. Opciones de retención (clase css, etiqueta, título)
  3. Elija entre páginas / publicaciones / categorías, etc.

Demostración

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

Debería ser así de simple:

ingrese la descripción de la imagen aquí

Otras ideas posibles son duplicar / "agregar un enlace secundario a esto" / o incluso agregar nuevos enlaces al principio de la lista en lugar de al final.

Cualquier comentario apreciado.

Aziz
fuente
44
+1 para una pregunta bien formulada: estoy de acuerdo con usted, no es muy eficiente.
Birgire
3
El problema con esta pregunta es que no veo ninguna solución simple para el problema que pueda ajustarse al formato aquí. Probablemente sea necesario realizar algunos ajustes de funcionalidad en varias áreas. Sugiero abrir un ticket para él en trac, ya que parece una solicitud de función digna.
Mark Kaplun
1
Tal vez pueda agregar la búsqueda desde TinyMCE para encontrar las publicaciones, páginas en el campo URL, script wplink.js
bueltge
1
@ MarkKaplun Pensé que alguien podría conocer un plugin impopular o privado para él, de todos modos, seguí su sugerencia y creé una solicitud de seguimiento @ core.trac.wordpress.org/ticket/34648 cuál es la forma adecuada de finalizar esta pregunta en stackexchange ?
Aziz
2
no lo termine, no todas las preguntas tienen una respuesta aceptable o incluso válida. Algunas veces es bueno saber que otras personas también estaban viendo el mismo problema y no encontraron una respuesta, a veces alguien responde muy tarde
Mark Kaplun

Respuestas:

1

Aunque esto no responde directamente a la pregunta, el código en el que se basa proporciona la funcionalidad. El conjunto de códigos es:

función 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 ($ menú);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

función create_nav_menu ($ menu) {
    if ($ exist = wp_get_nav_menu_object ($ menu ['nombre'])) {
        $ menu_id = $ existe -> term_id;
          if (vacío ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['nombre']);
        } 
    }
    más {
        $ menu_id = wp_create_nav_menu ($ menu ['nombre']);
    }
    return $ menu_id;
}
función add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items como $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Inicio')? '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' => 'publicar'
                    ));
            }
        }
    }
}
función menu_item_exists ($ slug, $ menu_id) {
    $ args = array (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publicar',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => verdadero,
        'update_post_term_cache' => falso); 

    $ existente = wp_get_nav_menu_items ($ menu_id, $ args);
    $ encontrado = falso;
    foreach ($ existente como $ existe) {
        if (strpos ($ exist--> post_name, $ slug)! == FALSE) {// muy buena búsqueda (no exacta).
            $ encontrado = verdadero;
            descanso;
        }

    }
    return $ encontrado;
}

y el archivo de datos es:

función get_menus_data () {
    $ items = array ( 
        matriz ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 1, 
            'items' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // slug debe estar vacío
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        matriz ( 
            'name' => 'Menú secundario', 'slug' => 'secundario-menú', '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),
                ),
        ),
        matriz ( 
            '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),
                ),
            ) 
    );
    devolver $ artículos;
}

Se necesitaría construir una interfaz además de esto para permitir la selección que se solicita, pero este código está funcionando y probado.

cbos
fuente
Hola, gracias por tu respuesta. ¿Podría por favor elaborar y explicar el código que publicó?
Aziz
Si copia y pega el código en un complemento o en las funciones de un tema.php, debería crear los elementos de menú contenidos en la get_menus_data()función. Para que un resultado de búsqueda llene dinámicamente un elemento del menú, se necesitan funciones que utilicen la API de WordPress para hacerlo. Estas funciones son parte de un paquete completo de autoinstalación mediante el cual los elementos del menú se pueden configurar de antemano, idealmente eliminando la necesidad de hacer esto después del hecho. Dado que estas funciones proporcionan el "trabajo detrás de escena", podrían usarse como base para la funcionalidad de búsqueda que busca.
cbos
1

No estoy seguro de que sea una respuesta, sino más bien un punto de discusión.

¿Alguien ha considerado Campos personalizados avanzados para crear menús WP? Lo he hecho un par de veces, y me permite construir una estructura personalizada junto con atributos de elementos de menú personalizados y construir el HTML para el menú sin un caminante complicado que sería necesario con los menús WP predeterminados.

ingrese la descripción de la imagen aquí

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

Esta es solo una muestra rápida, pero con las opciones que ofrece ACF, puede agregar todo tipo de cosas a un elemento del menú y luego codificar la IU a voluntad.

En aplicación a su pregunta específica, uno a su vez podría aplicar selecciones condicionales a qué tipo de enlace está suministrando (ver imagen adjunta). ACF permite muchos parámetros diferentes, como enlaces de página, enlaces de categoría o URL directas. Una selección condicional de estos elementos permitiría cambiar el tipo de elemento del menú sin borrar clases u otros atributos.

Tim Plummer
fuente
Niza para ver sugerencias - Estoy seguro de que una captura de pantalla ayudaría a entender mejor su idea ;-)
birgire
No estoy seguro de poder obtener una captura de pantalla tan grande. Las funciones de ACF anidadas pueden ser un poco desordenadas
Tim Plummer
0

Esto puede ayudar a definir el enfoque correcto.

La filosofía ficticia detrás de WP impulsa la forma en que tienen menús de configuración en primer lugar, y es solo una de las razones por las que WP puede ser una mala elección como marco para manejar un sitio con grandes cantidades de contenido que cambia con frecuencia.

Al tratar de hacer que la gestión de contenido sea lo más ficticia posible, la encierra en paradigmas particulares que a menudo crean trabajo extra, a menudo sin una buena razón. No puede guardar plantillas de menú, ni duplicar menús existentes, ni almacenar de forma segura elementos de menú reutilizables de menú sin experimentar pérdida de configuración.

Me gusta su sugerencia, que sería una buena alternativa a los formatos de menú nativos que ofrecen, ya que es un buen punto intermedio entre el enfoque a prueba de simulaciones y ofrece una mayor flexibilidad y velocidad de implementación. Y agregaría un parámetro de ordenación como alternativa al molesto proceso de arrastrar y soltar que puede crear tantos problemas.

Sin embargo, aunque quisiera que se cambiara la gestión de menús en WP, ir demasiado lejos en este camino va en contra de la filosofía central de WP y podría significar que ya no atiende al mínimo común denominador, que es en gran parte la razón de la popularidad de WP.

Garth
fuente