web-dev-qa-db-ja.com

プラグインアップロード専用のアップロードディレクトリの変更

私はこの質問に関して他のスレッドを読むのに多くの時間を費やしました、しかし私は私のコードを正しく機能させることができません。

私はプラグインを作成しています、そして私は私のカスタム管理ページ上にアップロードフォームを設定しました、そして私はアップロードを処理するために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;
  }
}

上記のコードは機能し、アップロードディレクトリを指定したパスに変更します。ただし、それはすべてのアップロードのアップロードディレクトリを変更しています。私のカスタム管理ページからアップロードするときだけ私のコードを実行したいのですが。

これは私がこれまでに試したことです(そして私のために働いていません):

  1. $pagenow関数でget_current_screencustom_upload_dirをテストするために条件式を使ってみましたが、毎回失敗するようで、デフォルトのアップロードパスを使います。
  2. __constructで条件付きのテストをしてみましたが、エラーが返されました(WPライフサイクルの早すぎると思います)。
  3. 私のhandle_upload_prefilter関数でも条件を実行してみたが無駄でした。
4
ahnkee

入力名など、フォームデータを識別できるものが必要です。それらの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;
}

いくつかの調査の後、私が見ることができる唯一のものは...

  1. 投稿IDはPOSTデータを介してコールバックに渡されます。しかし、私はこれがあなたのカスタムプラグインページに設定されることを知りません。
  2. $_SERVER['HTTP_REFERER']は正しく設定されているようです。それを解析して、あなたのプラグインページが元のページかどうかを判断することができます。

私がフルプラグインソースを持っていたら私はいくつかのテストをすることができます。

3
s_ha_dum