web-dev-qa-db-ja.com

タグ名にコンマを許可するにはどうすればよいですか。

タグ名にカンマを使用したいのですが。例えば、"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 しかし、少なくともしばらくの間、それは解決されないかもしれないように見えます。

それまでの間、カテゴリページからカテゴリを追加するよりも簡単な解決策を探しています。

私はプラグインを検索してみましたが、役立つと思われるものは見当たりませんでした。カテゴリのリストやタグを表示するときにカンマを他の文字に置き換えることを扱う例はいくつかありますが、ユーザがデフォルトのセパレータを置き換えることを可能にするプラグインはありません。

自分でコアにパッチをあてる必要があるかどうかは気にしません。理想的にはプラグインを書くことができますが、コードの一部を見た後でこれが処理される場所を特定することはできません。

誰かが解決策を持っていますか、またはハッキングを始めるためにどんな機能とジャバスクリプトについてのヒント?どこからコードを探し始めるのかわかりません。

11
cwd

コアハッキングは必要ありません - おかげで: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/

あいさつ、アンディ

7
foo bored

プログラム的にタグをコンマで保存することは可能で、とても簡単です。

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 );
1
Shaun Cockerill

あなたはフィルタを使うことができます。

たとえば、タグクラウド内の各タグの後にカンマを追加する場合は、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');
0
Tara

これが解決策です。 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 。コードをハックして頑張ってください。フックはありません。それはハードコーディングされています...すみません。今のところ、コードをハッキングすることが唯一の選択肢であると思います。

0
Asaf Chertkoff