web-dev-qa-db-ja.com

カスタムプラグインページのアップロードディレクトリを変更する

私のカスタムプラグインのこの特定のページでアップロードディレクトリへのパスを変更しようとしています。このページは標準のphpページであり、特定の種類の投稿タイプページではありません。

私はプロセスを説明する多数の記事を見つけました、そして、これがカスタム投稿タイプであるならそれがどのように働くかを見ることができます、しかし、それが例として意図したようにはたらいていないように見えます。

私のカスタムページのURLはhttp://localhost/custom-plugin/wp-admin/admin.php?page=custom-plugin-page&id=1です。

$ _POST変数は、ユーザーが編集しているアイテムに基づいて動的です。

私は以下のことに出会い、それを自分のニーズに合わせて調整しました。

function edd_load_upload_filter() {
    global $pagenow;

    if ( ! empty( $_POST['page'] ) && $_POST['page'] == 'custom-plugin-page' && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) {
        add_filter( 'upload_dir', 'edd_set_upload_dir' );
    }
}
add_action('admin_init', 'edd_load_upload_filter');

function edd_set_upload_dir($upload) {
    $upload['subdir']   = '/edd' . $upload['subdir'];
    $upload['path'] = $upload['basedir'] . $upload['subdir'];
    $upload['url'] = $upload['baseurl'] . $upload['subdir'];
    return $upload;
}

しかし、ご覧のとおり、この機能は投稿タイプが 'download'タイプかどうかを確認しています。

私が言うことができることから、$ _POST変数は最初のページロードで空ではありませんが、メディアモーダルが開かれたときは空です。メディアモーダル内では空として返されるため、アップロードディレクトリへのパスは正しく設定されません。 !empty( $_POST[ page'] );チェックを削除すると、パスは正しく調整されますが、カスタムページだけではなくサイト全体で調整されます。

ネット上の例がすべて$ _POSTまたは$ _REQUEST変数を使用している理由はよくわかりませんが、使用すると空になるため、関数は起動しません。何か案は?

4
EHerman

これに少し取り組んで、GLOBALS変数を調べて便利なことをしたところ、メディアモーダル内の参照元URLは、私のカスタムプラグインページと同じURLのように見えます。

それを使って少し分割すると、自分が適切なページにいることを確認できました。私は他にももっと優雅な解決策があると確信しています、しかしこれは私が思い付くことができたものです。私はテストしました、そしてそれはきちんと働いているようです。

これが私の最終的な解決策です。

    add_filter( 'admin_init' , 'check_if_we_should_change_upload_dir', 999 );
    function check_if_we_should_change_upload_dir() {   
            global $pagenow;
            $referrer = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '';
            if( $referrer != '' ) {
                $explode_1 = explode( 'page=' , $referrer );
                if( isset( $explode_1[1] ) ) {
                    $referring_page = explode( '&id=' , $explode_1[1] );
                    if( isset( $referring_page[0] ) && $referring_page[0] == 'custom-plugin-page' && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) {
                        add_filter( 'upload_dir', 'alter_the_upload_dir' );
                    }
                }
            }
       }


  function alter_the_upload_dir( $upload ) {
        $upload['subdir'] = '/custom-directory' . $upload['subdir'];
        $upload['path'] = $upload['basedir'] . $upload['subdir'];
        $upload['url']  = $upload['baseurl'] . $upload['subdir'];
        return $upload;
    }

誰かがチェックするためのより良い解決策を持っているなら、私はすべての耳です!

エヴァン

4
EHerman

あなたの解決をありがとうEHerman。あなたのスクリプトの私の単純化されたバージョンは直接アップロードフィルタでHTTP_REFERERを使うでしょう:

function my_custom_upload_dir($path) {

  if(isset( $_SERVER['HTTP_REFERER'] )) {
    //parse url into array
    $referrer = parse_url($_SERVER['HTTP_REFERER']);
    $queries;
    // take the query part and parse it into array
    parse_str($referrer['query'], $queries);

   // check for anything that was in the query string of the current screen
   // you can use what ever you see in the wp-admin url before the upload frame opens    
    if( isset($queries['taxonomy']) ) {

        $mydir = '/taxonomy-files';

        $path['subdir']  = $mydir;
        $path['path']   = $path['basedir'].$mydir; 
        $path['url']    = $path['baseurl'].$mydir;  
    }
  }

  return $path; //altered or not
}

そしてフィルターを正しく使うため

add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter');
add_filter('wp_handle_upload', 'my_handle_upload');

function my_upload_prefilter( $file ) {
    add_filter('upload_dir', 'my_custom_upload_dir');
    return $file;
}

function my_handle_upload( $fileinfo ) {
    remove_filter('upload_dir', 'my_custom_upload_dir');
    return $fileinfo;
}   
1
user75503