Wordpressのプラグイン、Simple Tagsのタグ検索のバグを修正してみた
WordPress ME 2.2.3からWordPress 日本語版 2.5.1にバージョンアップ(1) | ねねとまつの小部屋
「ultimate tag warrior」で使用していたタグ機能を完全に移行し終わっていない。(タグ+タグにおける記事の絞り込みができない)
直しました
Wordpressのプラグイン、Simple Tagsのタグ検索のバグを修正しました。
例えば「ねねとまつの小部屋」でタグによる検索「Webデザイン」「ユーザビリティ」
こんな感じで、「+(プラス)」をクリックすると、複数タグによる絞り込み検索、
「~を除去」をクリックすると、検索条件から外すことが出来るように直しました。
元々の状態は、
- 複数タグになっても、絞り込まない(それぞれのタグに関連するタグが表示される。OR条件)。
もちろん、Simple Tagsのオプションでは”AND”を指定してる - 「+(プラス)」「~を除去」の対象のタグに日本語が含まれると、そのタグが指定されない。
でした。ちなみにUTF-8環境です。
Simple Tagsとは?
Wordpress2.3から標準でタグをサポートされるるようになり、そのためUTW(UltimateTagWarrior)が、更新を取りやめたことは、よく知られていることだと思います。
ただ、標準のタグの機能はUTWには程遠く、特にUTWの機能で実現していたタグ検索・関連するエントリ表示などがないのが、個人的にはかなり困ったことでした。
そこでそれらの機能を追加するSimple Tagsを導入しましたが、タグ検索がうまく動かないため、ソースを修正しました。
Simple Tagsのバージョンは、1.5.7です。
バグの原因は、
- そもそもAND条件のSQLがない
- Wordpress本体のバグ
でした。Wordpress本体のバグの方は、へたに直すとほかに影響がありそうなので、SimpleTagsの方を修正しました。
2.6で直るかもしれません(未検証)
修正箇所
Simple Tagsのプラグインフォルダの2.5(または2.3)というフォルダにある simple-tags.client.phpだけです。
function relatedTags(950行目から)、tagが複数になった場合、Slagを返さないため、修正
/*追加開始
* $slugsはtagがひとつの際は、slug(urlエンコードされている)を引っ張ってくるが、2つ以上の場合、name(urlエンコードされていない)ものを引っ張ってくるので対処
元ソースはコメントアウトここから
if ( strpos( $slugs, ',') ) {
$current_slugs = explode(',', $slugs);
} elseif ( strpos( $slugs, '+') ) {
$current_slugs = explode('+', $slugs);
} elseif ( strpos( $slugs, ' ') ) {
$current_slugs = explode(' ', $slugs);
}else {
$current_slugs[] = $slugs;
}
元ソースはコメントアウトここまで
ここから追加*/
if ( strpos( $slugs, ‘,’) ) {
$current_slugs= get_query_var(’tag_slug__in’);
$slugs = implode(’,',$current_slugs);
} elseif ( strpos( $slugs, ‘+’) ) {
//このケースは不明
$current_slugs= get_query_var(’tag_slug__and’);
$slugs = implode(’+',$current_slugs);
} elseif ( strpos( $slugs, ‘ ‘) ) {
$current_slugs= get_query_var(’tag_slug__and’);
$slugs = implode(’ ‘,$current_slugs);
}else {
$current_slugs[] = $slugs;
}
//追加終了
// Get cache if exist
$related_tags = false;
if ( $this->use_cache === true ) { // Use cache
~略~
1003行目から始まるSQLの結果に対して、さらに絞り込むむようにSQLを追加する
// Get objets
$terms = "'" . implode("', '", $current_slugs) . "'";
global $wpdb;
$object_ids = $wpdb->get_col("
SELECT tr.object_id
FROM {$wpdb->term_relationships} AS tr
INNER JOIN {$wpdb->term_taxonomy} AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
WHERE tt.taxonomy = 'post_tag'
AND t.slug IN ({$terms})
GROUP BY tr.object_id
ORDER BY tr.object_id ASC");
//method がANDの場合、tagの候補が絞り込みされるように変更
//ここから追加
if ( $method == 'AND' && !empty($object_ids) && count($current_slugs) > 1) {
$and_object_ids =array();
foreach($object_ids as $object_id){
//すべてのslugを含むかどうかチェックして、新しい$and_object_idsに
$temp_taxonomy_id = $wpdb->get_col("
SELECT tr.term_taxonomy_id
FROM {$wpdb->term_relationships} AS tr
INNER JOIN {$wpdb->term_taxonomy} AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
WHERE tt.taxonomy = 'post_tag'
AND t.slug IN ({$terms})
AND tr.object_id = {$object_id}
GROUP BY tr.term_taxonomy_id");
if(count($temp_taxonomy_id) == count($current_slugs)){
$and_object_ids[]=$object_id;
}
}
$object_ids = $and_object_ids;
$and_object_ids = array();
unset($and_object_ids);
}
//追加終了
// Clean memory
$terms = array();
unset($terms);
// Get tags for specified objects
$all_related_tags = wp_get_object_terms( $object_ids, ‘post_tag’, array(’orderby’ => $order_by, ‘order’ => $order) );
function removeRelatedTags(1148行目から)、tagが複数になった場合、Slagを返さないため、修正
// Get currents slugs
$slugs = get_query_var('tag');
/*ここから追加
* $slugsはtagがひとつの際は、slug(urlエンコードされている)を引っ張ってくるが、2つ以上の場合、name(urlエンコードされていない)ものを引っ張ってくるので対処
if ( strpos( $slugs, ',') ) {
$current_slugs = explode(',', $slugs);
$url_tag_sep = ',';
} elseif ( strpos( $slugs, '+') ) {
$current_slugs = explode('+', $slugs);
$url_tag_sep = '+';
} elseif ( strpos( $slugs, ' ') ) {
$current_slugs = explode(' ', $slugs);
$url_tag_sep = '+';
} else {
return $this->outputContent( 'st-remove-related-tags', $format, '', $notagstext, true );
}
*/
if ( strpos( $slugs, ',') ) {
$current_slugs= get_query_var('tag_slug__in');
$slugs = implode(',',$current_slugs);
$url_tag_sep = ',';
} elseif ( strpos( $slugs, '+') ) {
$current_slugs= get_query_var('tag_slug__and');
$slugs = implode('+',$current_slugs);
$url_tag_sep = '+';
} elseif ( strpos( $slugs, ' ') ) {
$current_slugs= get_query_var('tag_slug__and');
$slugs = implode(' ',$current_slugs);
$url_tag_sep = '+';
} else {
return $this->outputContent( 'st-remove-related-tags', $format, '', $notagstext, true );
}
//追加終了
if ( $format == 'array' || $format == 'object' ) {
return $current_slugs;
}
SQLの追加は、もっといい方法があるような気がします。
さて、作者の方にフィードバックするとしますが、本体のバグが原因の箇所はどうしたものか・・・・?
その他のタグ関連のバグ
Wordpress本体には、日本語のタグに、アルファベットのスラッグを設定すると、タグが重複してしまうバグがあるそうで、2.6で修正予定だそうです
そこで、Simple Tagsを使っていて、そのバグ関連の記事を書いていたりする方にトラックバックしてみます。
http://d.hatena.ne.jp/minorio/20080702/1214988028
http://trac.wordpress.org/ticket/6313
http://koyama.nu/archives/105
http://www.graphact.com/memo/2008/01/20/176
Popularity: 15 %
by redgasuki 












[...] も改善されませんでした。 (修正内容の詳細は「ねねとまつの小部屋 - Wordpressのプラグイン、Simple Tagsのタグ検索のバグを修正してみた」と「歩くパンケーキたち - WordPressのプラグイン [...]