WordPress4.4がリリースされました。
レンタルサーバによってはデフォルトのWPのバージョンが4.4になり、古いものが使用できなかったりしますが、そんな中、外部投稿や予約の際に記事の公開時刻が9時間時刻がずれる問題が起きている様です。
WordPress4.4で純正wordpressクライアントから時刻指定の投稿が出来なくなった
なるほど、確かにこれはちょっと問題ありですね。
というか結構正式リリース前で挿入している方多かったと思うのですが、どうして今まで話題になっていなかったのでしょうか?
検索してもあまり情報がまだ出て無い様です。
当方もサーバ経由で投稿してますのでちょっと困りました。
【バグの原因】
WordPressがバージョン4.4になる際に外部投稿のxmlrpc.phpが使用するクラスファイル「class-wp-xmlrpc-server.php」においてちょっとした時刻の形式の変換にバグがあり、
投稿日時がグリニッジ標準時になってしまっていた。
(日本とグリニッジ標準時との時差は-9時間であり、この為9時間の時刻ずれが発生した。)
当方の環境では投稿の予約でxmlrpc経由にて post_date_gmtをiso8601でpostしているのですが、これがどうも上手く渡っていない様でした。
対策パッチがWordPress4.4.1で当たる様ですが
https://core.trac.wordpress.org/ticket/35053
これでアプリからの投稿は大丈夫そうですが、Webからのxmlrpc経由での投稿はちょっとまだダメかもしれません。
また、WordPress4.4.1のリリースはマイルストーン
https://core.trac.wordpress.org/milestone/4.4.1
を見た感じもうちょっとだけかかる様です。
という事でWordPressのファイルを修正したらいけたのでちょっとご紹介します。
当方の環境で動いただけで保証等は一切ありませんので参考程度にご覧下さい。
該当ファイルを修正する場合は必ずバックアップを取った後に全て自己責任にて実行して下さい。
対象ファイルは wp-includes/class-wp-xmlrpc-server.php で
5348行目
1 |
$post_date = iso8601_to_datetime( $dateCreated ); |
を
1 |
$post_date = $dateCreated; |
に変更
5341行目
1 2 3 4 5 |
if ( !empty( $content_struct['date_created_gmt'] ) ) // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; elseif ( !empty( $content_struct['dateCreated']) ) $dateCreated = $content_struct['dateCreated']->getIso(); |
を
1 2 3 4 5 6 7 |
if ( !empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force $dateCreated = iso8601_to_datetime( rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z' ); $dateCreated = get_date_from_gmt( $dateCreated ); } elseif ( !empty( $content_struct['dateCreated']) ) { $dateCreated = iso8601_to_datetime( $content_struct['dateCreated']->getIso() ); } |
に変更
4994行目
1 |
$post_date = iso8601_to_datetime( $dateCreated ); |
を
1 |
$post_date = $dateCreated; |
に変更
4989行目
1 2 3 |
$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; elseif ( !empty( $content_struct['dateCreated']) ) $dateCreated = $content_struct['dateCreated']->getIso(); |
を
1 2 3 4 5 |
$dateCreated = iso8601_to_datetime( rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z' ); $dateCreated = get_date_from_gmt( $dateCreated ); } elseif ( !empty( $content_struct['dateCreated']) ) { $dateCreated = iso8601_to_datetime( $content_struct['dateCreated']->getIso() ); } |
に変更
4987行目
1 |
if ( !empty( $content_struct['date_created_gmt'] ) ) |
を
1 |
if ( !empty( $content_struct['date_created_gmt'] ) ) { |
に変更
1352行目
1 |
$post_data['post_date'] = iso8601_to_datetime( $dateCreated ); |
を
1 |
$post_data['post_date'] = $dateCreated; |
に変更
1344行目
1 2 3 4 5 |
if ( ! empty( $post_data['post_date_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $post_data['post_date'] ) ) { $dateCreated = $post_data['post_date']->getIso(); |
を
1 2 3 4 5 6 |
if ( ! empty( $post_data['post_date_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = iso8601_to_datetime( rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z' ); $dateCreated = get_date_from_gmt( $dateCreated ); } elseif ( ! empty( $post_data['post_date'] ) ) { $dateCreated = iso8601_to_datetime( $post_data['post_date']->getIso() ); |
に変更
パッチファイルを参考にしましたが、それだとサーバからPOSTでxmlrpc.php経由で投稿した場合に上手く行かなかったので、該当ファイルのメソッドを追いかけていったら _insert_postメソッドの所だったので1344行目の修正になってます。
しかし早く正式対応が望まれますね、何か良い方法をご存知の方いらっしゃいましたら情報をお待ちしております。
コメントにて質問を頂きましたので以下追記 2016/07/08
基本的にこのバグはWordPress4.4.1で修正されているみたいです。
https://kosukety.org/fixed-time-zone-bug-wordpress/
http://hitoriblog.com/?p=33978
まぁ、ただアプリ経由投稿の場合のみ対応しているのかもしれません。
(アプリもxmlrpcのAPI使ってるじゃんと突っ込まれそうですが、使っているものがちょっと違ってたりします。)
上記ブログにあるように
・下書きで投稿してから、webブラウザ経由でアクセスして予約投稿時間変更
・9時間ずらして予約投稿
という対応法もあります。(対応のアップデートが入るまで、これが無難ですね。)
でも、この場合、RSSの時間がずれたりして、アンテナサイト等を集客のメインに
しているサイトさんだと影響でちゃうんですよね。
それに外部投稿使う意味なくなっちゃいますもんね。
意外と話題になってないので、他に誤りが無いか、一度各種設定を見直してみるのもいいかもしれません。
以下、もし投稿プログラムをphpのpearのXML/RPC(または2)等で
自作している場合の話ですが
けっこうやっちゃうのが、投稿のxmlで渡す時間のパラメータ
1 2 |
post_date post_date_gmt |
と2種類があるのですが、これを間違えると9時間ずれます。
どちらを使うかは方針次第ですが、どちらか片方のみで説明の無いブログが多いので
パラメータ名は post_date_gmt しか無いと思い込んで使ってると9時間ずれます。
よくある形の使い方を以下に示していきます。
投稿、または予約したい時間を
1 |
$reserveDatetime |
とします。
この中に入るのは、例えば
1 |
$reserveDatetime = date("Y-m-d H:i:s"); |
ですね。
そして、パラメータに渡したい時間を
1 |
$reserveDatetimeGmtToJp |
としますと
1 |
reserveDatetimeGmtToJp = strtotime($reserveDatetime . " +9 hour"); |
となります。
ここで9時間足してるのがミソです。
そして使う時は
1 |
'post_date' => new XML_RPC_Value(reserveDatetimeGmtToJp, 'dateTime.iso8601'), |
とこんな感じですね。
パラメター名で
post_date を使うか post_date_gmt を使うか
また、使用する時間に
9時間足すか、足さないか
の2種類×2種類組み合わせで試してみるのが良いかもしれません。
もし、gmtやその辺の概念やポリシーが固まって理解しているのであれば
試す必要もなく決まってくるかと思います。
これで
・実際に記事が投稿される時刻
・ユーザに表示されるページ内に表記される投稿時刻(テーマデザイン等で投稿時刻を表示しているデザインの場合)
・RSSフィードで表示される投稿時刻(9時間前の時間になっててもGMT等が付いていればそれは正常です。)
等が問題なければOKです。
有難う御座いました!おかげさまでバッチリ動作してます!
ファイル本体をダウンロード出来れば超嬉しかったです。
コピーミスで何度かエラー出しちゃってました。