本サイトのWordpressの表示が乱れていることに気が付き、どこかファイルが壊れたかといろいろ四苦八苦したところ、どうもWordpressプラグインのCrayon Syntax HightlighterがPHP7.3で誤動作するのが問題のようだ(2019年版 Crayon Syntax Highlighterのエラー)。そういやレンタルサーバー側から先日7.2から7.3に上げると案内がきていた。Crayonは高機能なSyntax Hightlighterなので使っている人も多いようだが、すでにメンテされなくなって3年くらいたっている。代わりのプラグインを探したが、書式がコンパチというのは見当たらない。とはいえいまさら古いコンテンツをすべて書き換えるのも面倒なので、いろいろ探したところGithubで有志の方がメンテナンスされていたようだ(Release Crayon Syntax Highlighter & PHP 7.3 fix · Crunchify/crayon-syntax-highlighter · GitHub)。Wordpressのプラグインサイトには乗らないので、手動でアップデートが必要だがとりあえずこれでしのぐ。
うちのWordpressはsqliteを使っているが、WordPressが4.4に上がってからどうも調子が悪いので、サーバーログを見てみると案の定エラーが多発している。一番大きかったのは、Error was no such table: wp_termmetaのエラー
とwp_termmetaがない!っのエラー。たぶんデータベース変換時にエラーがかかりこのテーブルを作成できなかったのだろう。WordPress › Support » WordPress 4.4 fatal errorなどをみると、wp_taxonomymetaを変換して作れとなっているが、sqliteではカラム名のリネームができないので、ちょっとやっかい・・・とりあえず無理やりSQLで新規に作って様子をみてみる(こればっかし)。とりあえずエラーログは出てないようだ・・
CREATE TABLE wp_termmeta ( meta_id INTEGER PRIMARY KEY AUTOINCREMENT, term_id INTEGER NOT NULL default '0', meta_key varchar(255) default NULL, meta_value text ) ;
ちなみにオリジナルはscheme.phpにある
$blog_tables = "CREATE TABLE $wpdb->termmeta ( meta_id bigint(20) unsigned NOT NULL auto_increment, term_id bigint(20) unsigned NOT NULL default '0', meta_key varchar(255) default NULL, meta_value longtext, PRIMARY KEY (meta_id), KEY term_id (term_id), KEY meta_key (meta_key($max_index_length)) ) $charset_collate;
(一部phpが入っているが、気にしない・・)
どうもこのmysql方式のsql文はpdo_sqlite_driver*.
こ のサイトはwordpressをsqliteで運用しているが、前々からサーバーのエラーログにエラーメッセージが出るのが気になっていた。まあ動いてる からいいかと思っていたが、たまにトップページのリクエストに1回目だけ失敗しているのがこれのせいではないかと最近気が付いた(遅い)その3つめ
エラーログはこんな感じ。
Error message was: Problem preparing the PDO SQL Statement. Error was no such column: false
sqliteにはboolean型がないので、"false"なんてカラムがないよ!といわれている。該当行は/wp/includes/user.php内で
$select_count[] = $wpdb->prepare( "COUNT(NULLIF(meta_value LIKE %s, false))", '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%');
でfalseをつかっている。これを0に変える。
$select_count[] = $wpdb->prepare( "COUNT(NULLIF(meta_value LIKE %s, 0))", '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%');
これで様子をみる。
こ のサイトはwordpressをsqliteで運用しているが、前々からサーバーのエラーログにエラーメッセージが出るのが気になっていた。まあ動いてる からいいかと思っていたが、たまにトップページのリクエストに1回目だけ失敗しているのがこれのせいではないかと最近気が付いた(遅い)その2つめ
エラーログはこんな感じ。
Error message was: Problem preparing the PDO SQL Statement. Error was a GROUP BY clause is required before HAVING
どうもsql構文で"HAVINGの前にはGROUP BYがいるで"と出ているようだ。該当行は/wp-admin/includes/template.php内で
$sql = "SELECT DISTINCT meta_key FROM $wpdb->postmeta WHERE meta_key NOT BETWEEN '_' AND '_z' HAVING meta_key NOT LIKE %s ORDER BY meta_key LIMIT %d";
ってな感じ。たしかにGROUPがないのにHAVINGは意味ないと思い、WHEREで統合。
$sql = "SELECT DISTINCT meta_key FROM $wpdb->postmeta WHERE (meta_key NOT BETWEEN '_' AND '_z') AND (meta_key NOT LIKE %s) ORDER BY meta_key LIMIT %d";
これで様子をみる。