WordPress Popular Postsがデータベースエラーを吐く

[安藤 篤史, 岡本 秀高, 古賀 海人, 深沢 幸治郎]の世界一わかりやすいWordPress 導入とサイト制作の教科書

人気記事を表示するWordPressプラグイン「WordPress Popular Posts」を使っているのですが、急にエラーを吐くようになりました。エラーメールが大量に届いています。。。よくみると、「WordPress 4.8.2 へのサイト更新が完了しました」メールの後からエラーメールが来るようになったみたいで、どうやらWordPress本体の自動更新がきっかけのようです。他のプラグインは特にエラーを出していませんでした。WordPressのダウングレードをするよりも、WordPress Popular Postsをなんとかして修正する方が良さそうですね。

PHP message: WordPress データベースエラー: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘%4$d, last_viewed = ‘%3$s” at line 3 for query INSERT INTO wp_popularpostsdata
(postid, day, last_viewed, pageviews) VALUES (641, ‘2017-09-20 19:56:52’, ‘2017-09-20 19:56:52’, 1)
ON DUPLICATE KEY UPDATE pageviews = pageviews + %4$d, last_viewed = ‘%3$s’; made by do_action(‘wp_ajax_nopriv_update_views_ajax’), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WordPressPopularPosts->update_views_ajax, WordPressPopularPosts->__update_views
PHP message: WordPress データベースエラー: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘%2$d, last_viewed = ‘%4$s” at line 3 for query INSERT INTO wp_popularpostssummary
(postid, pageviews, view_date, last_viewed) VALUES (641, 1, ‘2017-09-20’, ‘2017-09-20 19:56:52’)
ON DUPLICATE KEY UPDATE pageviews = pageviews + %2$d, last_viewed = ‘%4$s’; made by do_action(‘wp_ajax_nopriv_update_views_ajax’), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WordPressPopularPosts->update_views_ajax, WordPressPopularPosts->__update_views” while reading response header from upstream

エラーは、MySQLクエリのシンタックスエラーです。調べたところ、「%4$d」「%3$s」というような変数を参照する書き方が原因のようです。プラグイン本体ファイルwp-content/plugins/wordpress-popular-posts/wordpress-popular-posts.phpを、直接以下のように書き換えたらエラーは出なくなりました。

// Update all-time table
$result1 = $wpdb->query( $wpdb->prepare(
“INSERT INTO {$table}data
(postid, day, last_viewed, pageviews) VALUES (%d, %s, %s, %d)
ON DUPLICATE KEY UPDATE pageviews = pageviews + %d, last_viewed = ‘%s’;”,
$id,
$now,
$now,
$views,
$views,
$now
));

// Update range (summary) table
$result2 = $wpdb->query( $wpdb->prepare(
“INSERT INTO {$table}summary
(postid, pageviews, view_date, last_viewed) VALUES (%d, %d, %s, %s)
ON DUPLICATE KEY UPDATE pageviews = pageviews + %d, last_viewed = ‘%s’;”,
$id,
$views,
$curdate,
$now,
$views,
$now
));

クエリパラメータを直接指定するように修正してます。この修正が正しいのかどうか、本当にちゃんと動くのかどうかは動作確認していませんが、とりあえずの応急処置ということで。もし間違ってカウントされていたとしても、最悪リセットすれば直りますし。プラグインがアップデートされるのを待ちます。