Как я могу разрешить запятые в именах тегов?

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.

Крючки позволяют исправить проблему с помощью хорошей комбинации

  • фильтр, заменяющий "-" на "," перед выводом
  • и блок «if», чтобы убедиться, что выходные данные также не фильтруются для интерфейса администратора :)
  • и, наконец, сохраняя все ваши теги с запятой в формате "Fox - Peter" вместо "Fox, Peter"

Вот код:

// 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' )чтобы поймать настоящий разделитель.
fuxia
Я еще не проверял это, но это выглядит хорошо - спасибо
cwd
На вашем сайте у вас также есть пользовательские налоги, я предлагаю вам изменить имена функций для тех, кто не может понять это. В пользовательском коде вы написали: comma_tags_filter вместо 'comma_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 Dashboard может потребовать создания собственного мета-блока, в котором любая строка, включая запятые, будет представлена ​​как один термин. Некоторые плагины, такие как 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

Вы можете использовать фильтр.

Например, если вы хотите добавить запятую после каждого тега в облаке тегов, вы можете поместить следующее в ваши 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
Проблема не в том, чтобы отображать их запятыми, проблема в том, чтобы запятые были частью имени тега / категории при их вводе (при редактировании сообщения). Я хотел бы выяснить, как редактировать 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-includes / taxonomy.php . Удачи в взломе кода. нет никакого крючка. это жестко запрограммировано ... Извините. Я думаю, что взлом кода - ваш единственный вариант на данный момент.

Асаф Черткофф
источник
2
Взламывать ядро ​​WP, вероятно, не очень хорошая идея.
chrisguitarguy
2
Я знаю это! но он задал вопрос. Я только что дал ответ.
Асаф Чертков
Да, но взлом ядра - неправильный ответ. -1
EAMann
3
+1 - в моем оригинальном посте я упоминал, что в этом случае взлом ядра был приемлем. Я даже не мог найти, где мне нужно взломать ядро, чтобы сделать эту работу. По крайней мере, если я знаю, что это возможно, я смогу разработать плагин или подать правильный запрос на тикет с просьбой о хуке или фильтре от сообщества WP. Итак, спасибо @AsafChertkoff, хотя я сам еще не проверял это.
cwd
@cwd, добро пожаловать :). надеюсь, это поможет.
Асаф Чертков
0

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

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

Используйте ,( HTML-код для запятой ) вместо обычной запятой.

Потом:

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

К вашему сведению, используя сущность HTML, ,не работает.

Фабьен Снауварт
источник