Cum pot permite virgule în numele etichetelor?
Vreau să permit virgule în numele etichetelor? De exemplu, "hello, world"
sau "portland, or"
, dar WordPress continuă să le separe. Pot face asta din pagina de categorii:
imagine http://img839.imageshack.us/img839/6869/picturepp.png
Și apare corect. Dar orice este adăugat din bara laterală a articolelor nu apare corect aici:
imagine http://img52.imageshack.us/img52/4950/picture1oax.png
Există o discuție despre asta aici: http://core.trac.wordpress.org/ticket/14691 dar se pare că poate nu va fi rezolvată, cel puțin deocamdată.
Între timp, caut o soluție mai ușoară decât adăugarea de categorii din pagina de categorii.
Am încercat să caut plugin-uri și nu am găsit niciunul care să fie util. Există câteva care se ocupă cu înlocuirea virgulelor cu alte caractere la afișarea unei liste de categorii sau etichete, dar nu văd niciun plugin care să permită utilizatorului să înlocuiască separatorul implicit.
Nu-mi pasă dacă trebuie să modific core-ul singur. În mod ideal, aș putea scrie un plugin, dar după ce am analizat o parte din cod, nu reușesc să-mi dau seama unde este gestionat acest lucru.
Are cineva o soluție sau sfaturi despre ce funcții și JavaScript să încep să modific? Nu știu unde să încep să caut în cod.
Nu este nevoie de modificări în nucleu -- mulțumită: HOOKS-urilor.
Hooks-urile permit rezolvarea problemei cu o combinație elegantă de:
- un filtru care înlocuiește "--" cu ", " înainte de afișare
- și un bloc "if" pentru a ne asigura că ieșirea nu este filtrată și în interfața de administrare :)
- și în final, salvarea tuturor tag-urilor cu virgulă în formatul "Fox--Peter" în loc de "Fox, Peter"
Iată codul:
// filtru pentru tag-uri cu virgulă
// înlocuiește '--' cu ', ' la afișare - permite tag-uri cu virgulă în acest fel
// ex. salvează tag-ul ca "Fox--Peter" dar afișează datorită filtrelor ca "Fox, Peter"
if(!is_admin()){ // asigură-te că filtrele sunt aplicate doar în 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');
}
Poate că câteva detalii suplimentare din articolul meu de blog pe această temă vă vor fi de folos.. http://blog.foobored.com/all/wordpress-tags-with-commas/
Salutări, Andi

Aceasta va cauza probleme. Virgula nu este un șir fix, poate fi tradusă. Folosește _x( ',', 'delimitator de etichete' )
pentru a captura delimitatorul real.

Virgulele în numele etichetelor nu vor funcționa corect deoarece, atunci când adăugați eticheta la un articol, WordPress o va interpreta ca mai multe cuvinte cheie, întrerupând la virgulă.
O soluție simplă:
Utilizați ,
(codul HTML pentru virgulă) în loc de o virgulă obișnuită.
Apoi:
,
va fi afișat ca o virgulă frumoasă în interiorul articolelor, în titlurile paginilor de etichete și în multe alte locuri.- Va fi afișat în forma sa brută, ca
,
, în interfața de administrare atunci când tastați numele etichetei.
Pentru informație, utilizarea entității HTML, ,
nu funcționează.

Iată soluția ta. Atenție la linia 2614:
/**
2588 * Actualizează cache-ul pentru ID-urile de termeni.
2589 *
2590 * Va actualiza doar cache-ul pentru termenii care nu sunt deja în cache.
2591 *
2592 * Parametrul $object_ids așteaptă ca ID-urile să fie separate prin virgulă, dacă este un
2593 * string.
2594 *
2595 * Este important de menționat că update_object_term_cache() este o funcție care consumă mult timp. Se
2596 * recomandă ca funcția să nu fie apelată foarte des sau cel puțin nu pentru un număr
2597 * mare de termeni care există în multe taxonomii. Timpul de execuție crește
2598 * pentru fiecare termen și crește și pentru fiecare taxonomie căreia îi aparține termenul.
2599 *
2600 * @package WordPress
2601 * @subpackage Taxonomy
2602 * @since 2.3.0
2603 * @uses wp_get_object_terms() Folosit pentru a obține termenii din baza de date pentru actualizare
2604 *
2605 * @param string|array $object_ids Unul sau mai multe ID-uri de obiecte termen
2606 * @param array|string $object_type Tipul de obiect taxonomie
2607 * @return null|bool Returnează null dacă $object_ids este gol. False dacă
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
În interiorul wp-includes/taxonomy.php. Mult succes în modificarea codului. nu există niciun hook. este hardcodat... Îmi pare rău. Cred că modificarea directă a codului este singura ta opțiune momentan.

+1 - În postarea mea originală am menționat că modificarea nucleului era acceptabilă în acest caz. Nici măcar nu am putut găsi unde trebuia să modific nucleul pentru a face acest lucru să funcționeze. Cel puțin dacă știu că acest lucru este posibil, pot lucra la dezvoltarea unui plugin sau pot trimite o cerere oficială pentru un cârlig sau filtru din partea comunității WP. Așadar, mulțumesc @AsafChertkoff, chiar dacă încă nu am testat asta personal.

Este posibil și foarte ușor să salvați tag-uri cu virgule programatic.
Când apelați wp_set_post_terms( $post_id, $terms, $taxonomy )
, dacă furnizați un șir de caractere, acesta va fi explodat într-un array. Dacă furnizați $terms
ca un array, fiecare element din array va fi furnizat ca propriul său termen fără a fi împărțit în mai mulți termeni.
// Exemplu de termen cu virgulă.
$terms = 'Nume, Prenume';
// Creează și/sau atribuie mai mulți termeni separați prin virgulă.
wp_set_post_terms( $post_id, $terms, $taxonomy );
// Creează și/sau atribuie un singur termen cu virgulă.
wp_set_post_terms( $post_id, (array) $terms, $taxonomy );
Atât wp_insert_post
cât și ulterior wp_update_post
utilizează wp_set_post_terms
când argumentul $arg
tax_input
este setat.
// Asigură-te că $terms este un array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );
Cea mai bună metodă de a crea termeni pe parcurs folosind interfața WordPress Dashboard, poate necesita să vă creați propria cutie meta care trimite orice șir de caractere, inclusiv virgule, ca un singur termen. Unele plugin-uri, cum ar fi ACF Pro, fac acest lucru în mod implicit atunci când creați un câmp personalizat pentru a salva taxonomia și selectați să încarce și să atribuie termenii la salvare.
/* Exemplu de fragment JSON pentru configurare a Export/Import ACF Pro. */
/* Cel mai probabil config pentru majoritatea acestor situații: "allow_null" */
/* și "field_type" pot necesita ajustări în funcție de situație. */
{
"type": "taxonomy",
"field_type": "multi_select",
"allow_null": 1,
"add_term": 1,
"save_terms": 1,
"load_terms": 1
}
Chiar și atunci când sunt salvați cu virgulă, fiecare parte din acei termeni cu virgule poate apărea în continuare ca elemente separate la editarea postării. În acest caz, poate fi mai bine să dezactivați interfața implicită și să vă bazați pe cutiile meta personalizate. Acest lucru poate fi făcut folosind Opțiuni de Ecran atunci când editați un tip de postare. Taxonomiile personalizate pot fi, de asemenea, ascunse din secțiunea de editare rapidă la înregistrare.
// Argumente pentru înregistrarea Taxonomiei Personalizate - dezactivează interfața implicită în editarea rapidă.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );

Mi-a venit în minte o soluție improvizată (încă nu am testat-o), dar ai putea adăuga un filtru care să sancționeze întotdeauna termenii, convertindu-i pe toți într-un array. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );
totuși, te va limita la trimiterea unui singur termen odată.

poți folosi un filtru.
De exemplu, dacă dorești să adaugi o virgulă după fiecare etichetă într-un nor de etichete, poți adăuga următoarele în fișierul tău 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');
