Come posso consentire le virgole nei nomi dei tag?


15

Voglio consentire le virgole nei nomi dei tag? Ad esempio, "hello, world"oppure "portland, or"Wordpress continua a separarli. Posso farlo dalla pagina delle categorie:

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

E si presenta bene. Ma qualsiasi cosa aggiunta dalla barra laterale dei post non viene visualizzata bene qui:

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

C'è qualche discussione 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 rispetto all'aggiunta di categorie dalla pagina delle categorie.

Ho provato a cercare plugin e non ho visto nulla di utile. Ci sono alcuni che si occupano di sostituire le virgole con altri caratteri quando si visualizza un elenco di categorie o tag, ma non vedo alcun plug-in che consenta all'utente di sostituire il separatore predefinito.

Non mi importa se devo rattoppare il core da solo. Idealmente potrei scrivere un plugin, ma dopo aver esaminato un po 'del codice non riesco a capire dove questo viene gestito.

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


1
Qualche fortuna nel raggiungere questo obiettivo? Sto anche cercando una soluzione.
supertratto

Li ho appena aggiunti dalla pagina delle categorie (come menzionato sopra). È scomodo ma funziona. Nessuna fortuna sulla modifica del core o sull'aggiunta di un filtro (ancora).
Cwd,

1
Non modificare mai il core;)
Jared

2
@Jared - Va bene modificare il core - fintanto che invii il tuo problema / patch a core.trac.wordpress.org e sei d'accordo con il mantenimento della patch sulla tua installazione fino a quando (si spera) non viene inserito nel core;)
data

In tal caso, hai ragione. :)
Jared

Risposte:


9

Nessun core hacking necessario - grazie a: HOOKS.

I ganci consentono di risolvere il problema con una bella combinazione di

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

Ecco il codice:

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

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

Saluti, Andi


Questo si romperà. La virgola non è una stringa fissa, può essere tradotta. Utilizzare _x( ',', 'tag delimiter' )per catturare il delimitatore reale.
fuxia

Non l'ho ancora provato ma sembra buono - grazie
cwd

Sul tuo sito hai anche le tasse personalizzate, ti suggerisco di cambiare i nomi delle funzioni per chiunque non riesca a capirlo. Sul codice personalizzato che hai scritto: comma_tags_filter invece di 'comma_tags_filter' che fa molto male al codice. Tutto sommato ottimo lavoro.
David H,

1

È possibile e molto semplice salvare i tag con virgole a livello di codice.

Quando si chiama wp_set_post_terms( $post_id, $terms, $taxonomy ), se si fornisce una stringa, questa verrà esplosa in un array. Se fornisci il tuo $termscome array, ogni articolo dell'array verrà fornito come un suo termine senza essere suddiviso in più termini.

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

Entrambi wp_insert_poste successivamente wp_update_postusano wp_set_post_termsquando $arg tax_inputè impostato.

// Ensure $terms is an 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 del dashboard di WordPress può richiedere la creazione di una propria metapagina che invii qualsiasi stringa, comprese le virgole, come un unico termine. Alcuni plug-in, come ACF Pro, lo fanno per impostazione predefinita quando si crea un campo personalizzato per salvare la tassonomia e si sceglie di caricare e assegnare i termini anche quando salvati.

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

Anche se salvato con una virgola, ogni parte di quei termini con virgole può comunque apparire come elementi separati durante la modifica del post. In questo caso potrebbe essere meglio disabilitare l'interfaccia utente predefinita e fare affidamento sulle meta box personalizzate. Questo può essere fatto utilizzando le Opzioni schermo quando si modifica un tipo di post. Le tassonomie personalizzate possono anche essere nascoste dalla sezione di modifica rapida durante la registrazione.

// Register Custom Taxonomy args - disable default UI in quick edit.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );

Ho solo pensato a una correzione sporca (non l'ho ancora testata da solo), ma potresti aggiungere un filtro che igienizzerà 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,

0

puoi usare un filtro.

Ad esempio, se vuoi aggiungere una virgola dopo ogni tag in una nuvola di tag, puoi inserire quanto segue in 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');

1
Il problema non è visualizzarli con le virgole, il problema è mantenere le virgole come parte del nome della tag / categoria durante l'immissione (durante la modifica del post). Mi piacerebbe capire come modificare wordpress (o scrivere un plugin) per permettermi di farlo.
Cwd,

0

Ecco la tua soluzione per la posa. Prestare attenzione alla linea 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  

All'interno di wp-Includes / taxonomy.php . Buona fortuna con l'hacking del codice. non c'è nessun gancio. è codificato ... Mi dispiace. Penso che l'hacking del codice sia l'unica opzione per ora.


2
L'hacking del core del WP non è probabilmente una buona idea.
chrisguitarguy,

2
Lo so! ma ha posto la domanda. Ho appena dato la risposta.
Asaf Chertkoff,

Sì, ma l'hacking core è la risposta sbagliata . -1
EAMann,

3
+1 - Nel mio post originale ho menzionato che l'hacking del core era accettabile in questo caso. Non riuscivo nemmeno a trovare dove dovevo hackerare il core per farlo funzionare. Almeno se so che è possibile, posso lavorare per sviluppare un plug-in o inviare una richiesta di ticket corretta chiedendo un hook o un filtro dalla comunità WP. Quindi, grazie @AsafChertkoff, anche se non l'ho ancora provato da solo.
Cwd,

@cwd, il tuo benvenuto :). Spero possa aiutare.
Asaf Chertkoff,

0

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

Una semplice soluzione:

Utilizzare ,( il codice HTML per la virgola ) anziché una virgola normale.

Poi:

  • , verrà visualizzato come una bella virgola all'interno di post, titoli di tag e un sacco di altri luoghi.
  • Verrà visualizzato come grezzo ,all'interno dell'interfaccia di amministrazione quando si digita il nome del tag.

FYI, utilizzando l'entità HTML, ,non funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.