Etiket adlarında virgüllere nasıl izin verebilirim?


15

Etiket adlarında virgüllere izin vermek istiyorum? Örneğin, "hello, world"ya "portland, or"ama Wordpress ayırarak tutar. Bunu kategoriler sayfasından yapabilirim:

görüntü http://img839.imageshack.us/img839/6869/picturepp.png

Ve iyi görünüyor. Ancak yayın kenar çubuğundan eklenen hiçbir şey burada görünmüyor:

görüntü http://img52.imageshack.us/img52/4950/picture1oax.png

Burada bazı tartışmalar var: http://core.trac.wordpress.org/ticket/14691 ama en azından bir süreliğine çözülmeyebilir gibi görünüyor.

Bu arada, kategoriler sayfasından kategori eklemekten daha kolay bir çözüm arıyorum.

Eklentileri aramayı denedim ve yardımcı olabilecek herhangi bir şey görmedim. Kategori veya etiket listesini görüntülerken virgüllerin diğer karakterlerle değiştirilmesiyle ilgili birkaç şey var, ancak kullanıcının varsayılan ayırıcıyı değiştirmesine izin veren herhangi bir eklenti görmüyorum.

Çekirdeği kendim düzeltmem gerekip gerekmediği umurumda değil. İdeal olarak bir eklenti yazabilirim, ancak kodun bazılarına baktıktan sonra bunun ele alındığı yeri anlayamıyorum.

Kimse bir çözüm veya kesmek başlatmak için hangi fonksiyonları ve javascript ipuçları var mı? Nereden kod bakmaya başlayacağından emin değilim.


1
Bunu başarmada şansın var mı? Ayrıca bir çözüm arıyorum.
supertrue

Bunları kategori sayfasından ekledim (yukarıda belirtildiği gibi). Bu elverişsiz ama işe yarıyor. Çekirdeği değiştirme veya bir filtre ekleme konusunda henüz şans yok (henüz).
cwd

1
Asla çekirdeği değiştirmeyin;)
Jared

2
@Jared - çekirdeği değiştirmek sorun değil - sorununuzu / yamanızı core.trac.wordpress.org'a gönderdiğiniz sürece (umarım) çekirdeğe çekilene kadar kurulumunuzdaki yamayı devam ettirmenizde sorun yoktur)
cwd

Bu durumda haklısın. :)
Jared

Yanıtlar:


9

Çekirdek saldırıya gerek yok - sayesinde: HOOKS.

Kancalar sorunu güzel bir kombinasyonla düzeltmeye izin verir

  • çıkıştan önce "-" ile "," yerine kullanılan bir filtre
  • ve çıktının yönetici arayüzü için de filtrelenmediğinden emin olmak için bir "if" bloğu :)
  • ve son olarak, tüm etiketlerinizi "Fox, Peter" yerine "Fox - Peter" biçiminde virgülle kaydetme

İşte 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');
}

Belki de blog yazımdaki bu konuya ilişkin ek ayrıntılar da yardım .. http://blog.foobored.com/all/wordpress-tags-with-commas/

Selamlar, Andi


Bu kırılacak. Virgül sabit bir dize değildir, çevrilebilir. _x( ',', 'tag delimiter' )Gerçek sınırlayıcıyı yakalamak için kullanın .
fuxia

Henüz test etmedim ama iyi görünüyor - teşekkürler
cwd

Sitenizde özel vergiler de var, bunu anlayamayan herkes için işlev adlarını değiştirmenizi öneririz. Yazdığınız özel kodda, kodu çok fazla inciten 'comma_tags_filter' yerine comma_tags_filter yazdınız. Tüm iyi iş.
David H

1

Etiketleri virgülle programlı olarak kaydetmek mümkündür.

Arama yaparken wp_set_post_terms( $post_id, $terms, $taxonomy ), bir dize sağlarsanız, bir diziye patlar. Dizinizi $termsbir dizi olarak sağlarsanız, dizideki her öğe birden çok terime bölünmeden kendi terimi olarak sağlanır.

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

Hem wp_insert_postve sonradan wp_update_postkullanmak wp_set_post_termszaman $arg tax_inputayarlanır.

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

WordPress Dashboard UI'sini kullanarak anında terimler oluşturmanın en iyi yolu, virgül de dahil olmak üzere herhangi bir dizeyi tek bir terim olarak gönderen kendi meta kutunuzu oluşturmanızı gerektirebilir. Sınıflandırmayı kaydetmek için özel bir alan oluşturduğunuzda ACF Pro gibi bazı eklentiler bunu varsayılan olarak yapar ve ayrıca kaydedildiğinde terimleri yüklemeyi ve atamayı seçer.

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

Virgülle kaydedilse bile, virgül içeren bu terimlerin her bölümü yayını düzenlerken yine de ayrı öğeler olarak görünebilir. Bu durumda, varsayılan kullanıcı arayüzünü devre dışı bırakmak ve özel meta kutularına güvenmek en iyisi olabilir. Bu, bir yazı türünü düzenlerken Ekran Seçenekleri kullanılarak yapılabilir. Özel sınıflandırmalar, kayıt sırasında hızlı düzenleme bölümünden de gizlenebilir.

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

Sadece kirli bir düzeltme düşündüm (henüz kendim test etmedim), ancak hepsini bir diziye dönüştürerek terimleri her zaman sterilize edecek bir filtre ekleyebilirsiniz. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );ancak, her seferinde yalnızca bir dönem göndermenize izin verir.
Shaun Cockerill

0

bir filtre kullanacaksınız.

Örneğin, bir etiket bulutundaki her etiketten sonra virgül eklemek istiyorsanız, işlevlerinize aşağıdakileri ekleyebilirsiniz. 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
Sorun virgülle gösterilmiyor, sorun girerken (yazı düzenlenirken) virgülleri etiket / kategori adının bir parçası olarak tutuyor. Bunu yapmama izin vermek için wordpress'i nasıl düzenleyeceğimizi (veya bir eklenti yazacağımı) öğrenmek istiyorum.
cwd

0

İşte çözümünüz. 2614 hattına dikkat edin:

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

İçinde wp-include / taxonomy.php . Kodu hackleme konusunda iyi şanslar. kanca yok. zor kodlanmış ... Üzgünüm. Şimdilik kodu hacklemenin tek seçenek olduğunu düşünüyorum.


2
WP çekirdeğini hacklemek muhtemelen iyi bir fikir değildir.
chrisguitarguy

2
Bunu biliyorum! ama soruyu sordu. Sadece cevabı verdim.
Asaf Chertkoff

Evet, ancak çekirdek kesmek yanlış cevaptır. -1
EAMann

3
+1 - Orijinal yazımda çekirdeği hacklemenin bu durumda kabul edilebilir olduğunu belirttim. Bu işi yapmak için çekirdeği hacklemem gereken yeri bile bulamadım. En azından bunun mümkün olduğunu biliyorsanız, bir eklenti geliştirmek için çalışabilirim ya da WP topluluğundan bir kanca veya filtre isteyen uygun bir bilet isteği gönderebilirim. Bunu henüz kendim test etmeme rağmen, @AsafChertkoff teşekkür ederim.
cwd

@ cwd, hoş geldiniz :). umarım yardımcı olur.
Asaf Chertkoff

0

Etiket adlarındaki virgüller düzgün çalışmaz, çünkü etiketi bir gönderiye eklerken, WordPress bunu virgülle ayrılmış olarak birden çok anahtar kelime olarak ayrıştırır.

Basit bir düzeltme:

Kullanım ,( virgül için HTML kodu yerine normal virgül).

Sonra:

  • , yayınlar, etiket sayfası başlıkları ve diğer birçok yerde güzel bir virgül olarak görüntülenecektir.
  • ,Etiketin adını yazarken yönetici arayüzünün içinde raw görüntülenecektir .

HTML varlığını kullanan FYI ,çalışmıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.