wordpressで編集できない

wordpressは使い勝手の良いCMSの一つですが、ときとして不具合というか、バグというか、よく分からない挙動をすることがあります。例えば、テーマやプラグインが編集できなくなる、といったものがあげられます。投稿そのものが出来なくなったという話も出てきましたが、プログラムの性質上、そういうこともあり得ます。アップデート後に、うっかり「やっちゃったぁ」というヤツでしょう。

ただ、wordpressでは実行しなかった代わりに何らかの文章を出力することがあります。通常、作成者の意図しない動作をした時にこういう報告を出すようにする訳ですが、これがいわゆる例外やエラーのことです。ちなみにバグとは、プログラムに隠れている誤りのことです。エラーも誤りを意味します。従って、wordpressで実行されなかった代わりに出力される文章も例外やエラーであり、バグであると考えられます。以前普通に利用できたものが突然利用できなくなってるわけですから。それがwordpressの新しい仕様だと言われれば、話はそれで終わります。仕様ですからバグではないということになります。しかし、そういった情報は見当たりません。最終的には、バグの原因がユーザ側にあるのか、wordpress本体にあるのか、或いはその両方にあるのかが焦点となりますけれど。

記事を投稿できない

記事を編集できないなんて本末転倒な話なのですが、これはwordpressが新しいエディタにかえてから発生したようです。筆者はほとんど「Classic Editor」を使って編集していたため気づきませんでしたが。「Classic Editor」はwordpress側が提供しているプラグインのことです。一方、MySQLデータベースサーバをバージョンアップしたら更新できるようになったという報告もあり、この場合の原因はユーザ側の環境ということになります。ただ、以前普通に使えていたものが突然利用できなくなるというのは、プログラム上のどこかに誤りがあるということに違いありません。

wordpressのテーマを編集できない

筆者の環境では以下の三パターンで、wordpressの編集ができない状況を確認しました。

  1. 何かうまくいかなかったようです。変更が保存されていないかもしれません。手動で修正し、FTP 経由でファイルをアップロードすることもできます。
  2. wp-content/themes/themes名/header.php ファイルの~行目のエラーのため、PHP コードの変更をロールバックしました。修正し、もう一度保存してください。
  3. 致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。

コードを変えた

一つ目の「何かうまくいかなかったようです。変更が保存されていないかもしれません。手動で修正し、FTP 経由でファイルをアップロードすることもできます。」という文章は、wordpressのファイルを編集して、尚且つコードに誤りがあるときに出てくるようです。この場合はケースバイケースであるため、直前に編集したところを重点に探してwordpressのテンプレートなどを修正します。

マルチサイト用関数が注入されている

二つ目は、マルチサイトではないwordpressで、マルチサイト用の特定の関数がテンプレート内で利用されているときに発生します。例えば、「wp_get_sites()」や「switch_to_blog」など。同じマルチサイト用でも「is_main_site」や「network_home_url()」などは問題ないようですが、環境によってはこれらでもエラーを吐く可能性もあります。いずれにしてもマルチサイトのwordpressではないのに、これらの関数をつかって編集していると「wp-content/themes/themes名/header.php ファイルの~行目のエラーのため、PHP コードの変更をロールバックしました。修正し、もう一度保存してください。」と表示されるおそれがあります。「header」の部分は「index」や「footer」など他のテンプレート名になることも多々あります。

Basic認証

通常のwordpressとマルチサイトにおいてBasic認証を設定していると、「致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。」と表示されます。通常のwordpressだとhtaccessでBasic認証を解除すると直ります。一方、マルチサイトのwordpressはこの編集だけでは直りません。

マルチサイトで編集できない

wordpress本体の「/wp-admin/includes/file.php」内にある「admin_url( 'theme-editor.php' )」を「network_admin_url( 'theme-editor.php' )」に置き換えると直ります。ただし、Basic認証はつかえません。つかうと直りません。

原因は更新時にサーバ側からアクセスがあるためで、これを回避するためには「.htaccess」でBasic認証の代わりにIP制限などを施します。

order deny,allow
deny from all
# 自分のIP
allow from xxx.xxx.xxx.xxx
# サーバ側のIP
allow from xxx.xxx.xxx.xxx

wordpressのプラグインが編集できない

ワードプレスのプラグインで編集してから更新できないときは、phpMyAdminから「UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';」を実行し、一旦すべてのワードプレスプラグインを無効にしてから有効にするとうまく動くことがあります。また手動で全てを削除してからインストールしなおして有効化しても正常に戻ることがあります。ついでにSQL文の命令である「SELECT * FROM wp_options WHERE option_name = 'active_plugins';」を打ち込むことで、現在動いてるものが分かります。データベースへ直接触るため、一応バックアップを取っておくと安心です。

まとめ

いやもうなんか、ホントややこしいですね。筆者の記録ではワープレ「4.9.1」からこういった類の編集や更新が出来なくなるという問題が発生しだしました。その後、投稿の編集や更新ができなくなる現象も加わって、ワープレの編集や更新に関する問題はハッキリとした解決法を見いだせないまま保留みたいな感じになっているのが現状ですかね。

なんでこんなにややこしくなったのかというと、formタグで更新させていたテーマやプラグイン、記事投稿画面などを非同期通信で更新させるようになったからです。非同期通信は簡単にいうと、ブラウザがページを読込んでいる最中にバックグラウンドで同時に他のデータを読込む技術のことです。何ができるのかといえば、編集している最中に、リアルタイムで何らかの動作をさせたり、ページ変遷なしで更新させたりすることができます。

ワープレではphpとjavascriptを使って相互に変数や配列のやりとりをさせている訳ですが、本来phpの変数などをjavascriptへ渡して計算なんかできません。その反対も然り。でも非同期通信の技術を使えば可能になります。いわゆるajaxというヤツです。書式は色々ありますが、どれか一つのルールを理解すればとりあえずそれで利用できます。

しかし、ワープレではBasic認証によるログイン方式にすると今のところ動作しません。非同期通信は本来同一ドメイン上でなら普通に導入できるはずなのですが、ワープレでは別ドメインとの通信関係があってややこしくなっている可能性もあります。そのため、うまく変数や配列を渡せてないのかも知れませんね。この点に関してはネット上を調べてもこれといった情報が見つからないです。ちなみに筆者の環境だとBasic認証を利用しても、自分で作成した非同期通信のファイルは普通に動きます。ワープレの中にテンプレートとして突っ込んでます。