Як я можу дозволити коми в іменах тегів?


15

Я хочу дозволити коми в іменах тегів? Наприклад, "hello, world"або "portland, or"Wordpress продовжує їх розділяти. Я можу це зробити на сторінці категорій:

зображення http://img839.imageshack.us/img839/6869/picturepp.png

І це добре показує. Але все, що додано на бічній панелі публікацій, тут не відображається:

зображення http://img52.imageshack.us/img52/4950/picture1oax.png

Тут є деякі дискусії: http://core.trac.wordpress.org/ticket/14691, але схоже, що це, можливо, не вирішиться хоча б на деякий час.

Тим часом я шукаю більш просте рішення, ніж додавання категорій на сторінку категорій.

Я намагався шукати плагіни, і не бачив жодного, який був би корисним. Є декілька, які займаються заміною коми на інші символи, коли відображається список категорій або тегів, але я не бачу ніяких плагінів, які б дозволяли користувачу замінити роздільник за замовчуванням.

Мені байдуже, чи доведеться я сам проклеїти серцевину. В ідеалі я можу написати плагін, але переглянувши якийсь код, я не можу зрозуміти, куди це обробляється.

Хтось має рішення чи поради щодо функцій та javascript, щоб розпочати хакерство? Я не впевнений, з чого почати шукати код.


1
Будь-яка удача в досягненні цього? Я також шукаю рішення.
supertrue

Я щойно додав їх зі сторінки категорій (як згадувалося вище). Це незручно, але працює. Не пощастило змінити ядро ​​або додати фільтр (поки).
cwd

1
Ніколи не змінюйте ядро;)
Джаред

2
@Jared - добре змінювати ядро ​​- якщо ви надсилаєте свою проблему / патч до core.trac.wordpress.org і будете готові підтримувати патч у вашій установці, поки він (сподіваємось) не потрапить до ядра;)
cwd

У такому випадку ти маєш рацію. :)
Джаред

Відповіді:


9

Ніяких основних злому не потрібно - завдяки: HOOKS.

Гачки дозволяють виправити проблему приємним поєднанням

  • фільтр, що замінює "-" на "," перед виходом
  • і блок "якщо", щоб переконатися, що вихід також не фільтрується для адміністраторського інтерфейсу :)
  • і, нарешті, збереження всіх тегів із комою у форматі "Лисиця - Пітер" замість "Лисиця, Пітер"

Ось код:

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

Можливо, також допоможуть деякі додаткові деталі в моєму дописі до цієї теми .. http://blog.foobored.com/all/wordpress-tags-with-commas/

Вітаю, Енді


Це зламається. Кома не є фіксованим рядком, її можна перекласти. Використовуйте _x( ',', 'tag delimiter' )для лову справжнього роздільника.
фуксія

Я ще не перевіряв його, але він виглядає добре - дякую
cwd

На вашому веб-сайті ви також маєте спеціальний податок, я пропоную вам змінити назви функцій для тих, хто не може цього зрозуміти. У користувальницькому коді, який ви написали: command_tags_filter замість 'command_tags_filter', що дуже шкодить коду. Загалом чудова робота.
Девід Н

1

Зберігати теги комами можна легко і дуже просто.

При дзвінку wp_set_post_terms( $post_id, $terms, $taxonomy ), якщо ви постачаєте рядок, вона буде вибухнула в масив. Якщо ви надаєте свій $termsмасив, кожен елемент в масиві буде наданий як власний термін, не розділяючись на кілька термінів.

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

І те, wp_insert_postі згодом wp_update_postвикористовувати, wp_set_post_termsколи $arg tax_inputвстановлено значення.

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

Найкращий спосіб створити терміни під час використання користувальницького інтерфейсу інформаційної панелі WordPress, можливо, вам потрібно буде створити власне метаполе, яке подає будь-який рядок, включаючи коми як один термін. Деякі плагіни, такі як ACF Pro, роблять це за замовчуванням, коли створюєте спеціальне поле для збереження таксономії, а також вибираєте, щоб також завантажувати та призначати умови при збереженні.

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

Навіть якщо їх збережено комою, кожна частина цих термінів з комами все ж може відображатися як окремі елементи під час редагування публікації. У цьому випадку, можливо, найкраще вимкнути інтерфейс за замовчуванням та покластись на спеціальні метаполі. Це можна зробити за допомогою параметрів екрана під час редагування типу публікації. Спеціальні таксономії також можуть бути приховані від розділу швидкого редагування при реєстрації.

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

Просто подумав про брудне виправлення (ще не перевіряв його ще), але ви можете додати фільтр, який завжди буде санітувати умови, перетворюючи їх у масив. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );однак це дозволить подавати лише один термін.
Шон Кокерілл

0

ти мау використовуєш фільтр.

Наприклад, якщо ви хочете додати кому після кожного тегу в хмарі тегів, ви можете помістити наступне у свою функцію.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
Проблема не в відображенні їх комами, проблема полягає в збереженні коми як частини імені тега / категорії при введенні до них (під час редагування публікації). Я хотів би розібратися, як редагувати wordpress (або написати плагін), щоб дозволити мені це зробити.
cwd

0

Ось ваше укладання рішення. Зверніть увагу на рядок 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  

Всередині wp-include / taxonomy.php . Пощастимо зламати код. немає жодного гачка. важко закодовано ... Вибачте. Я думаю, що злом коду - це ваш єдиний варіант на даний момент.


2
Злом ядра WP, мабуть, не є хорошою ідеєю.
chrisguitarguy

2
Я знаю це! але він задав питання. Я просто дав відповідь.
Асаф Чертькофф

Так, але злом ядра - неправильна відповідь. -1
EAMann

3
+1 - У своєму початковому дописі я згадав, що хакерське ядро ​​було прийнятним у цьому випадку. Я навіть не міг знайти, де мені потрібно зламати серцевину, щоб зробити цю роботу. Принаймні, якщо я знаю, що це можливо, я можу попрацювати над розробкою плагіна або подати належний запит на отримання квитка з проханням на гачок або фільтр у спільноти WP. Тож дякую @AsafChertkoff, хоча я ще цього не перевіряв.
cwd

@cwd, ласкаво просимо :). сподівання, що допомагає.
Асаф Чертькофф

0

Коми в іменах тегів не працюватимуть належним чином, оскільки, додаючи тег до допису, WordPress буде аналізувати його як кілька ключових слів, розбиваючись на коми.

Просте виправлення:

Використовуйте ,( HTML-код для коми ) замість звичайної коми.

Потім:

  • , відображатиметься як добра кома всередині публікацій, назви сторінок тегів та купа інших місць.
  • Під ,час введення імені тегу він відображатиметься як необроблений інтерфейс адміністратора.

FYI, використовуючи сутність HTML, ,не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.