Come posso consentire le virgole nei nomi dei tag?
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.

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

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

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.

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.

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.

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

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

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.

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