注文一覧などでCSVエクスポートする際に、レンタルサーバなど/tmpディレクトリに書き込み権限が無い場合に生じます。
ここで安易にテンポラリディレクトリの指定をすると、セキュリティ上大きな穴を開けることになるので、そのあたりにも軽く触れて説明しておこうと思います。
※対処例を挙げますが、エラーが発生していてなおかつ解決方法が見つからな
い場合の参考程度で読んで頂くようお願いします。
※不安な場合はメールでお問い合わせください。
対処例
公式サイトで「pmpro_order_list_csv_export_tmp_dir」という名前でフィルタフックの仕様が紹介されてます。
apply_filters( 'pmpro_order_list_csv_export_tmp_dir', $tmp_dir );
これを呼ぶためにwp-config.phpに以下のように任意のテンポラリディレクトリを記述する事になると思います。
add_filter('pmpro_order_list_csv_export_tmp_dir', function($dir) {
return ABSPATH . '/hoge/tmp-xxxxxxxxx';
});
※/hoge/tmp-xxxxxxxxxディレクトリが作成済みである事が前提です。
セキュリティ上の注意点
本来であれば/hoge/tmp-xxxxxxxxxのディレクトリは、WEBのルートディレクトリ以外の、インターネットから物理的にアクセスできない場所を指定すべきなのですが、残念ながら一部のレンタルサーバーではWEBのルートより上位のディレクトリ操作が出来ないものがあります。
その場合、WordPress配下の以下のようなディレクトリを指定することになるかと思いますが、更に注意が必要です。
/wp-content/xxxxxxxxxxx
※xxxxxxxxxxxxの部分は任意のランダムな文字列
リスク
このディレクトリを用意するだけだと、インターネットから丸見えになります。
まずは万が一のディレクトリ内のファイル一覧が取得されないよう、中身の記述は何でも良いので、index.htmlファイルをこのディレクトリ内に置きます。
あとは.htaccessを置いて以下の記述を参考に、外部アクセスを遮断します。
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
以下のように2つファイルが置かれます。
/wp/content/xxxxxxxxxxxx/
└index.html
└.htaccess
補足
最近では改善されつつありますが、WordPressやプラグインが自動作成するディレクトリの中に、本来外部から見えない方が良いディレクトリにindex.htmlや.htaccessが置かれていない場合があります。
基本的にはリスクのあるものは置かないという思想で成り立ってるのかと思いますが、例え外部から直接実行しても何も起きないとしても、直接リクエストできる状況というのは怖いなと思います。
WEBサーバやWordPressのセキュリティ設定によっては更なる考慮も必要になるので、WEBサイトの運用が軌道に乗った後は以下の点も考慮が必要かと思います。
・中途半端に制限されたレンタルサーバは使わない
・必要な設定を適切に施せるサーバを選ぶ
・専門家に選定してもらって、セキュアな設定をする