web-dev-qa-db-fra.com

Définir le chemin de téléchargement personnalisé pour le type de publication personnalisé uniquement?

J'ai un type de publication personnalisé de 'clients' et je souhaite que toutes les images/fichiers téléchargés via l'administrateur pour ces publications soient placés dans un répertoire spécifique de mon serveur, mais que tout le reste reste normal. Est-ce possible d'utiliser peut-être wp_upload_dir?

3
Xav

Vous pouvez ajouter un filtre à upload_dir. Voici un cours simple que j'ai écrit pour le faire pour un projet. Utilisez la variable protected $filter_path pour définir le répertoire de téléchargement alternatif (* sera relatif à wp-content/uploads)

class UGC_Attachment {
    protected $upload_dir;
    protected $upload_url;
    protected $filter_path = '/relative_path_from_wp-content/uploads';

    function __construct() {
        $dir = wp_upload_dir();
        $this->upload_dir = $dir['basedir'] . $this->filter_path;
        $this->upload_url = $dir['baseurl'] . $this->filter_path;
    }

    function upload_dir_filter( $upload ) {
        $target_path = $this->upload_dir;
        $target_url  = $this->upload_url;
        wp_mkdir_p( $target_path );
        $upload['path'] = $target_path;
        $upload['url']  = $target_url;

       return $upload;
    }
}

Usage:

function prefix_upload_dir_filter( $post ) {
    if ( 'clients' != get_post_type( $post )
        return;
    $filter = new UGC_Attachment();
    return add_filter( 'upload_dir', array( &$filter, 'upload_dir_filter' );
}

La fonction prefix_upload_dir_filter doit être attachée à une action ou à un filtre avec l'objet $ post disponible ou l'ID $ post. Vous devrez faire quelques recherches supplémentaires pour comprendre cette partie ou peut-être que quelqu'un d'autre pourrait vous en parler. Mon utilisation était une solution complète de téléchargement d'images personnalisée du système où j'avais besoin des images publiquement téléchargées placées dans un répertoire temporaire pouvant être nettoyées. sortir tous les soirs via un travail cron.

4
Chris_O

Cela fonctionne plutôt bien:

add_filter( 'upload_dir', 'custom_prefix_upload_dir'  );

        function custom_prefix_upload_dir( $pathdata ) {
            global $current_user,$pagenow;
            if ( ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) && false !== strpos( wp_get_referer(),'post_type=clients' ) ) {
                $custom_dir = '/my_custom_uploads';
                if ( empty( $pathdata[ 'subdir' ] ) ) {
                    $pathdata[ 'path' ] = $pathdata[ 'path' ] . $custom_dir;
                    $pathdata[ 'url' ] = $pathdata[ 'url' ] . $custom_dir;
                    $pathdata[ 'subdir' ] = '/kanzu_intug';
                } else {
                    $new_subdir = $custom_dir . $pathdata[ 'subdir' ];

                    $pathdata[ 'path' ] = str_replace( $pathdata[ 'subdir' ], $new_subdir, $pathdata[ 'path' ] );
                    $pathdata[ 'url' ] = str_replace( $pathdata[ 'subdir' ], $new_subdir, $pathdata[ 'url' ] );
                    $pathdata[ 'subdir' ] = str_replace( $pathdata[ 'subdir' ], $new_subdir, $pathdata[ 'subdir' ] );
                }
            }

            return $pathdata;
        }
0
kakoma

Quelque chose comme ça peut faire l'affaire, changez simplement mycpt comme vous le souhaitez

add_filter('upload_dir', 'mycpt_uploaddir');

function mycpt_uploaddir( $param ){
    global $typenow;

    if ('mycpt' != $typenow)
        return $param;

    $mycpt = '/mycpt';

    $param['path'] = $param['path'] . $mycpt;
    $param['url'] = $param['url'] . $mycpt;
    return $param;
}
0
gonzalezea