¿Cómo puedo permitir comas en los nombres de etiquetas?
¿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.

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

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

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.

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.

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.

+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.

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

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.

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');
