wordpressでタグのカウントが実際の記事と合わないことがある

長く使われたwordpressでタグのカウントで数字があるのに実際の記事が0なんてことがある。タグでそこまでクリティカルなことも無いので知らない振りしてたけれど、ちょっと必要になったので調べてみた。

タグのカウントはwp_term_taxonomyのカラムに記録されている

MariaDB [wordpress]> desc wp_term_taxonomy;
+------------------+---------------------+------+-----+---------+----------------+
| Field            | Type                | Null | Key | Default | Extra          |
+------------------+---------------------+------+-----+---------+----------------+
| term_taxonomy_id | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| term_id          | bigint(20) unsigned | NO   | MUL | 0       |                |
| taxonomy         | varchar(32)         | NO   | MUL |         |                |
| description      | longtext            | NO   |     | NULL    |                |
| parent           | bigint(20) unsigned | NO   |     | 0       |                |
| count            | bigint(20)          | NO   |     | 0       |                |
+------------------+---------------------+------+-----+---------+----------------+
6 rows in set (0.001 sec)

$table_prefix  = 'wp_' が前提。
wp_term_taxonomy.count の数字がそれ。

$tags = get_tags( $args );
foreach($tags as $tag){
  echo $tag->count; //ここの数字が wp_term_taxonomy.count の数字
}

で、これがどういう分けか実際と合わなくなることがあるらしい。タグクラウドで表示してクリックさせても記事が無いなんてことになる。

どうしてそうなるのかは宿題。いつか調べられる時に調べる

なんでそうなるんだろうか?という疑問はあるけど、調べるの大変そうだなって考える。関連する件数を別テーブルで記録するのって仕組み的に数字合わなくなる可能性は経験上いっぱいありそうだし、そうならないようにできるなら、さっさと対応してるはずだ。

本当の件数をSQLで取得する

ということで本当の記事件数をSQLで取得するようにしてみた。

global $wpdb;
$rows = $wpdb->get_results("SELECT count(*) as posts_count FROM wp_posts WHERE post_status='publish' AND ID in (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id in (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy='post_tag' AND term_id in (SELECT term_id FROM wp_terms WHERE name='".$tag->name."')))");
foreach ($rows as $row){
  echo $row->posts_count;
}

関係するテーブルが4つあるのでSQLが長い。
wp_term_taxonomy.count の数字があるのに記事が無いタグは、wp_term_relationships.object_id まではあるんだけど wp_posts.ID が無い。なのでタグを設定していたもののその記事が非公開になったり削除されたりする何かのタイミングでwp_term_taxonomy.count が更新されないんだろうなと推察する。その更新されない現象を見つけてパッチ送って採用されるとサイトに名前が乗るのだろうか。

この記事が気に入ったらサポートをしてみませんか?