如何允许在标记名称中使用逗号?

时间:2011-08-05 作者:cwd

是否允许在标记名中使用逗号?例如"hello, world""portland, or" 但Wordpress一直将它们分开。我可以从“类别”页面执行此操作:

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

结果很好。但是从posts侧边栏添加的任何内容都不会在此处显示ok:

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

这里有一些讨论:http://core.trac.wordpress.org/ticket/14691 但看起来它可能无法解决,至少在一段时间内。

同时,我正在寻找一种比从类别页面添加类别更简单的解决方案。

我尝试过搜索插件,但没有发现任何有用的插件。在显示类别或标记列表时,有一些可以用其他字符替换逗号,但我没有看到任何允许用户替换默认分隔符的插件。

我不在乎我是否必须自己修补核心。理想情况下,我可以编写一个插件,但在查看了一些代码后,我不知道该如何处理。

有没有人提出了一个解决方案,或者提供了一些关于哪些函数和javascript可以开始黑客攻击的提示?我不确定从哪里开始查找代码。

5 个回复
最合适的回答,由SO网友:foo bored 整理而成

无需核心黑客攻击——多亏了:HOOKS。

挂钩允许通过以下方式很好地组合来解决问题

一个过滤器替换“-”by“,”before output和一个“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/

    你好,安迪

  • SO网友:Asaf Chertkoff

    这是你的解决方案。注意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. 祝你破解代码好运。没有任何钩子。它是硬编码的。。。很抱歉我认为破解代码是你目前唯一的选择。

    SO网友:Shaun Cockerill

    以编程方式使用逗号保存标记是可能的,而且非常容易。

    呼叫时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 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 );
    

    SO网友:Fabien Snauwaert

    标记名中的逗号无法正常工作,因为在将标记添加到帖子时,WordPress会将其解析为多个关键字,并在逗号处断开。

    一个简单的修复:

    使用, (the HTML code for the comma) 而不是普通的逗号。

    然后:

    • , 将在帖子、标记页面标题和其他一些地方显示为一个漂亮的逗号,, 输入标记名称时,位于管理界面的内部
    仅供参考,使用HTML实体,, 不起作用。

    SO网友:Tara

    你可以使用过滤器。

    例如,如果要在标记云中的每个标记后添加逗号,可以在函数中添加以下内容。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\');
    

    结束