Cum pot permite virgule în numele etichetelor?

5 aug. 2011, 11:53:55
Vizualizări: 14.2K
Voturi: 15

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.

5
Comentarii

Ați reușit să obțineți asta? Caut și eu o soluție.

supertrue supertrue
20 oct. 2011 21:54:37

Tocmai le-am adăugat din pagina de categorii (cum s-a menționat mai sus). E incomod, dar funcționează. Nu am reușit încă să modific nucleul sau să adaug un filtru (încă nu).

cwd cwd
21 oct. 2011 18:22:04

Niciodată nu modifica nucleul ;)

Jared Jared
31 ian. 2012 18:42:30

@Jared - este OK să modifici nucleul - atâta timp cât îți prezinți problema/patch-ul pe core.trac.wordpress.org și ești dispus să menții patch-ul pe instalarea ta până când (sperăm) va fi integrat în nucleu ;)

cwd cwd
31 ian. 2012 21:39:05

În acest caz, ai dreptate. :)

Jared Jared
31 ian. 2012 23:56:32
Toate răspunsurile la întrebare 5
3

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

15 iun. 2012 02:47:24
Comentarii

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

fuxia fuxia
15 iun. 2012 16:24:12

Încă nu l-am testat, dar arată bine - mulțumesc

cwd cwd
26 iun. 2012 21:23:31

Pe site-ul tău ai și taxonomiile personalizate, sugerez să schimbi numele funcțiilor pentru cei care nu își dau seama. În codul personalizat ai scris: comma_tags_filter în loc de 'comma_tags_filter' ceea ce afectează codul destul de mult. În rest, treabă bună.

David H David H
17 iun. 2014 18:13:07
0

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

23 nov. 2019 14:21:14
5

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.

21 feb. 2012 02:17:21
Comentarii

Modificarea nucleului WP nu este probabil o idee bună.

chrisguitarguy chrisguitarguy
21 feb. 2012 02:27:53

Știu asta! dar el a pus întrebarea. Eu doar am dat răspunsul.

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

Da, dar modificarea nucleului este răspunsul greșit. -1

EAMann EAMann
21 feb. 2012 04:51:08

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

cwd cwd
21 feb. 2012 06:06:26

@cwd, cu plăcere :). sper că te ajută.

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

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 );
11 apr. 2018 11:19:24
Comentarii

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

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

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');
6 aug. 2011 04:37:49
Comentarii

Problema nu este afișarea lor cu virgule, ci păstrarea virgulelor ca parte a numelui etichetei/categoriei atunci când le introduceți (în timpul editării postării). Aș dori să aflu cum să modific WordPress (sau să scriu un plugin) pentru a permite acest lucru.

cwd cwd
7 aug. 2011 07:54:26