Come posso consentire le virgole nei nomi dei tag?

5 ago 2011, 11:53:55
Visualizzazioni: 14.2K
Voti: 15

Vorrei permettere l'uso di virgole nei nomi dei tag? Ad esempio, "ciao, mondo" o "portland, oregon" ma WordPress continua a separarli. Posso farlo dalla pagina delle categorie:

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

E viene visualizzato correttamente. Ma qualsiasi tag aggiunto dalla sidebar degli articoli non viene mostrato correttamente qui:

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

C'è una discussione a riguardo qui: http://core.trac.wordpress.org/ticket/14691 ma sembra che potrebbe non essere risolto, almeno per un po'.

Nel frattempo, sto cercando una soluzione più semplice che aggiungere categorie dalla pagina delle categorie.

Ho provato a cercare plugin, ma non ne ho trovato nessuno che potesse essere utile. Ce ne sono alcuni che gestiscono la sostituzione delle virgole con altri caratteri quando si visualizza un elenco di categorie o tag, ma non ho trovato plugin che consentano all'utente di sostituire il separatore predefinito.

Non mi importa se devo modificare il core manualmente. Idealmente potrei scrivere un plugin, ma dopo aver esaminato parte del codice non riesco a capire dove viene gestito questo aspetto.

Qualcuno ha una soluzione o suggerimenti su quali funzioni e javascript iniziare a modificare? Non sono sicuro da dove iniziare a cercare nel codice.

5
Commenti

Hai avuto fortuna nel raggiungere questo obiettivo? Anche io sto cercando una soluzione.

supertrue supertrue
20 ott 2011 21:54:37

Li ho appena aggiunti dalla pagina delle categorie (come menzionato sopra). È scomodo ma funziona. Nessuna fortuna nel modificare il core o aggiungere un filtro (per ora).

cwd cwd
21 ott 2011 18:22:04

Mai modificare il core ;)

Jared Jared
31 gen 2012 18:42:30

@Jared - va bene modificare il core - purché tu invii il tuo problema / patch a core.trac.wordpress.org e sia disposto a mantenere la patch sulla tua installazione finché (si spera) non verrà integrata nel core ;)

cwd cwd
31 gen 2012 21:39:05

In quel caso, hai ragione. :)

Jared Jared
31 gen 2012 23:56:32
Tutte le risposte alla domanda 5
3

Nessuna modifica al core necessaria -- grazie agli: HOOKS.

Gli hook permettono di risolvere il problema con una buona combinazione di:

  • un filtro che sostituisce "--" con ", " prima dell'output
  • e un blocco "if" per assicurarsi che l'output non venga filtrato anche per l'interfaccia di amministrazione :)
  • e infine, salvare tutti i tuoi tag con virgola nel formato "Fox--Peter" invece di "Fox, Peter"

Ecco il codice:

// filtro per tag con virgola
//  sostituisce '--' con ', ' nell'output - permette tag con virgola in questo modo
//  es. salva il tag come "Fox--Peter" ma lo visualizza grazie ai filtri come "Fox, Peter"

if(!is_admin()){ // assicura che i filtri vengano chiamati solo nel 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');
}

Forse alcuni dettagli aggiuntivi nel mio post sul blog su questo argomento possono aiutare... http://blog.foobored.com/all/wordpress-tags-with-commas/

Saluti, Andi

15 giu 2012 02:47:24
Commenti

Questo si romperà. La virgola non è una stringa fissa, può essere tradotta. Usa _x( ',', 'delimitatore di tag' ) per catturare il vero delimitatore.

fuxia fuxia
15 giu 2012 16:24:12

Non l'ho ancora testato ma sembra buono - grazie

cwd cwd
26 giu 2012 21:23:31

Sul tuo sito hai anche le tassonomie personalizzate, suggerisco di cambiare i nomi delle funzioni per chi non riesce a capirlo. Nel codice personalizzato che hai scritto: comma_tags_filter invece di 'comma_tags_filter' il che danneggia molto il codice. Complessivamente ottimo lavoro.

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

Le virgole nei nomi dei tag non funzioneranno correttamente perché, quando si aggiunge il tag a un post, WordPress lo interpreterà come più parole chiave, interrompendosi alla virgola.

Una semplice soluzione:

Usa , (il codice HTML per la virgola) invece di una virgola normale.

Quindi:

  • , verrà visualizzato come una bella virgola all'interno dei post, nei titoli delle pagine dei tag e in molti altri luoghi.
  • Verrà visualizzato così com'è, come ,, all'interno dell'interfaccia di amministrazione quando si digita il nome del tag.

Per tua informazione, l'uso dell'entità HTML, , non funziona.

23 nov 2019 14:21:14
5

Ecco la tua soluzione. Fai attenzione alla linea 2614:

    /**
2588   * Aggiorna la cache per gli ID dei Termini.
2589   *
2590   * Aggiornerà solo la cache per i termini non già memorizzati.
2591   *
2592   * Gli $object_ids si aspettano che gli ID siano separati da virgole, se è una
2593   * stringa.
2594   *
2595   * Va notato che update_object_term_cache() è molto dispendiosa in termini di tempo. Si
2596   * consiglia di non chiamare la funzione troppo spesso o almeno non per un
2597   * gran numero di termini che esistono in molte tassonomie. Il tempo aumenta
2598   * per ogni termine e aumenta anche per ogni tassonomia a cui il termine appartiene.
2599   *
2600   * @package WordPress
2601   * @subpackage Taxonomy
2602   * @since 2.3.0
2603   * @uses wp_get_object_terms() Usato per ottenere i termini dal database da aggiornare
2604   *
2605   * @param string|array $object_ids Singolo o lista di ID degli oggetti termine
2606   * @param array|string $object_type Il tipo di oggetto della tassonomia
2607   * @return null|bool Valore null se $object_ids è vuoto. False se
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  

All'interno di wp-includes/taxonomy.php. Buona fortuna nell'hackerare il codice. Non ci sono hook. È hard coded... Mi dispiace. Penso che hackerare il codice sia la tua unica opzione per ora.

21 feb 2012 02:17:21
Commenti

Modificare il core di WP probabilmente non è una buona idea.

chrisguitarguy chrisguitarguy
21 feb 2012 02:27:53

Lo so! ma ha fatto la domanda. Ho solo dato la risposta.

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

Sì, ma modificare il core è la risposta sbagliata. -1

EAMann EAMann
21 feb 2012 04:51:08

+1 - Nel mio post originale ho menzionato che in questo caso era accettabile modificare il core. Non riuscivo nemmeno a trovare dove fosse necessario intervenire sul core per far funzionare questa cosa. Almeno se so che è possibile posso lavorare per sviluppare un plugin o inviare una richiesta di ticket appropriata chiedendo un hook o un filter alla comunità WP. Quindi, grazie @AsafChertkoff, anche se non l'ho ancora testato personalmente.

cwd cwd
21 feb 2012 06:06:26

@cwd, prego :). spero che sia di aiuto.

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

È possibile e molto semplice salvare tag con virgole a livello programmatico.

Quando si chiama wp_set_post_terms( $post_id, $terms, $taxonomy ), se si fornisce una stringa, questa verrà suddivisa in un array. Se invece si fornisce $terms come array, ogni elemento dell'array verrà considerato come un singolo termine senza essere ulteriormente diviso.

// Esempio di termine con virgola.
$terms = 'Cognome, Nomi';
// Crea e/o assegna più termini separati da virgola.
wp_set_post_terms( $post_id, $terms, $taxonomy );
// Crea e/o assegna un singolo termine con virgola.
wp_set_post_terms( $post_id, (array) $terms, $taxonomy );

Sia wp_insert_post che successivamente wp_update_post utilizzano wp_set_post_terms quando l'argomento $arg tax_input è impostato.

// Assicurarsi che $terms sia un array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );

Il modo migliore per creare termini al volo utilizzando l'interfaccia utente della Dashboard di WordPress potrebbe richiedere la creazione di un meta box personalizzato che invii qualsiasi stringa, inclusi i termini con virgole, come singolo termine. Alcuni plugin, come ACF Pro, fanno questo di default quando si crea un campo personalizzato per salvare la tassonomia e si sceglie di caricare e assegnare i termini al momento del salvataggio.

/* Esempio di snippet JSON per un'esportazione/importazione ACF Pro. */
/* Configurazione più probabile per queste situazioni: "allow_null" */
/* e "field_type" potrebbero richiedere modifiche in base al caso. */
{
    "type": "taxonomy",
    "field_type": "multi_select",
    "allow_null": 1,
    "add_term": 1,
    "save_terms": 1,
    "load_terms": 1
}

Anche quando salvati con una virgola, ogni parte di questi termini potrebbe comunque apparire come elemento separato durante la modifica del post. In questo caso potrebbe essere meglio disabilitare l'interfaccia utente predefinita e fare affidamento sui meta box personalizzati. Questo può essere fatto utilizzando le Opzioni Schermo durante la modifica di un tipo di post. Le tassonomie personalizzate possono anche essere nascoste dalla sezione di modifica rapida durante la registrazione.

// Registrazione degli argomenti della Tassonomia Personalizzata - disabilita l'UI predefinita nella modifica rapida.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );
11 apr 2018 11:19:24
Commenti

Mi è venuto in mente una soluzione rapida e sporca (non l'ho ancora testata personalmente), ma potresti aggiungere un filtro che sanitizzi sempre i termini, convertendoli tutti in un array. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } ); tuttavia, ti consentirà di inviare solo un termine alla volta.

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

Puoi utilizzare un filtro.

Ad esempio, se vuoi aggiungere una virgola dopo ogni tag in una nuvola di tag, puoi inserire il seguente codice nel tuo file 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
Commenti

Il problema non è visualizzarli con le virgole, il problema è mantenere le virgole come parte del nome del tag/categoria quando li inserisco (durante la modifica del post). Vorrei capire come modificare WordPress (o scrivere un plugin) per permettermi di fare ciò.

cwd cwd
7 ago 2011 07:54:26