web-dev-qa-db-fra.com

Modification du répertoire de téléchargement pour le téléchargement de plug-in uniquement

J'ai passé beaucoup de temps à lire les autres discussions sur cette question, mais je ne parviens tout simplement pas à faire fonctionner mon code correctement.

Je construis un plugin, et j'ai configuré un formulaire de téléchargement sur ma page d'administration personnalisée et j'utilise Media Uploader pour traiter le téléchargement. Veuillez voir ci-dessous pour le code simplifié:

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

Le code ci-dessus fonctionne et modifie le répertoire de téléchargement pour le chemin que je spécifie. Cependant, il change le répertoire de téléchargement pour TOUS les téléchargements. J'aimerais que mon code ne s'exécute que lors du téléchargement à partir de ma page d'administration personnalisée.

C'est ce que j'ai essayé jusqu'à présent (et n'a pas fonctionné pour moi):

  1. J'ai essayé d'utiliser des conditionnelles pour tester $pagenow et get_current_screen dans ma fonction custom_upload_dir, mais cela semble échouer à chaque fois et utilise les chemins de téléchargement par défaut.
  2. J'ai essayé de tester le conditionnel dans mon __construct mais une erreur m'a été renvoyée (je suppose que c'est trop tôt dans le cycle de vie WP).
  3. Essayé d'exécuter le conditionnel dans ma fonction handle_upload_prefilter également en vain.
4
ahnkee

Vos données de formulaire doivent comporter un élément identifiable, tel que les noms que vous avez saisis. Vérifiez-en un ou plusieurs et procédez en conséquence.

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

Après une enquête, les seules choses que je vois qui pourraient aider sont ...

  1. L'ID de publication est transmis au rappel par le biais des données POST. Cependant, je ne sais pas si cela serait réglé dans votre page de plugin personnalisée.
  2. $_SERVER['HTTP_REFERER'] semble être configuré correctement. Vous pouvez analyser cela pour déterminer si votre page de plug-in est la page d'origine.

Si j'avais la source complète du plugin, je pourrais faire des tests.

3
s_ha_dum