Bagaimana saya bisa mengizinkan koma dalam nama tag?

15

Saya ingin memperbolehkan koma dalam nama tag? Sebagai contoh, "hello, world"atau "portland, or"tetapi Wordpress terus memisahkan mereka. Saya dapat melakukannya dari halaman kategori:

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

Dan itu muncul dengan baik. Tetapi apa pun yang ditambahkan dari bilah samping posting tidak muncul ok di sini:

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

Ada beberapa diskusi tentang hal ini di sini: http://core.trac.wordpress.org/ticket/14691 tetapi sepertinya itu mungkin tidak terpecahkan, setidaknya untuk sementara waktu.

Sementara itu, saya mencari solusi yang lebih mudah daripada menambahkan kategori dari halaman kategori.

Saya sudah mencoba mencari plugin, dan tidak melihat apa pun yang akan membantu. Ada beberapa yang berurusan dengan mengganti koma dengan karakter lain ketika menampilkan daftar kategori, atau tag, tetapi saya tidak melihat plugin yang memungkinkan pengguna untuk mengganti pemisah default.

Saya tidak peduli jika saya harus menambal inti sendiri. Idealnya saya bisa menulis plugin, tetapi setelah melihat-lihat beberapa kode saya tidak tahu di mana ini ditangani.

Adakah yang punya solusi, atau kiat tentang fungsi dan javascript apa saja untuk mulai meretas? Saya tidak yakin di mana harus mulai mencari kode.

cwd
sumber
1
Keberuntungan untuk mencapai ini? Saya juga mencari solusi.
supertrue
Saya baru saja menambahkannya dari halaman kategori (seperti disebutkan di atas). Ini tidak nyaman tetapi berfungsi. Tidak beruntung memodifikasi inti atau menambahkan filter (belum).
cwd
1
Jangan pernah memodifikasi intinya;)
Jared
2
@ Jared - tidak apa-apa untuk memodifikasi inti - selama Anda mengirimkan masalah Anda / patch ke core.trac.wordpress.org dan tidak apa-apa dengan mempertahankan patch pada instalasi Anda sampai (mudah-mudahan) ditarik ke dalam inti;)
cwd
Kalau begitu, Anda benar. :)
Jared

Jawaban:

9

Tidak diperlukan peretasan inti - terima kasih kepada: KAIT.

Kait memungkinkan untuk memperbaiki masalah dengan kombinasi yang bagus

  • filter menggantikan "-" oleh "," sebelum output
  • dan "jika" blok untuk memastikan output tidak juga difilter untuk antarmuka admin :)
  • dan akhirnya, simpan semua tag Anda dengan koma dalam format "Fox - Peter", bukan "Fox, Peter"

Berikut kodenya:

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

Mungkin beberapa detail tambahan di posting blog saya ke topik itu juga membantu .. http://blog.foobored.com/all/wordpress-tags-with-commas/

Salam, Andi

foo bosan
sumber
Ini akan pecah. Koma bukan string yang tetap, tetapi dapat diterjemahkan. Gunakan _x( ',', 'tag delimiter' )untuk menangkap pembatas nyata.
fuxia
Saya belum mengujinya tetapi kelihatannya bagus - terima kasih
cwd
Di situs Anda, Anda juga memiliki pajak khusus, saya sarankan Anda mengubah nama fungsi untuk siapa pun yang tidak dapat menemukannya. Pada kode khusus yang Anda tulis: comma_tags_filter alih-alih 'comma_tags_filter' yang cukup menyakitkan kode. Semuanya bagus.
David H
1

Mungkin dan sangat mudah untuk menyimpan tag dengan koma secara terprogram.

Saat memanggil wp_set_post_terms( $post_id, $terms, $taxonomy ), jika Anda memberikan string, string itu akan meledak menjadi sebuah array. Jika Anda menyediakan $termssebagai array, setiap item dalam array akan diberikan sebagai istilah sendiri tanpa dibagi menjadi beberapa istilah.

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

Keduanya wp_insert_postdan selanjutnya wp_update_postdigunakan wp_set_post_termssaat $arg tax_inputdiatur.

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

Cara terbaik untuk membuat istilah dengan cepat menggunakan WordPress Dashboard UI, mungkin mengharuskan Anda untuk membuat kotak meta Anda sendiri yang mengirimkan string apa pun termasuk koma sebagai satu istilah. Beberapa plugin, seperti ACF Pro, melakukan ini secara default ketika Anda membuat bidang khusus untuk menyimpan taksonomi, dan memilih juga memuat dan menetapkan persyaratan saat disimpan.

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

Bahkan ketika disimpan dengan koma, setiap bagian dari istilah itu dengan koma masih dapat muncul sebagai item terpisah saat mengedit posting. Dalam hal ini mungkin yang terbaik untuk menonaktifkan UI default dan mengandalkan kotak meta khusus. Ini dapat dilakukan menggunakan Opsi Layar saat mengedit jenis posting. Taksonomi khusus juga dapat disembunyikan dari bagian edit cepat saat terdaftar.

// Register Custom Taxonomy args - disable default UI in quick edit.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );
Shaun Cockerill
sumber
Hanya memikirkan perbaikan kotor (belum mengujinya sendiri), tetapi Anda dapat menambahkan filter yang akan selalu membersihkan istilah, dengan mengonversikan semuanya menjadi sebuah array. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );namun, itu hanya akan memungkinkan Anda untuk mengirim satu istilah pada satu waktu.
Shaun Cockerill
0

Anda akan menggunakan filter.

Misalnya, jika Anda ingin menambahkan koma setelah setiap tag di cloud tag, Anda dapat memasukkan yang berikut ini di functions.php Anda

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');
Tara
sumber
1
Masalahnya adalah tidak menampilkannya dengan koma, masalahnya adalah menjaga koma sebagai bagian dari nama tag / kategori ketika memasukkan mereka (saat mengedit posting). Saya ingin mengetahui cara mengedit wordpress (atau menulis plugin) agar saya dapat melakukannya.
cwd
0

Inilah solusi Anda. Perhatikan baris 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  

Di dalam wp-include / taxonomy.php . Semoga berhasil meretas kode. tidak ada kait. sulit dikodekan ... Maaf. Saya pikir peretasan kode adalah satu-satunya pilihan Anda untuk saat ini.

Asaf Chertkoff
sumber
2
Meretas inti WP mungkin bukan ide yang baik.
chrisguitarguy
2
Saya tahu itu! tapi dia mengajukan pertanyaan. Saya baru saja memberikan jawabannya.
Asaf Chertkoff
Ya, tetapi inti peretasan adalah jawaban yang salah . -1
EAMann
3
+1 - Dalam posting asli saya, saya menyebutkan bahwa meretas inti dapat diterima dalam kasus ini. Saya bahkan tidak dapat menemukan di mana saya perlu meretas inti untuk membuat pekerjaan ini. Setidaknya jika saya tahu ini mungkin, saya dapat bekerja untuk mengembangkan plugin atau mengirimkan permintaan tiket yang tepat meminta kail atau filter dari komunitas WP. Jadi, terima kasih @AsafChertkoff, meskipun saya belum mengujinya sendiri.
cwd
@ cwd, selamat datang :). berharap itu bisa membantu.
Asaf Chertkoff
0

Koma dalam nama tag tidak akan berfungsi dengan baik karena, ketika menambahkan tag ke posting, WordPress akan menguraikannya sebagai beberapa kata kunci, melanggar koma.

Perbaikan sederhana:

Gunakan ,( kode HTML untuk koma ) alih-alih koma biasa.

Kemudian:

  • , akan ditampilkan sebagai koma yang bagus di dalam pos, tag judul halaman, dan banyak tempat lainnya.
  • Ini akan menampilkan mentah, seperti ,, di dalam antarmuka admin saat mengetik nama tag.

FYI, menggunakan entitas HTML, ,tidak berfungsi.

Fabien Snauwaert
sumber