(2008/03/30 追記あり)
RC 3 までいっている WordPress 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時間くらい考えることが必要そう。(笑
ぼのさん、まかした。 🙂
実際このままだとタグスラッグ編集機能の意味がまるで無いんですよね。Yurikoさんのパッチはどうですか?何か副作用はありそうですか?
tai さん、こんにちは。
そうなんですよねぇ。 期待する動作になりません。。
追記もしてみました。 ちょっといろいろ考えていたのですが、考えがまとまりません(笑)
たぶん、yuriko さんの タグname ユニークにするので正しいと思うのですが、コアチームのDB設計の意図がちょっとぼく分からなくってなのです。
もう少し考えるのと、チケットのウォッチさせていただこうと思います。
テーブルとして name がユニークではないのはすぐに分かったので、わたしのパッチでは、taxonomy が post_tag のときのみ、name も見るというアルゴリズムにしまいた。副作用が気になるのは、is_term() がどういう場面で呼ばれているか全部追いきってないからです。別のタグなのに slug と name が一致するとき (たとえば、name: 変なモノ, slug:funny と、name:funny, slug: fun とか) に、どういう挙動をするかが気になります。
他の方法として、タグを追加するときに is_term() ではなく、slug と name 両方の重複チェックをする別の関数 (exists_tag とか) を作った方がいいかとも考えています。
yuriko さん、こんばんは。
codex にはタグ名/スラッグとも一意と書かれているようではあるんですよね・・・。 結構なぞです。 カテゴリ名他も含めて、name の仕様が本来どうあるべきなのかで混乱しています。。
なるほどです。 いまのタグ追加のインターフェースの部分ではこれがベストかもしれません。
追記が変です。。(^-^;
一旦睡眠が必要だ・・・!
どうも自分で使っていない機能だと、いまいちよくわからんです。。 た、たのんだ。。Zzzz
ぼののもZzzz
ピンバック: わーどぷれすっ! » WP 2.5 のタグ付け機能のバグ
ピンバック: count_0の日記