en_US English ja 日本語 zh_CN 中文

wordpress5.0にアップデートして投稿が保存できなくなったエラー

タイトルの通りwordpress5.0にアップデートをしたら、投稿編集の保存などができなくなってしまった話。
メジャーアップデートっぽいのだけど、前調べすることなくなんとなくアップデートしたら結構大変なエラーにハマった。

どうやらこのwordpress5.0へのアップデートでは投稿の編集画面にメジャーなアップデートが入った模様。だけどこの新しいバージョンの編集画面で投稿編集しようとすると、赤字で更新に失敗しましたと出て全く保存ができない。

とりあえずワードプレスの再起動なりしてみたのだけど効果なし。
しょうがないのでググって見たら、それなりに同じ症状を食らっている人がいる模様。というわけでいくつか試せることがありそうな雰囲気。

結果から書いておくと、私の場合はwordpress公式のClassic Editorというプラグインをインストールして有効化したら治った。
ただしwordpress5.0のメインのアップデートの一つである編集画面への変更を、昔のバージョンに戻すという本末転倒な方法。
まだアップデートしていない人はWordpressやプラグイン元がバグ修正を入れるまで待ってもよいかもしれない。

以下はググった中で出て来たバグの理由や他の治し方について簡単にメモしておく。私には効かなかったり、該当しなかったりのものだけど。

wordpress5.0の投稿更新不可バグの理由といくつかの対処法

理由については詳細はよくわからないんだけど、wp-jsonとのコミュニケーションがうまくいっていないからだそうだ。それでこのシステムが新しい編集方法のキモだそうで、そこが何らかの理由で潰されているとこのバグが起こる模様。

というわけで以下はいくつかの対処法。

  • パーマリンク設定をセーブし直す
    これが一番楽な対処法。設定のパーマリンク設定にいってただセーブするだけ。これで治った人が結構いたみたい。最初に試しておくべきもの。私にはこれは効果なし。
  • wp-jsonをブロックしている可能性のあるプラグインに対処する
    セキュリティー系のプラグインでこれをブロックしている可能性があるそうな。その場合はその設定を外す。もしくはそのプラグインを止めて事態が改善するか見てみる。私はこれは該当のソフトウェアがなかった。
  • httpsに設定を変える
    httpsにwordpress設定を変えていない場合そんなこともあるそうな。私はすでにhttpsなので該当しない。
  • Classic Editorプラグインで旧バージョンの編集方式に戻す
    私はこれで解決。

というわけでwordpress5.0のアップデートでエラーにハマった時のメモでした。アップデートで対応されるといいなと思うけれど、原因は複数ありそうな感じなので自分のハマった原因が対処されるかは謎だ。

まあ新しい編集画面そんなに使いやすそうじゃなかったからいいのだけど。

D

en_US English ja 日本語 zh_CN 中文

pythonを使ってjpeg画像をまとめて圧縮する方法

久々にwordpressの投稿関連の記事。とは言ってもpython記事だけれども。

さてwordpressユーザーの方はご存知の通り、wordpressのブログにアップできる画像の容量は1Mバイトまで。というわけでデジカメの画像はもちろん、携帯のカメラで撮影した写真でも多少サイズを小さくする必要があることが多い。

数枚ならどんな方法で圧縮してもいいのだけど、これが大量の画像になってくるとそれなりに面倒臭くなっていくもの。
いくつか良いフリーソフトウェアもあるようだけど、こんな時こそpythonを使って見るのも悪く無い。書き出しのファイルサイズを多少はコントロールできたり利点もある。

そういうわけで、この投稿ではpythonを使ってjpeg画像をまとめて1M以下にサイズ圧縮する方法について書いていきたい。

Pillowを使ってjpeg画像圧縮

画像の読み込みはpillowで。画像の読み込みができるpythonパッケージはいくつかあると思うのだけど、簡単な処理をするだけなら大して変わらないんじゃ無いかと信じている。
そんなことないよ。これのが全然早いよってのがあったら教えてください。

必要パッケージのインポート

まずは必要なパッケージをインポート。ファイル名の読み込みようにtkinter各種。それから画像処理にPIL、ファイル名の処理にosをインポート。
ioは画像サイズの処理の関係で利用。詳細は後ほど。

import os
from tkinter import Tk, ttk
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkms
from PIL import Image
from io import BytesIO

tkinterで読み込みファイル名の取得

取り立てて変わったこともないけれど、一応jpgでもjepgでも読み込めるようにしてはある。画像ファイルは./ORIGINALっていうディレクトリに入れておいて一気に読み込めるような設定。

tk = Tk()
tk.withdraw()
print ('select a data files')
filenames = tkfd.askopenfilenames(filetypes= [('jpg','*.jpg'),('jpeg','*.jpeg')], initialdir='./ORIGINAL')
tkms.showinfo('file paths are',filenames)
tk.destroy()

画像サイズを1M以下になるまでjpeg圧縮

というわけでメインパート。画像を縮小するのではなく圧縮する場合だと、jpeg保存のqualityを変えていけばサイズが変わる。この場合qualityを5ずつ落としていっているけれど、そこらへんは適当に調整していただきたい。
for文でqualityを下げながら一回一回ファイルを書き出し、osのstat.st_sizeでファイルサイズのチェックをしている。
ちなみに書き出しは./REDUCEDというディレクトリの中に。

for i in range(len(filenames)):
  img = Image.open(filenames[i])
  basename = os.path.basename(filenames[i])
  for j in range(10):
    img.save('./REDUCED/'+basename+'.jpeg',quality=90-j*5,optimize=True)
    if os.stat('./REDUCED/'+basename+'.jpeg').st_size < 1000000:
    break
  img.close()

しかしこのやり方だと毎回ファイルを書き出して、読み込んでっていうのが少し気持ち悪い。

というわけで以下は実際にはファイルを書き出さない例。ioのByteIOを利用することでそんなことが可能になる。初めて使ったのでこのパッケージの詳細についてはよく把握していない。

qual = [0]*len(filenames)
  for i in range(len(filenames)):
  img = Image.open(filenames[i])
  for j in range(10):
    img_file = BytesIO()
    img.save(img_file,'jpeg',quality=90-j*5,optimize=True)
    #print (img_file.tell())
    if img_file.tell() < 1000000:
      qual[i] = 90-j*5
      break
  basename = os.path.basename(filenames[i])
  img.save('./REDUCED/'+basename+".jpeg",quality=qual[i],optimize=True)
  img.close()

実際にファイルを書きださないで処理しようと思った理由は速度があげられるかなっていうところもあった。

というわけで二つのスクリプトを1.3M、3.5M、4.5Mのjpeg画像を使って速度チェック。
ちなみに書き出されたファイルのサイズは674、989、962[KB]。元のサイズ差のせいなのか、qualityを5ずつ落としているせいなのか目が荒い。

ファイルを書き出す最初のプログラム:

4.87; 4.89; 4.91; 4.87; 4.84

ファイルをメモリに保存しとく2個目のプログラム:

5.34; 5.35; 5.61; 5.22; 5.23

というわけで意外なことに、一々ファイルを書き出すプログラムの方が早かった。メモリを食う方が速度が落ちるのかな。使っているパソコンのシステム次第で変わりそうな気もするけどどうなんだろう。
大した速度の違いがあるわけではないので、個人的には2個目の方が良いかなって思ってるんだけど、どんなもんでしょうか?

変換前後

最後に圧縮前後の画像の一例を載せようと思ったら、当たり前だけど圧縮前の画像がサイズの都合でアップできなかった。なんのためにこの投稿を書いていたのやら。画像を並べたスクリーンショットを参考までに。

関連記事

1. pythonのまとめ

2. pythonでデジカメのraw画像を一括読み込みして別形式で保存する

D

en_US English ja 日本語 zh_CN 中文

Multisite language switcherの使い方

Multisite language switcherの使い方

WordPressのマルチサイトを利用したサイト多言語化の記事では書かなかったのだが、一応Multisite language switcherの簡単なTIPSを書いておく。 まずはサイトネットワーク管理のプラグインメニューから、新規追加でネットワークで有効化する。 それぞれの言語サイトの設定メニューから、Multisite language switcherのタブに行き言語設定。 どのページからでもお互いの言語に簡単に飛べるように、翻訳の無い記事であってもそれぞれの言語へのリンクを貼るようにした。

それからMultisite language switcherのウィジェットを追加しておく。 外観のウィジェットの設定に行き、サイドバーやフッターにウィジェットの追加をしておくと、よりお互いのサイトへのアクセスが良くなる。 ちなみに私のテーマtwentyseventeenでは、ウィジェットの説明文と国旗が重なってしまう不具合があった。 これは説明文の最後に全角スペースを足すことで回避できた。

さらにtwentyseventeenの場合携帯でアクセスしたときに問題がある。 上記設定だと違う言語に飛ぶリンクが下部にしか出ず不便なのだ。 そこでヘッダーにウイジェットを足す。 テーマの編集からテーマのための関数(function.php)を開く。 真ん中のあたりにregister_sidebarというのがあるので、初期からあるフッターなどをコピーペーストして1個増やす。 name, id, descriptionなどを変更し新しいウイジェットにする。

続いてテーマヘッダーheader.phpに移動。 いろんな場所に

<?php dynamic_sidebar('上記id'); ?>

を突っ込んでみた。 すると個別ページはうまくいくものの、トップページでは巨大なヘッダー絵のせいかいまいち表示がうまくいかない。 しょうがないので記事上に突っ込むことにした。 少し前に投稿したように個別投稿設定を編集し、上記コードを挿入した。 これだとトップページでの各投稿に毎回現れるのが若干うっとうしいが、携帯で開いた時にトップに表示するという目的は果たせた。

トップ画面のヘッダー画像のランダム表示

嫁が良い写真をたくさんもっており、アップロードしてくれていたので、トップ画面のヘッダー画像をランダム表示にした。 外観のテーマのカスタマイズから、ヘッダーメディアのところに行き、アップロード済みヘッダー画像をランダム表示するという欄をクリックするだけである。

D

en_US English ja 日本語 zh_CN 中文

wordpress・twenty-seventeenでの個別投稿の設定

twentyseventeenでの個別投稿設定(single.php)の編集

各個別投稿ページにウイジェットを追加するなどの操作を加えたいことがある。 ワードプレスの場合、テーマごとに編集する必要のあるファイルは異なる。 だいたいはsingle.phpやcontents.phpなどがその設定ファイルになっているだろう。 私の使っているワードプレスのデフォルトテーマ”twenty seventeen”での編集の仕方はあまりウェブで見当たらなかったので一応記しておく。 twenty seventeenではsingle.phpも存在しているが、実はページの設定は細かいテンプレートファイルに分けて書かれている。 そのため通常single.phpを編集するような場面では、それぞれのテンプレートファイルを編集する必要がある。 通常のブログ投稿の個別設定を変えるにはwordpressインストールディレクトリ下

/wp-content/themes/twentyseventeen/template-parts/post/

下のphpファイルを編集することで変更を加えることができる。 エックスサーバーの場合、ログインしてファイルマネージャーからファイルを直接編集しても良いし、編集したファイルをアップロードしても良い。 通常は子テーマをthemesディレクトリ下に作成し、そこにコピーしてから変更を加えて行くのが良いだろう。 私の場合、子テーマ側での変更が反映されないバグ?なのか私のなにかしらミスがあったので、直接親テーマを変更した。 マルチサイトにしているあたりに原因があるのかもしれないがわからない。 しかしテーマをアップデートしたら、そのつど書き直す必要があるのが難だ。

子テーマの作成

上記を書いていて一応書いておくかと思った。 この内容は多くの良質なウェブサイトがあったので、私的備忘録に概略だけ。 エックスサーバーの場合、ファイルマネージャーに行き/wp-content/themes/に適当な子テーマのフォルダーを作る。 フォルダー、ファイルはページ右の方の[作成]というところから作れる。 子テーマのフォルダーの中に入ったらstyle.cssというファイルを作製する。 style.cssにtwentyseventeenのテーマを使うという記述をしておしまい。 あとは必要なファイルを子テーマにコピーして編集する。 function.phpのコピーについては注意が必要らしいが、私はまだ編集していないのでわからない。

D

en_US English ja 日本語 zh_CN 中文

wordpress多言語サイトのhttps化

Xserverではhttps化が無料でできるということであったので、せっかくなのでトライしてみることにした。

Xserverでのサイトのhttps化

サイトのhttps化自体はとても簡単で、Xserverのサーバーパネルにアクセスし、ssl設定タブーssl設定の追加から確定するだけで良い。 30分ほど待つとhttpsのサイトにアクセスできるようになる。
問題はWordPressで多言語化などの目的で、先にマルチサイト化をしている場合だ。 設定をhttpsに変更しようとしても、メインサイトのアドレス変更はワードプレスの設定画面からはできない。 ウェブで検索したところ、直接データベースを編集すれば変更できるようである。 ちょっと時間ができたので、やってみることにした。

wordpress多言語サイトのhttps化

サイトのhttps化自体は少し前に前述の通りに済ませておいた。 サイトのバックアップをとってから、まずはマルチサイトのサブディレクトリサイトのhttps化をする。 これはとても簡単で、参加サイトーサイトネットワーク管理ーサイト、から各サイトの編集をクリックする。 設定タブに移動してsiteurlとhomeのアドレスをhttpsに変えてあげれば良い。
続いてメインサイトのhttps化に取り掛かる。 メインサイトのアドレスを変更するには、直接mySQLデータベースを編集する必要がある。 私のエックスサーバー環境下では、サーバーパネルにログインするとデータベースのところにphpmyadminというものがある。 これをクリックするとユーザー名とパスワードを求められるので入力する。 mySQLのパスワードなんぞ忘れた!という方はファイルマネージャーからワードプレスインストール先のwp-config.phpにアクセスすれば良い。
さてphpmyadminの画面を開いたら、左側のフォルダ一覧をプラスを押して開くとwp-optionsというファイルが見つかる。 このファイルをクリックすると右側に中身が表示される。 そうすると上の方にsiteurlとhomeというオプションが見つかるはずだ。 これをhttpsに変えてあげれば良い。
あとはワードプレスにログインし直し、参加サイトーサイトネットワーク管理ーサイトに行くと、設定タブのsiteurlとhomeのhttpがhttpsに変わっているのが確認できるはずだ。
ただ私の環境下では一つ問題があって、同ページの情報タブのサイトアドレスの表示がhttpのままなのだ。 色々試して見たのだがここが変わらない。 しかしhttpsで問題なくサイトが動いているようであるので、原因が判明するまでは置いておくことにした。

サイトのhttps化後にやっておくこと

さてwordpressのhttps化をしたら、内部リンクや画像などのアドレスを全てhttpsに変えておく。 私たちのブログは大したリンク数・画像数ではないので、手動で全部変換した。 続いてhttpからhttpsへの301リダイレクトの設定。 マルチサイトだとここがうまくいかないというウェブ情報が散見されたが、単純に下記の二行をhtaccessのRewriteEngine onの下に書き足したら今の所うまく動いている。

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

というわけで、多言語マルチサイトのhttps化でした。 微修正などがあれば追記予定。

D

 

 

en_US English ja 日本語 zh_CN 中文

Xserverでwordpressの言語別サイト分割

このブログはもともと一つのブログに私の日本語のブログと嫁の英語ブログを書いていた。 しかしgoogleなどの検索のことを考えると、英語と日本語のサイトは分けた方が良いという意見を耳にした。 そこでこのウェブサイトを、英語と日本語のサイトに分割することに挑戦してみることにした。 まだあまり投稿も増えていないので、マルチサイト作製に失敗しても初期化すればいいだろうと気楽なチャレンジであった。
ウェブでやり方をサーチしてみたところ、同じ試みをしている人は多い。 いくつかのウェブサイトを確認しながらであれば、素人でも十分に対応できそうである。 多少ファイルに直接アクセスして編集しないといけないところがあるが、普通に多言語化するだけであればコピーアンドペーストをするだけで良いので問題はないだろう。 詳しい説明はわかりやすいウェブサイトが多々あるので、この投稿では簡単な概略を書いておく。

始めは何はともあれ、バックアップをとるところから始める。 エックスサーバーは自動でバックアップが取られているようで、必要があれば数日前まで戻すことはできるようだ。 なのでとりあえずブログのテキストデータだけワードに貼り付けて保存することにする(下に記すがwordpressではxmlでサイトの情報の書き出しができた)。

続いてwordpressのセッティングをマルチサイト用に変える。 これはwp-configを編集する必要がある。エックスサーバーの場合ファイルマネージャーにアクセスして、wordpressのインストール先に存在しているはずだ。 編集は

define('WP_ALLOW_MULTISITE', true);

を足すだけだが、編集が必要なのはここまでですというコメントの上に足す必要があるので注意。
wordpressにログインし直すと、ツールタブからネットワークの設置ができるはずである。 指示通りにインストールをする。 私が設定したバージョン・条件では、ここでサブドメイン型にするかサブディレクトリ型にするかクリックすることで自分で選ぶことができた。 エックスサーバーでサブドメイン型は難しいという情報があったので、サブディレクトリでの設置を行うことにした。 あとはワードプレスの指示通りにwp-configに必要な情報を書き足し、またhtaccessを書き換える。

ここで再ログインすると参加サイトというタブができている。 サイトの新規追加に行き、サブディレクトリの名前を入れてサイトの作成を行う。 ここで私の場合何か問題があったのか、一つのサイトを追加した場合サブサイトの作成に成功することができなかった。 気にせずもう一つサブサイトを追加したところ今度は成功した。 二つとも消してやり直してみても1個目のサイトが作成できず、2個目だとできるというところは変わらなかったので、何かしら私のセッティングに問題があったのかもしれない。 詳しい原因がわかったら後に追記するかもしれないが、とりあえずはできたので良しということにした。

どうやらサブディレクトリで使おうとした名前と、同じ名前のサブドメインをすでに作っていたのが原因だったようだ。 何かしらが競合していたのだろう。 他の名前のものであれば問題なく作製できた。

あとはオリジナルのサイトからツールのエクスポートに行き、全てのコンテンツをxml形式でエクスポートする。 これをサブサイトでインポートすることでサイトのコピーができる。 あとはメインサイトから英語の記事を消して、サブサイトから日本語の記事を削除することで、言語別に分けることができた。
言語別サイトの管理は、Multisite Language Switcherで行うことにした。 このプラグインに関しては後ほど別記事で使い方を説明する

ということで、日本語盤と英語盤の投稿をのせるための言語別サイトを一つのWordPressに無事インストールすることができた。 運用上の問題点や改善点が出てきた場合は追記するなり、新記事を書くことにする。

D

en_US English ja 日本語 zh_CN 中文

Xserverでwordpressブログの始め方

オープンソースのブログ用ソフトウェアであるwordpressを使ってブログを始めた。 せっかくなので覚書に、プロセスをまとめておく。 レンタルサーバーはお手頃な値段帯の会社の中ではやや高めだが、評価がとても高かったxserver。 もちろんケースバイケースだが、値段がそれなりで評価が高いというのは信頼性が高いと思っている。
始め方の詳しい解説は多くのブログ、ウエブサイトがあるので、海外で始めるのに詰まったところを中心に簡単にまとめておきたい。

1 Xserverの契約

オンラインでの申し込み、最初は10日間の無料期間がある、とういかそれからしか始められない。 自分はとりあえず一番安いタイプx10で十分。 申し込み後しばらくしてから、電話による確認が必要とのメールが来る。 理由の説明はなかったが、これはおそらく海外からの申し込みによるものだろう。
xserverとのメールのやり取りと適切な手続き後、アカウント設定完了のメールを受信。 目的はwordpressをすることなので、無料期間内だが速やかに入金。 ドメインはその時やっていたキャンペーンで取得できた。

2 wordpressの設定

Xserverのサーバーパネルから自動インストールで一発でできる。 ただし、海外からは初期設定では管理ページにアクセスができない。 これは海外からのパスワード盗難を防ぐためのセキュリティー措置らしい。
そこで自分のIPアドレス限定で海外からのアクセスを許可するようにhtaccessに書き込む。 xxxは自分のグローバルIPアドレス。 しょっちゅう変更されるので、毎回変えなければならないのが難。

SetEnvIf Remote_Addr ^xxx\.xxx\.xxx\.xxx$ AllowCountry

アクセスの変更はXserverのサーバーパネルに行き、htaccessの編集というところからやれば良い。

3 後から初期に設定しておけばよかったかなと思ったこと(5/21/17追記)

マルチサイトで多言語化サイトなど運営したい場合の話だが、ssl化(https化)したいなら最初にやっておいた方が楽である。 特にエックスサーバーだと無料でできるので、始める時にやっておいた方が後で困難が少なくなる。
マルチサイトにすること自体も最初にやっておいた方が良い。 多少ではあるが手間がはぶける。
ファイルを直接いじらないといけないのが難だが、子テーマの作製は最初にやっておいた方がよいだろう。 テーマのアップデートでテーマに直接書き加えた変更点が消えるので、毎回書き直すのが結構大変だ。 私は諸事情で未だに親テーマを書き直さなけらばいけない状態になっていて結構大変。 あ、テーマ自体も変えるなら最初に変えといた方がよいでしょう。

D