WordPress 2.5 のタグ重複について追う

(2008/03/30 追記あり)

RC 3 までいっている WordPress 2.5 ですが、現在のところをタグ管理について不可解な動作があるようです。 ぼくも気になったのでちょっと調べてみました。

わーどぷれすっ! » WP 2.5 のタグ付け機能のバグ

2.3 からひきづってる(と思われる)カスタムなタグスラッグを設定しているときのタグの重複問題が 2.5 RC1 でも解決してないことに今頃気づいた。

WordPress は仕様書なんてないので、どの動作が正しい動きなのかわからないところもあるのですが、tai さんご指摘のようにユーザーインターフェースと見た目の動きは、おそらく間違いなく開発元も不具合と認識するような動作です。

ポイントとなるのは (wp)_terms というテーブル。 なんとか DB 設計書から仕様を読みほどいてみます。

Database Description/2.3 « WordPress Codex

Table: wp_terms

wp_terms は以下のような形をしています。

Field Type Null Key Default Extra
term_id bigint(20)   PRI   auto_increment
name varchar(55)        
slug varchar(200)   UNI IND    
term_group bigint(10)     0  

name カラムにタグ名、slug カラムにスラッグ値がはります。

term_id はプライマリキーで、id 番号がはいります。 じゃーこの番号が、何をキーにして増えていくかというと、 slug が UNI (ユニーク) なので slug になっています。

ってことは、

  • name (タグ名) は重複を許す。
  • slug は一意である。

という仕様に見えます。

ここで、いまの不具合に目を向けると、

  • 1. 新規タグ A (name) を作成する
  • 2. A の slug を変更する
  • 3. 再びタグを add するときに A を指定する

こうすると、A タグが 2 つできてしまうという現象です。 実はデータベースの構造だけをみるとこれは、

[tegaki]仕様どおり。。[/tegaki]

要は slug がキーになっているので、違う slug は別タグ(term_id) 扱いです。

ユーザインターフェースがおかしいのはおいておいて、仕様だとするとなにをしたいのかよくわからないですが、たとえば

plugin と addin というタグを extention という slug にまとめることが可能。

という動きともとれます。

もしこの DB 仕様のまま何かをなおすとすれば、ユーザインターフェース側を、

タグ add 時点に重複する name をみつけた場合は、どの slug ふるのかを決めさせる。

と変更することになると思います。

まぁたぶんこれはなくって、単純にデータベースの設計がおかしいのだとは思いますが。。(笑)

てなわけで、tai さんがチケットきってくれたので、こちらで真相がわかるに違いありません。 また、yuriko さんが折衷案のパッチをなげてくださっています。

Yuriko.Net: WordPress で日本語タグ重複問題解決パッチ案

とりあえず、taxonomy が post_tag の場合はタグ名でも比較チェックを行うパッチを考えてみました。手元のテストでは重複問題には対処できましたが、副作用がどれだけあるかは不明です……。

#6313 (When you have a custom tag slug, it will duplicate tags) – WordPress Trac – Trac

When you have a custom tag slug that is different from the tag name, you will have duplicate tags after saving a post with the tag.

さぁ、真相はいかに。 🙂

追記。 ぼのさんより指摘あり! 🙂 いろいろ話していて、

  • wp_terms の name はテーブルとしてはユニークにならない。 カテゴリ名その他とかもはいるから。
  • なのでこのテーブルとしては slug ユニークでよい。
  • でも、それだと wp_taxsonomy の存在意義がなぞ。

うーん、そういうことかー。 wp_taxsonomy もみないといけないということなのだろうか、、どうしたらいいのか良くわからなくなってきてしまいました。。 2時間くらい考えることが必要そう。(笑

ぼのさん、まかした。 🙂

WordPress 2.5 のタグ重複について追う」への8件のフィードバック

  1. 実際このままだとタグスラッグ編集機能の意味がまるで無いんですよね。Yurikoさんのパッチはどうですか?何か副作用はありそうですか?

  2. tai さん、こんにちは。

    そうなんですよねぇ。 期待する動作になりません。。

    追記もしてみました。 ちょっといろいろ考えていたのですが、考えがまとまりません(笑)

    たぶん、yuriko さんの タグname ユニークにするので正しいと思うのですが、コアチームのDB設計の意図がちょっとぼく分からなくってなのです。

    もう少し考えるのと、チケットのウォッチさせていただこうと思います。

  3. テーブルとして name がユニークではないのはすぐに分かったので、わたしのパッチでは、taxonomy が post_tag のときのみ、name も見るというアルゴリズムにしまいた。副作用が気になるのは、is_term() がどういう場面で呼ばれているか全部追いきってないからです。別のタグなのに slug と name が一致するとき (たとえば、name: 変なモノ, slug:funny と、name:funny, slug: fun とか) に、どういう挙動をするかが気になります。

    他の方法として、タグを追加するときに is_term() ではなく、slug と name 両方の重複チェックをする別の関数 (exists_tag とか) を作った方がいいかとも考えています。

  4. yuriko さん、こんばんは。

    副作用が気になるのは、is_term() がどういう場面で呼ばれているか全部追いきってないからです。

    codex にはタグ名/スラッグとも一意と書かれているようではあるんですよね・・・。 結構なぞです。 カテゴリ名他も含めて、name の仕様が本来どうあるべきなのかで混乱しています。。

    他の方法として、タグを追加するときに is_term() ではなく、slug と name 両方の重複チェックをする別の関数 (exists_tag とか) を作った方がいいかとも考えています。

    なるほどです。 いまのタグ追加のインターフェースの部分ではこれがベストかもしれません。

  5. どうも自分で使っていない機能だと、いまいちよくわからんです。。 た、たのんだ。。Zzzz

    ぼののもZzzz

  6. ピンバック: わーどぷれすっ! » WP 2.5 のタグ付け機能のバグ

  7. ピンバック: count_0の日記

コメントを残す