Comment puis-je autoriser les virgules dans les noms de balises?

15

Je veux autoriser les virgules dans les noms de balises? Par exemple, "hello, world"ou "portland, or"mais Wordpress continue de les séparer. Je peux le faire depuis la page des catégories:

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

Et ça se voit bien. Mais tout ce qui est ajouté dans la barre latérale des messages ne s'affiche pas correctement ici:

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

Il y a une discussion à ce sujet ici: http://core.trac.wordpress.org/ticket/14691 mais il semble que cela ne soit pas résolu, du moins pendant un certain temps.

En attendant, je cherche une solution plus simple que d'ajouter des catégories à partir de la page des catégories.

J'ai essayé de rechercher des plugins et je n'en ai vu aucun qui serait utile. Il y en a quelques-uns qui traitent du remplacement des virgules par d'autres caractères lors de l'affichage d'une liste de catégories ou de balises, mais je ne vois aucun plugin permettant à l'utilisateur de remplacer le séparateur par défaut.

Je m'en fiche si je dois patcher le noyau moi-même. Idéalement, je pourrais écrire un plugin, mais après avoir parcouru une partie du code, je ne sais pas où cela est géré.

Quelqu'un at-il une solution ou des conseils sur les fonctions et le javascript pour commencer le piratage? Je ne sais pas par où commencer à chercher dans le code.

cwd
la source
1
Avez-vous de la chance d'y parvenir? Je recherche également une solution.
super vrai
Je viens de les ajouter à partir de la page des catégories (comme mentionné ci-dessus). C'est gênant mais ça marche. Pas de chance de modifier le core ou d'ajouter un filtre (pour l'instant).
cwd
1
Ne modifiez jamais le noyau;)
Jared
2
@Jared - il est OK de modifier le noyau - tant que vous soumettez votre problème / patch à core.trac.wordpress.org et que vous êtes d'accord pour maintenir le patch sur votre installation jusqu'à ce qu'il (espérons-le) soit tiré dans le noyau;)
cwd
Dans ce cas, vous avez raison. :)
Jared

Réponses:

9

Aucun piratage de base nécessaire - grâce à: CROCHETS.

Les crochets permettent de résoudre le problème avec une belle combinaison de

  • un filtre remplaçant "-" par "," avant la sortie
  • et un bloc "si" pour vous assurer que la sortie n'est pas également filtrée pour l'interface d'administration :)
  • et enfin, enregistrer toutes vos balises avec des virgules au format "Fox - Peter" au lieu de "Fox, Peter"

Voici le code:

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

Peut-être que quelques détails supplémentaires dans mon article de blog sur cette rubrique aident également. Http://blog.foobored.com/all/wordpress-tags-with-commas/

Salut, Andi

foo ennuyé
la source
Cela va casser. La virgule n'est pas une chaîne fixe, elle peut être traduite. Utilisez _x( ',', 'tag delimiter' )pour attraper le vrai délimiteur.
fuxia
Je ne l'ai pas encore testé mais il a l'air bien - merci
cwd
Sur votre site, vous avez également la taxe personnalisée, je vous suggère de modifier les noms de fonction pour quiconque ne peut pas le comprendre. Sur le code personnalisé que vous avez écrit: comma_tags_filter au lieu de 'comma_tags_filter' ce qui fait beaucoup de mal au code. Dans l'ensemble, excellent travail.
David H
1

Il est possible et très facile d'enregistrer des balises avec des virgules par programme.

Lors de l'appel wp_set_post_terms( $post_id, $terms, $taxonomy ), si vous fournissez une chaîne, elle sera éclatée dans un tableau. Si vous fournissez votre $termssous forme de tableau, chaque élément du tableau sera fourni en tant que terme propre sans être divisé en plusieurs termes.

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

Les deux wp_insert_postet ensuite wp_update_postutiliser wp_set_post_termslorsque le $arg tax_inputest défini.

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

La meilleure façon de créer des termes à la volée à l'aide de l'interface utilisateur de WordPress Dashboard, peut vous obliger à créer votre propre méta-boîte qui soumet toute chaîne, y compris les virgules, comme un seul terme. Certains plugins, comme ACF Pro, le font par défaut lorsque vous créez un champ personnalisé pour enregistrer la taxonomie, et choisissez de charger et d'affecter également les termes lors de l'enregistrement.

/* 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
}

Même lorsqu'ils sont enregistrés avec une virgule, chaque partie de ces termes avec des virgules peut toujours apparaître comme des éléments distincts lors de la modification de la publication. Dans ce cas, il peut être préférable de désactiver l'interface utilisateur par défaut et de s'appuyer sur les métadonnées personnalisées. Cela peut être fait en utilisant les options d'écran lors de la modification d'un type de publication. Les taxonomies personnalisées peuvent également être masquées dans la section d'édition rapide lors de l'enregistrement.

// 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
la source
Je viens de penser à un correctif (je ne l'ai pas encore testé moi-même), mais vous pouvez ajouter un filtre qui nettoiera toujours les termes, en les convertissant tous en un tableau. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );cependant, il ne vous permettra de soumettre qu'un seul terme à la fois.
Shaun Cockerill
0

vous pouvez utiliser un filtre.

Par exemple, si vous souhaitez ajouter une virgule après chaque balise dans un nuage de balises, vous pouvez mettre ce qui suit dans vos fonctions.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
la source
1
Le problème n'est pas de les afficher avec des virgules, le problème est de conserver les virgules dans le nom de la balise / catégorie lors de leur saisie (lors de la modification du message). Je voudrais savoir comment éditer wordpress (ou écrire un plugin) pour me permettre de le faire.
cwd
0

Voici votre solution de pose. Faites attention à la ligne 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  

À l'intérieur de wp-includes / taxonomy.php . Bonne chance en piratant le code. il n'y a pas de crochet. c'est codé en dur ... Désolé. Je pense que le piratage du code est votre seule option pour l'instant.

Asaf Chertkoff
la source
2
Pirater le noyau WP n'est probablement pas une bonne idée.
chrisguitarguy
2
Je le sais! mais il a posé la question. Je viens de donner la réponse.
Asaf Chertkoff
Oui, mais pirater le cœur n'est pas la bonne réponse. -1
EAMann
3
+1 - Dans mon message d'origine, j'ai mentionné que le piratage du noyau était acceptable dans ce cas. Je ne pouvais même pas trouver où j'avais besoin de pirater le noyau pour que cela fonctionne. Au moins si je sais que c'est possible, je peux travailler pour développer un plugin ou soumettre une demande de ticket appropriée demandant un hook ou un filtre à la communauté WP. Donc, merci @AsafChertkoff, même si je ne l'ai pas encore testé moi-même.
cwd
@cwd, votre accueil :). J'espère que cela pourra aider.
Asaf Chertkoff
0

Les virgules dans les noms de balises ne fonctionneront pas correctement car, lors de l'ajout de la balise à un article, WordPress l'analysera en plusieurs mots-clés, en coupant la virgule.

Une solution simple:

Utilisez ,( le code HTML de la virgule ) au lieu d'une virgule ordinaire.

Alors:

  • , s'affichera comme une belle virgule à l'intérieur des articles, des titres des pages de balises et d'un tas d'autres endroits.
  • Il s'affichera brut, comme , , à l'intérieur de l'interface d'administration lors de la saisie du nom de la balise.

FYI, en utilisant l'entité HTML, ,ne fonctionne pas.

Fabien Snauwaert
la source