web-dev-qa-db-fra.com

Changer le répertoire de téléchargement sur la page de plugin personnalisée

J'essaie de changer le chemin d'accès à mon répertoire de téléchargement lorsque je suis sur cette page spécifique de mon plugin personnalisé. La page est une page php standard et pas un type spécifique de page de type post.

J'ai trouvé de nombreux articles expliquant le processus, et je peux voir comment cela fonctionnerait s'il s'agissait d'un type d'article personnalisé, mais vu que ce n'est pas le cas, les exemples ne fonctionnent pas comme prévu.

L'URL de ma page personnalisée est la suivante: http://localhost/custom-plugin/wp-admin/admin.php?page=custom-plugin-page&id=1.

la variable $ _POST est dynamique en fonction de l'élément que l'utilisateur est en train de modifier.

J'ai rencontré les éléments suivants et les ai adaptés à mes besoins:

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;
}

Mais comme vous pouvez le constater, la fonction vérifie si le type de publication est de type "télécharger".

D'après ce que je peux dire, la variable $ _POST n'est pas vide lors du chargement initial de la page, mais lorsque le média modal est ouvert, il est vide. Puisqu'il est renvoyé vide dans le modal média, le chemin du répertoire de téléchargement n'est pas correctement défini. Si je supprime la !empty( $_POST[ page'] );, le chemin est correctement ajusté, mais il est ensuite ajusté sur l'ensemble du site, et pas seulement sur ma page personnalisée.

Vous ne savez pas pourquoi les exemples sur le net utilisent tous une variable $ _POST ou $ _REQUEST, mais lorsque je vais l'utiliser, elle est vide et ma fonction ne se déclenche jamais. Des idées?

4
EHerman

Après avoir travaillé un peu dessus et vérifié la valeur de la variable GLOBALS, il semble que l'URL de renvoi à l'intérieur du modal média est la même URL que ma page de plugin personnalisée.

En utilisant cela et en le séparant un peu, j'ai pu confirmer que je suis sur la page appropriée. Je suis sûr qu’il existe d’autres solutions plus élégantes, mais c’est ce que j’ai pu proposer. J'ai testé et il semble fonctionner correctement.

Voici ma solution finale:

    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;
    }

Si quelqu'un a de meilleures solutions pour vérifier, je suis tout ouïe!

Evan

4
EHerman

Merci EHerman pour votre solution. Ma version simplifiée de votre script utiliserait directement HTTP_REFERER dans le filtre d'envoi:

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
}

Et pour utiliser le filtre correctement

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