Jak mogę zezwolić na przecinki w nazwach tagów?


15

Chcę dopuścić przecinki w nazwach tagów? Na przykład, "hello, world"czy "portland, or"jednak Wordpress trzyma ich rozdzielenie. Mogę to zrobić na stronie kategorii:

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

I pokazuje się dobrze. Ale nic dodane z paska bocznego postów nie pokazuje się tutaj dobrze:

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

Trwa dyskusja na ten temat tutaj: http://core.trac.wordpress.org/ticket/14691, ale wygląda na to, że może się nie rozwiązać, przynajmniej przez jakiś czas.

Tymczasem szukam łatwiejszego rozwiązania niż dodawanie kategorii ze strony kategorii.

Próbowałem szukać wtyczek i nie widziałem żadnej, która byłaby pomocna. Istnieje kilka, które zajmują się zastępowaniem przecinków innymi znakami podczas wyświetlania listy kategorii lub tagów, ale nie widzę żadnych wtyczek, które pozwalają użytkownikowi zastąpić domyślny separator.

Nie obchodzi mnie, czy muszę samodzielnie załatać rdzeń. Idealnie byłoby napisać wtyczkę, ale po przejrzeniu części kodu nie mogę dowiedzieć się, w jaki sposób zostanie to rozwiązane.

Czy ktoś ma rozwiązanie lub porady na temat tego, jakie funkcje i javascript zacząć hakować? Nie jestem pewien, od czego zacząć szukać w kodzie.


1
Masz szczęście w osiągnięciu tego? Szukam również rozwiązania.
supertrue

Właśnie dodałem je ze strony kategorii (jak wspomniano powyżej). Jest niewygodny, ale działa. Brak powodzenia w modyfikacji rdzenia lub dodaniu filtra (jeszcze).
cwd 21.10.11

1
Nigdy nie modyfikuj rdzenia;)
Jared

2
@Jared - modyfikowanie rdzenia jest w porządku - o ile prześlesz swój problem / poprawkę do core.trac.wordpress.org i nie przeszkadza ci utrzymanie poprawki w instalacji, dopóki (miejmy nadzieję) nie zostanie wciągnięta do rdzenia;)
cwd

W takim razie masz rację. :)
Jared

Odpowiedzi:


9

Nie wymaga hakowania rdzenia - dzięki: HAKI.

Haki pozwalają naprawić problem dzięki ładnej kombinacji

  • filtr zastępujący „-” przez „,” przed wyjściem
  • oraz blok „if”, aby upewnić się, że dane wyjściowe również nie są filtrowane dla interfejsu administratora :)
  • i wreszcie, zapisując wszystkie tagi przecinkiem w formacie „Fox - Peter” zamiast „Fox, Peter”

Oto kod:

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

Być może dodatkowe informacje w moim poście na blogu również na ten temat pomocy. Http://blog.foobored.com/all/wordpress-tags-with-commas/

Pozdrawiam, Andi


To się zepsuje. Przecinek nie jest stałym ciągiem, można go przetłumaczyć. Użyj, _x( ',', 'tag delimiter' )aby złapać prawdziwy ogranicznik.
fuxia

Jeszcze go nie testowałem, ale wygląda dobrze - dziękuję
cwd

Na swojej stronie masz również podatek niestandardowy. Sugeruję zmianę nazw funkcji dla każdego, kto nie może tego zrozumieć. Na niestandardowym kodzie napisałeś: comma_tags_filter zamiast 'comma_tags_filter', co dość boli kod. W sumie świetna robota.
David H

1

Programowo można zapisywać tagi przecinkami w bardzo prosty sposób.

Jeśli zadzwonisz wp_set_post_terms( $post_id, $terms, $taxonomy ), jeśli podasz ciąg, zostanie on rozbity na tablicę. Jeśli podasz $termsjako tablicę, każdy element w tablicy zostanie dostarczony jako własny termin bez podziału na wiele terminów.

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

Zarówno, wp_insert_posta następnie wp_update_postużyj, wp_set_post_termsgdy $arg tax_inputjest ustawiony.

// Ensure $terms is an array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );

Najlepszy sposób na tworzenie terminów w locie za pomocą interfejsu WordPress Dashboard może wymagać utworzenia własnego pola meta, w którym dowolny ciąg znaków, w tym przecinki, będzie jednym terminem. Niektóre wtyczki, takie jak ACF Pro, robią to domyślnie podczas tworzenia niestandardowego pola w celu zapisania taksonomii oraz wyboru ładowania i przypisywania warunków po zapisaniu.

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

Nawet po zapisaniu przecinkiem każda część tych terminów z przecinkami może nadal pojawiać się jako osobne elementy podczas edycji postu. W takim przypadku najlepiej może być wyłączyć domyślny interfejs użytkownika i polegać na niestandardowych meta-polach. Można to zrobić za pomocą Opcje ekranu podczas edycji typu postu. Niestandardowe taksonomie można również ukryć w sekcji szybkiej edycji podczas rejestracji.

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

Pomyślałem tylko o brudnej poprawce (jeszcze jej nie przetestowałem), ale możesz dodać filtr, który zawsze odkaże warunki, konwertując je wszystkie na tablicę. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );pozwoli to jednak na przesłanie tylko jednego terminu na raz.
Shaun Cockerill

0

możesz użyć filtra.

Na przykład, jeśli chcesz dodać przecinek po każdym znaczniku w chmurze znaczników, możesz umieścić następujące funkcje w pliku 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
Problem polega na tym, że nie wyświetla się ich przecinkami, problemem jest utrzymanie przecinków jako części nazwy znacznika / kategorii podczas ich wprowadzania (podczas edytowania postu). Chciałbym dowiedzieć się, jak edytować Wordpress (lub napisać wtyczkę), aby mi to umożliwić.
cwd

0

Oto twoje rozwiązanie r. Zwróć uwagę na linię 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  

Wewnątrz wp-obejmuje / taxonomy.php . Życzymy powodzenia w zhakowaniu kodu. nie ma żadnego haka. jest na stałe ... Przepraszam. Myślę, że włamanie się do kodu jest na razie jedyną opcją.


2
Hakowanie rdzenia WP prawdopodobnie nie jest dobrym pomysłem.
chrisguitarguy

2
Wiem to! ale zadał pytanie. Właśnie dałem odpowiedź.
Asaf Chertkoff

Tak, ale rdzeń hakerski to zła odpowiedź. -1
EAMann

3
+1 - W moim oryginalnym poście wspomniałem, że włamanie się do rdzenia było w tym przypadku dopuszczalne. Nie mogłem nawet znaleźć miejsca, w którym musiałem zhakować rdzeń, aby to zadziałało. Przynajmniej jeśli wiem, że jest to możliwe, mogę opracować wtyczkę lub przesłać odpowiednie żądanie biletu z prośbą o hak lub filtr ze społeczności WP. Dziękuję więc @AsafChertkoff, mimo że sam tego jeszcze nie testowałem.
cwd

@cwd, witamy :). mam nadzieję, że to pomaga.
Asaf Chertkoff

0

Przecinki w nazwach znaczników nie będą działać poprawnie, ponieważ podczas dodawania znacznika do postu WordPress parsuje go jako wiele słów kluczowych, dzieląc się przecinkiem.

Prosta poprawka:

Użyj ,( kod HTML przecinka ) zamiast zwykłego przecinka.

Następnie:

  • , będzie wyświetlany jako ładny przecinek w postach, tagach tytułów stron i wielu innych miejscach.
  • ,Podczas wpisywania nazwy znacznika wyświetli się jako surowy, w interfejsie administratora.

FYI, używając encji HTML, ,nie działa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.