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


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
これを達成する運はありますか?私も解決策を探しています。
スーパートゥルー

上記のように、カテゴリページから追加しました。それは不便ですが動作します。コアを変更したり、フィルターを追加したりすることはできません(まだ)。
cwd

1
コアを変更しないでください ;)
Jared

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はコードをかなり傷つけます。すべてのすべての素晴らしい仕事。
デビッドH 14年

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_postwp_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; } );ただし、一度に1つの用語のみを送信できます。
ショーンコケ

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
問題はそれらをコンマで表示することではなく、問題はそれらを入力するとき(投稿の編集中)にタグ/カテゴリ名の一部としてコンマを保持することです。私はそれを可能にするためにワードプレスを編集する(またはプラグインを書く)方法を見つけ出したいです。
-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コードの代わりに、通常のコンマの)。

次に:

  • , 投稿、タグページのタイトル、その他の場所に、カンマとして表示されます。
  • ,タグの名前を入力すると、管理インターフェイス内にasとしてrawが表示されます。

FYIは、HTMLエンティティを使用して機能,しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.