私はこの質問に関して他のスレッドを読むのに多くの時間を費やしました、しかし私は私のコードを正しく機能させることができません。
私はプラグインを作成しています、そして私は私のカスタム管理ページ上にアップロードフォームを設定しました、そして私はアップロードを処理するためにMedia Uploaderを使用しています。簡略化されたコードについては下記をご覧ください。
class myPlugin() {
function __construct(){
add_filter('wp_handle_upload_prefilter', array( $this, 'handle_upload_prefilter') );
add_filter('wp_handle_upload', array( $this, 'handle_upload') );
}
function handle_upload_prefilter( $file ) {
add_filter('upload_dir', array( $this, 'custom_upload_dir' ) );
return $file;
}
function handle_upload( $fileinfo ) {
remove_filter('upload_dir', array( $this, 'custom_upload_dir' ) );
return $fileinfo;
}
function custom_upload_dir($args) {
$args['path'] = $args['basedir'] . "/mypath" . $args['subdir'];
$args['url'] = $args['baseurl'] . "/mypath" . $args['subdir'];
return $args;
}
}
上記のコードは機能し、アップロードディレクトリを指定したパスに変更します。ただし、それはすべてのアップロードのアップロードディレクトリを変更しています。私のカスタム管理ページからアップロードするときだけ私のコードを実行したいのですが。
これは私がこれまでに試したことです(そして私のために働いていません):
$pagenow
関数でget_current_screen
とcustom_upload_dir
をテストするために条件式を使ってみましたが、毎回失敗するようで、デフォルトのアップロードパスを使います。__construct
で条件付きのテストをしてみましたが、エラーが返されました(WPライフサイクルの早すぎると思います)。handle_upload_prefilter
関数でも条件を実行してみたが無駄でした。入力名など、フォームデータを識別できるものが必要です。それらの1つ以上を確認し、それに応じて処理します。
function custom_upload_dir($args) {
if (isset($_POST['something'])) {
$args['path'] = $args['basedir'] . "/mypath" . $args['subdir'];
$args['url'] = $args['baseurl'] . "/mypath" . $args['subdir'];
}
return $args;
}
いくつかの調査の後、私が見ることができる唯一のものは...
POST
データを介してコールバックに渡されます。しかし、私はこれがあなたのカスタムプラグインページに設定されることを知りません。$_SERVER['HTTP_REFERER']
は正しく設定されているようです。それを解析して、あなたのプラグインページが元のページかどうかを判断することができます。私がフルプラグインソースを持っていたら私はいくつかのテストをすることができます。