Cocoonのアクセス集計とバックアップがAWSのLightsailで機能しない時の対処法

私は2つのサイトをAWS上に持っています。2つともCocoonを使っていますが、このサイトで以下の問題がありました。

  • バックアップをとろうとしたらサーバーエラー500が返却される
  • アクセス集計が常に0のまま

Cocoonのフォーラムでいくつか質問があったのですが、同じような原因の人はいませんでした。

原因

フォーラム上で、実行される対象ファイルが以下というのがわかりました。

cocoon-master/lib/page-backup/backup-download.php

中身を見てみると以下のように、外部から対象ファイルの情報をインポートしていることがわかりました。

require_once('../../../../../wp-load.php');

対象のフォルダを見てみると、片方のサイトには上記のファイルがあるのに、このサイトにはありませんでした。ワードプレスのインストール先が異なっていました。

左側がうまく動作しないもの。右側がうまく動作するものです。

対象のwp-load.phpは左の方の場合、/opt/bitnami/wordpress内にありました。一方で、右側の場合はhtdocsフォルダ内です。もう一度コードを見てみましょう。

require_once('../../../../../wp-load.php');

../というのはひとつ上のフォルダを見る、ということです。この場合はつまり、5つ上のフォルダの中にwp-load.phpがあることを期待しているわけです。左の構造の場合だと、page-backupフォルダの5つ上はwordpressですが、ここにはファイルがありません。

そのため、/opt/bitnami/wordpressフォルダ内にあるファイルをなんとかして読み込む必要があります。

解決方法

PHPは触ったことがないので、色々調べていたら以下のサイトを見つけました。

https://modoro.jp/lihgtsail-cocoon-error/

ありがたや!

変更前のこのコードを

require_once('../../../../../wp-load.php');

こちらに変更するだけ!

$parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] )[0];
require_once( $parse_uri . 'wp-load.php' );

調べてみると、$_SERVER['SCRIPT_FILENAME'] でファイルの実行パスを取得し、wp-contentという文字列で分割しているようです。wp-contentを見ると以下のようにショートカットになっていました。

これは、/bitnami/wordpress/wp-contentをさしていました。しかし、ここのパスは実行ファイルから見ると、/opt/bitnami/wordpress/wp-contentです。なので、この文字列は以下の二つに分割され、[0]で最初の方を取得しているわけです。

  • /opt/bitnami/wordpress/
  • wp-content

wp-contentで分割するので、2つ目のwp-contentはないかも?実行して確認していないので「たぶん」です。

と、いうことで上記のサイトに従って以下の2つのファイルを修正しました。

cocoon-master/lib/page-backup/backup-download.php
cocoon-master/lib/analytics/access.php

シークレットモードにして記事にアクセスしてみると以下のようにアクセス数が増えました。

コメント

タイトルとURLをコピーしました