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

15

¿Quiero permitir comas en los nombres de etiquetas? Por ejemplo, "hello, world"o "portland, or"pero Wordpress sigue separándolos. Puedo hacerlo desde la página de categorías:

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

Y se muestra bien. Pero cualquier cosa agregada desde la barra lateral de publicaciones no aparece bien aquí:

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

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

Mientras tanto, estoy buscando una solución más fácil que agregar categorías desde la página de categorías.

Intenté buscar complementos y no vi ninguno que pudiera ser útil. Hay algunos que tratan de reemplazar comas con otros caracteres cuando se muestra una lista de categorías o etiquetas, pero no veo ningún complemento que permita al usuario reemplazar el separador predeterminado.

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

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

cwd
fuente
1
¿Alguna suerte en lograr esto? También estoy buscando una solución.
supertrue
Acabo de agregarlos desde la página de categorías (como se mencionó anteriormente). Es inconveniente pero funciona. No hubo suerte en modificar el núcleo o agregar un filtro (todavía).
cwd
1
Nunca modifique el núcleo;)
Jared
2
@Jared: está bien modificar el núcleo, siempre y cuando envíe su problema / parche a core.trac.wordpress.org y esté de acuerdo en mantener el parche en su instalación hasta que (con suerte) se introduzca en el núcleo;)
cwd
En ese caso, tienes razón. :)
Jared

Respuestas:

9

No es necesario hackear el núcleo, gracias a: HOOKS.

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

  • un filtro que reemplaza "-" por "," antes de la salida
  • y un bloque "if" para asegurarse de que la salida no se filtre también para la interfaz de administrador :)
  • y finalmente, guardar todas sus etiquetas con comas en el formato "Fox - Peter" en lugar de "Fox, Peter"

Aquí está el código:

// filter for tags with comma
//  replace '--' with ', ' in the output - allow tags with comma this way
//  e.g. save tag as "Fox--Peter" but display thx 2 filters like "Fox, Peter"

if(!is_admin()){ // make sure the filters are only called in the 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');
}

Tal vez algunos detalles adicionales en la publicación de mi blog sobre ese tema también ayuden ... http://blog.foobored.com/all/wordpress-tags-with-commas/

Saludos, Andi

aburrido
fuente
Esto se romperá La coma no es una cadena fija, se puede traducir. Use _x( ',', 'tag delimiter' )para atrapar el delimitador real.
fuxia
Todavía no lo he probado, pero se ve bien, gracias
Cwd
En su sitio también tiene los impuestos personalizados, le sugiero que cambie los nombres de las funciones para cualquier persona que no pueda entenderlo. En el código personalizado que escribió: comma_tags_filter en lugar de 'comma_tags_filter', lo que perjudica bastante el código. En general, un gran trabajo.
David H
1

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

Al llamar wp_set_post_terms( $post_id, $terms, $taxonomy ), si proporciona una cadena, se explotará en una matriz. Si proporciona su $termscomo una matriz, cada elemento de la matriz se proporcionará como un término propio sin dividirse en varios términos.

// Example term with comma.
$terms = 'Surname, Given Names';
// Creates and/or assigns multiple terms separated by a comma.
wp_set_post_terms( $post_id, $terms, $taxonomy );
// Creates and/or assigns a single term with a comma.
wp_set_post_terms( $post_id, (array) $terms, $taxonomy );

Ambos wp_insert_posty posteriormente se wp_update_postusan wp_set_post_termscuando $arg tax_inputse establece.

// Ensure $terms is an array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );

La mejor manera de crear términos sobre la marcha utilizando la interfaz de usuario del panel de WordPress, puede requerir que cree su propio cuadro de meta que envíe cualquier cadena incluyendo comas como un solo término. Algunos complementos, como ACF Pro, lo hacen de manera predeterminada cuando crea un campo personalizado para guardar la taxonomía, y selecciona cargar y asignar también los términos cuando se guardan.

/* Example JSON config snippet for an ACF Pro Export/Import. */
/* Most likely config for most of these situations: "allow_null" */
/* and "field_type" may need to be adjusted depending on the situation. */
{
    "type": "taxonomy",
    "field_type": "multi_select",
    "allow_null": 1,
    "add_term": 1,
    "save_terms": 1,
    "load_terms": 1
}

Incluso cuando se guarda con una coma, cada parte de esos términos con comas puede aparecer como elementos separados al editar la publicación. En este caso, puede ser mejor desactivar la IU predeterminada y confiar en los meta cuadros personalizados. Esto se puede hacer usando las Opciones de pantalla al editar un tipo de publicación. Las taxonomías personalizadas también se pueden ocultar de la sección de edición rápida al registrarse.

// Register Custom Taxonomy args - disable default UI in quick edit.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );
Shaun Cockerill
fuente
Solo pensé en una solución sucia (no la he probado todavía), pero podría agregar un filtro que siempre desinfecte los términos, convirtiéndolos a una matriz. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );sin embargo, solo le permitirá enviar un término a la vez.
Shaun Cockerill
0

Puedes usar un filtro.

Por ejemplo, si desea Agregar una coma después de cada etiqueta en una nube de etiquetas, puede poner lo siguiente en sus funciones.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');
Tara
fuente
1
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 complemento) para permitirme hacer eso.
cwd
0

Aquí está su solución de colocación. Preste atención a la línea 2614:

    /**
2588   * Updates the cache for Term ID(s).
2589   *
2590   * Will only update the cache for terms not already cached.
2591   *
2592   * The $object_ids expects that the ids be separated by commas, if it is a
2593   * string.
2594   *
2595   * It should be noted that update_object_term_cache() is very time extensive. It
2596   * is advised that the function is not called very often or at least not for a
2597   * lot of terms that exist in a lot of taxonomies. The amount of time increases
2598   * for each term and it also increases for each taxonomy the term belongs to.
2599   *
2600   * @package WordPress
2601   * @subpackage Taxonomy
2602   * @since 2.3.0
2603   * @uses wp_get_object_terms() Used to get terms from the database to update
2604   *
2605   * @param string|array $object_ids Single or list of term object ID(s)
2606   * @param array|string $object_type The taxonomy object type
2607   * @return null|bool Null value is given with empty $object_ids. False if
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 gancho. está codificado ... Lo siento. Creo que hackear el código es tu única opción por ahora.

Asaf Chertkoff
fuente
2
Hackear el núcleo de WP probablemente no sea una buena idea.
chrisguitarguy
2
¡Yo sé eso! pero hizo la pregunta. Acabo de dar la respuesta.
Asaf Chertkoff
Sí, pero piratear el núcleo es la respuesta incorrecta . -1
EAMann
3
+1: en mi publicación original mencioné que hackear el núcleo era aceptable en este caso. Ni siquiera podía encontrar dónde necesitaba hackear el núcleo para que esto funcionara. Al menos, si sé que esto es posible, puedo trabajar para desarrollar un complemento o enviar una solicitud de ticket adecuada solicitando un enlace o filtro de la comunidad WP. Entonces, gracias @AsafChertkoff, aunque todavía no lo he probado.
cwd
@cwd, de nada :). Espero que ayude.
Asaf Chertkoff
0

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

Una solución simple:

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

Luego:

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

FYI, usando la entidad HTML, ,no funciona.

Fabien Snauwaert
fuente