如何在标签名称中使用逗号?


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
在实现这一目标上有运气吗?我也在寻找解决方案。
2011年

我刚刚从类别页面添加了它们(如上所述)。这不方便,但是可以。修改内核或添加过滤器还没有运气。
cwd

1
永远不要修改内核;)
Jared 2012年

2
@Jared-可以修改内核-只要您将问题/补丁提交到core.trac.wordpress.org即可,并且可以在您的安装程序上维护补丁,直到(希望)将补丁拉入内核;)
cwd 2012年

在这种情况下,您是对的。:)
Jared

Answers:


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 2012年

在您的网站上也有自定义税,建议您为无法弄清的人更改函数名。在自定义代码上,您编写了:comma_tags_filter而不是'comma_tags_filter',这对代码造成了很大的伤害。总而言之,做得很好。
David H

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仪表板UI即时创建术语的最佳方法可能是要求您创建自己的元框,以将包括逗号在内的任何字符串作为单个术语提交。在创建自定义字段以保存分类法时,默认情况下,某些插件(例如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
}

即使使用逗号保存,在编辑帖子时,这些带有逗号的术语的每个部分仍可能显示为单独的项目。在这种情况下,最好禁用默认UI并依赖自定义元框。编辑帖子类型时,可以使用“屏幕选项”来完成。注册时,自定义分类法也可以从快速编辑部分中隐藏。

// 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 2012年

2
我知道!但他问了一个问题。我刚刚给出了答案。
Asaf Chertkoff

是的,但是黑客入侵是错误的答案。-1
EAMann

3
+1-在我的原始帖子中,我确实提到过在这种情况下可以接受对内核的攻击。我什至找不到我需要破解内核的地方才能完成这项工作。至少,如果我知道这是可行的,那么我可以致力于开发插件或提交适当的票证请求,以要求WP社区提供挂钩或过滤器。因此,谢谢@AsafChertkoff,即使我自己尚未对此进行测试。
2012年

@cwd,不客气:)。希望能有所帮助。
2012年

0

标签名称中的逗号无法正常工作,因为在将标签添加到帖子中时,WordPress会将其解析为多个关键字,以逗号分隔。

一个简单的解决方法:

使用,逗号的HTML代码)代替常规逗号。

然后:

  • , 将在帖子,标签页标题和其他许多地方显示为一个漂亮的逗号。
  • ,输入标签名称时,它将在管理界面内以原始形式显示为。

仅供参考,使用HTML实体,不起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.