うちの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回目だけ失敗しているのがこれのせいではないかと最近気が付いた(遅い)その4つめ
エラーログはこんな感じ。
Error message was: Problem preparing the PDO SQL Statement. Error was near "7": syntax error
”7”の付近でsyntax errorといわれている。該当行は/wp/wp-includes/post.php内で
$old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" );
でDATE_SUBとINTERVALをつかっているが、これはsqliteにないので data(..)をつかう。
$old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE('now', '+ 7days' ) > post_date" );
これで様子をみる。
こ のサイトは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";
これで様子をみる。