¿Cómo puedo permitir comas en los nombres de etiquetas?

5 ago 2011, 11:53:55
Vistas: 14.2K
Votos: 15

¿Quiero permitir comas en los nombres de etiquetas? Por ejemplo, "hola, mundo" o "portland, o" pero WordPress sigue separándolas. Puedo hacerlo desde la página de categorías:

image http://img839.imageshack.us/img839/6869/picturepp.png

Y se muestra correctamente. Pero cualquier cosa añadida desde la barra lateral de entradas no se muestra bien aquí:

image http://img52.imageshack.us/img52/4950/picture1oax.png

Hay alguna discusión sobre esto aquí: http://core.trac.wordpress.org/ticket/14691 pero parece que no se resolverá, al menos por un tiempo.

Mientras tanto, busco una solución más fácil que añadir categorías desde la página de categorías.

He intentado buscar plugins, y no vi ninguno que fuera útil. Hay algunos que tratan con reemplazar comas con otros caracteres al mostrar una lista de categorías o etiquetas, pero no veo ningún plugin que permita al usuario reemplazar el separador predeterminado.

No me importa si tengo que modificar el núcleo yo mismo. Idealmente podría escribir un plugin, pero después de revisar parte del código no puedo descubrir dónde se maneja esto.

¿Alguien tiene una solución o consejos sobre qué funciones y javascript empezar a modificar? No estoy seguro de dónde empezar a buscar en el código.

5
Comentarios

¿Alguna suerte con lograr esto? Yo también estoy buscando una solución.

supertrue supertrue
20 oct 2011 21:54:37

Acabo de agregarlos desde la página de categorías (como se mencionó arriba). Es inconveniente pero funciona. No he tenido suerte modificando el núcleo o agregando un filtro (todavía).

cwd cwd
21 oct 2011 18:22:04

Nunca modifiques el núcleo ;)

Jared Jared
31 ene 2012 18:42:30

@Jared - está bien modificar el núcleo - siempre y cuando envíes tu problema/parche a core.trac.wordpress.org y estés dispuesto a mantener el parche en tu instalación hasta que (con suerte) sea incorporado al núcleo ;)

cwd cwd
31 ene 2012 21:39:05

En ese caso, tienes razón. :)

Jared Jared
31 ene 2012 23:56:32
Todas las respuestas a la pregunta 5
3

No se necesita modificar el núcleo -- gracias a: HOOKS.

Los hooks permiten solucionar el problema con una buena combinación de:

  • un filtro que reemplaza "--" por ", " antes de la salida
  • y un bloque "if" para asegurar que la salida no se filtre también en la interfaz de administración :)
  • y finalmente, guardando todas tus etiquetas con coma en el formato "Fox--Peter" en lugar de "Fox, Peter"

Aquí está el código:

// filtro para etiquetas con coma
//  reemplaza '--' con ', ' en la salida - permite etiquetas con coma de esta manera
//  ej. guardar etiqueta como "Fox--Peter" pero mostrar gracias a los filtros como "Fox, Peter"

if(!is_admin()){ // asegurar que los filtros solo se llamen en el frontend
    function comma_tag_filter($tag_arr){
        $tag_arr_new = $tag_arr;
        if($tag_arr->taxonomy == 'post_tag' && strpos($tag_arr->name, '--')){
            $tag_arr_new->name = str_replace('--',', ',$tag_arr->name);
        }
        return $tag_arr_new;    
    }
    add_filter('get_post_tag', 'comma_tag_filter');

    function comma_tags_filter($tags_arr){
        $tags_arr_new = array();
        foreach($tags_arr as $tag_arr){
            $tags_arr_new[] = comma_tag_filter($tag_arr);
        }
        return $tags_arr_new;
    }
    add_filter('get_terms', 'comma_tags_filter');
    add_filter('get_the_terms', 'comma_tags_filter');
}

Quizás algunos detalles adicionales en mi publicación de blog sobre este tema también ayuden... http://blog.foobored.com/all/wordpress-tags-with-commas/

Saludos, Andi

15 jun 2012 02:47:24
Comentarios

Esto fallará. La coma no es una cadena fija, puede traducirse. Usa _x( ',', 'delimitador de etiquetas' ) para capturar el delimitador real.

fuxia fuxia
15 jun 2012 16:24:12

Aún no lo he probado pero se ve bien - gracias

cwd cwd
26 jun 2012 21:23:31

En tu sitio también tienes las taxonomías personalizadas, sugiero que cambies los nombres de las funciones para aquellos que no puedan entenderlo. En el código personalizado que escribiste: comma_tags_filter en lugar de 'comma_tags_filter' lo cual afecta bastante el código. En general, buen trabajo.

David H David H
17 jun 2014 18:13:07
0

Las comas en los nombres de las etiquetas no funcionarán correctamente porque, al añadir la etiqueta a una publicación, WordPress la interpretará como múltiples palabras clave, dividiendo en la coma.

Una solución sencilla:

Usa , (el código HTML para la coma) en lugar de una coma normal.

Entonces:

  • , se mostrará como una coma en las publicaciones, títulos de páginas de etiquetas y muchos otros lugares.
  • Se mostrará en crudo, como ,, dentro de la interfaz de administración al escribir el nombre de la etiqueta.

Para tu información, usar la entidad HTML, ,, no funciona.

23 nov 2019 14:21:14
5

Aquí tienes la solución. Presta atención a la línea 2614:

    /**
2588   * Actualiza la caché para ID(s) de Términos.
2589   *
2590   * Solo actualizará la caché para términos que no estén ya en caché.
2591   *
2592   * Los $object_ids esperan que los IDs estén separados por comas si es una
2593   * cadena de texto.
2594   *
2595   * Cabe destacar que update_object_term_cache() consume mucho tiempo. Se
2596   * recomienda no llamar a esta función con frecuencia o al menos no para una
2597   * gran cantidad de términos que existan en muchas taxonomías. El tiempo aumenta
2598   * por cada término y también por cada taxonomía a la que pertenezca el término.
2599   *
2600   * @package WordPress
2601   * @subpackage Taxonomy
2602   * @since 2.3.0
2603   * @uses wp_get_object_terms() Se usa para obtener términos de la base de datos y actualizar
2604   *
2605   * @param string|array $object_ids ID(s) de objeto(s) de término individual o en lista
2606   * @param array|string $object_type El tipo de objeto de taxonomía
2607   * @return null|bool Valor nulo si $object_ids está vacío. Falso si
2608   */
2609  function update_object_term_cache($object_ids, $object_type) {
2610      if ( empty($object_ids) )
2611          return;
2612  
2613      if ( !is_array($object_ids) )
2614          $object_ids = explode(',', $object_ids);
2615  
2616      $object_ids = array_map('intval', $object_ids);
2617  
2618      $taxonomies = get_object_taxonomies($object_type);
2619  
2620      $ids = array();
2621      foreach ( (array) $object_ids as $id ) {
2622          foreach ( $taxonomies as $taxonomy ) {
2623              if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) {
2624                  $ids[] = $id;
2625                  break;
2626              }
2627          }
2628      }
2629  
2630      if ( empty( $ids ) )
2631          return false;
2632  
2633      $terms = wp_get_object_terms($ids, $taxonomies, array('fields' => 'all_with_object_id'));
2634  
2635      $object_terms = array();
2636      foreach ( (array) $terms as $term )
2637          $object_terms[$term->object_id][$term->taxonomy][$term->term_id] = $term;
2638  
2639      foreach ( $ids as $id ) {
2640          foreach ( $taxonomies  as $taxonomy ) {
2641              if ( ! isset($object_terms[$id][$taxonomy]) ) {
2642                  if ( !isset($object_terms[$id]) )
2643                      $object_terms[$id] = array();
2644                  $object_terms[$id][$taxonomy] = array();
2645              }
2646          }
2647      }
2648  
2649      foreach ( $object_terms as $id => $value ) {
2650          foreach ( $value as $taxonomy => $terms ) {
2651              wp_cache_set($id, $terms, "{$taxonomy}_relationships");
2652          }
2653      }
2654  }
2655  

Dentro de wp-includes/taxonomy.php. Buena suerte hackeando el código. No hay ningún hook. Está hardcodeado... Lo siento. Creo que hackear el código es tu única opción por ahora.

21 feb 2012 02:17:21
Comentarios

Hackear el núcleo de WP probablemente no sea una buena idea.

chrisguitarguy chrisguitarguy
21 feb 2012 02:27:53

¡Lo sé! Pero él hizo la pregunta. Solo di la respuesta.

Asaf Chertkoff Asaf Chertkoff
21 feb 2012 03:04:30

Sí, pero hackear el núcleo es la respuesta incorrecta. -1

EAMann EAMann
21 feb 2012 04:51:08

+1 - En mi publicación original mencioné que modificar el núcleo era aceptable en este caso. Ni siquiera pude encontrar dónde necesitaba modificar el núcleo para que esto funcionara. Al menos si sé que esto es posible, puedo trabajar para desarrollar un plugin o enviar una solicitud adecuada pidiendo un hook o filter a la comunidad de WP. Así que, gracias @AsafChertkoff, aunque aún no lo he probado yo mismo.

cwd cwd
21 feb 2012 06:06:26

@cwd, de nada :). Espero que te ayude.

Asaf Chertkoff Asaf Chertkoff
21 feb 2012 17:59:55
1

Es posible y muy fácil guardar etiquetas con comas mediante programación.

Cuando llamas a wp_set_post_terms( $post_id, $terms, $taxonomy ), si proporcionas una cadena, se dividirá en un array. Si proporcionas tus $terms como un array, cada elemento del array se proporcionará como un término individual sin dividirse en múltiples términos.

// Ejemplo de término con coma.
$terms = 'Apellido, Nombres';
// Crea y/o asigna múltiples términos separados por coma.
wp_set_post_terms( $post_id, $terms, $taxonomy );
// Crea y/o asigna un solo término con coma.
wp_set_post_terms( $post_id, (array) $terms, $taxonomy );

Tanto wp_insert_post como posteriormente wp_update_post utilizan wp_set_post_terms cuando el argumento $arg tax_input está configurado.

// Asegura que $terms sea un array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );

La mejor manera de crear términos sobre la marcha usando la interfaz del Escritorio de WordPress puede requerir que crees tu propio meta box que envíe cualquier cadena, incluidas las comas, como un solo término. Algunos plugins, como ACF Pro, hacen esto por defecto cuando creas un campo personalizado para guardar la taxonomía y seleccionas también cargar y asignar los términos al guardar.

/* Ejemplo de fragmento JSON de configuración para Exportar/Importar en ACF Pro. */
/* Configuración más probable para la mayoría de estas situaciones: "allow_null" */
/* y "field_type" pueden necesitar ajustes dependiendo de la situación. */
{
    "type": "taxonomy",
    "field_type": "multi_select",
    "allow_null": 1,
    "add_term": 1,
    "save_terms": 1,
    "load_terms": 1
}

Incluso cuando se guardan con una coma, cada parte de esos términos con comas puede aparecer como elementos separados al editar la entrada. En este caso, puede ser mejor desactivar la interfaz predeterminada y depender de los meta boxes personalizados. Esto se puede hacer usando las Opciones de Pantalla al editar un tipo de entrada. Las taxonomías personalizadas también se pueden ocultar de la sección de edición rápida al registrarlas.

// Argumentos para registrar Taxonomía Personalizada - deshabilita la interfaz predeterminada en edición rápida.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );
11 abr 2018 11:19:24
Comentarios

Se me ocurrió una solución rápida (aún no la he probado), pero podrías agregar un filtro que siempre sanitice los términos, convirtiéndolos todos a un array. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } ); sin embargo, solo te permitirá enviar un término a la vez.

Shaun Cockerill Shaun Cockerill
11 abr 2018 11:27:57
1

Puedes usar un filtro.

Por ejemplo, si deseas agregar una coma después de cada etiqueta en una nube de etiquetas, puedes colocar lo siguiente en tu archivo functions.php

function myfunc_filter_tag_cloud($args) {
    $args['smallest'] = 18;
    $args['largest'] = 32;
    $args['unit'] = 'px';
    $args['separator']= ', ';
    return $args;
}
add_filter ( 'widget_tag_cloud_args', 'myfunc_filter_tag_cloud');
6 ago 2011 04:37:49
Comentarios

El problema no es mostrarlos con comas, el problema es mantener las comas como parte del nombre de la etiqueta/categoría al ingresarlas (mientras se edita la publicación). Me gustaría descubrir cómo editar WordPress (o escribir un plugin) para permitirme hacer eso.

cwd cwd
7 ago 2011 07:54:26