it-swarm.com.de

Benutzerdefinierten Upload-Pfad nur für benutzerdefinierten Beitragstyp festlegen?

Ich habe einen benutzerdefinierten Beitragstyp "Clients" und möchte, dass alle über den Administrator hochgeladenen Bilder/Dateien für diese Beiträge in ein bestimmtes Verzeichnis auf meinem Server verschoben werden, aber alles andere wie gewohnt bleibt. Ist das mit wp_upload_dir möglich?

3
Xav

Sie können upload_dir einen Filter hinzufügen. Hier ist eine einfache Klasse, die ich für ein Projekt geschrieben habe. Verwenden Sie die Variable protected $filter_path, um das alternative Upload-Verzeichnis zu definieren (* ist relativ zu 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;
    }
}

Verwendungszweck:

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

Die Funktion prefix_upload_dir_filter muss an eine Aktion oder einen Filter mit dem verfügbaren $ post-Objekt oder der $ post-ID angehängt werden. Sie müssen weitere Nachforschungen anstellen, um diesen Teil herauszufinden, oder vielleicht kann sich jemand anders anschließen. Meine Verwendung war eine vollständige Lösung zum Hochladen benutzerdefinierter Bilder vom Front-End, bei der ich die öffentlich hochgeladenen Bilder in einem temporären Verzeichnis benötigte, das bereinigt werden konnte jeden Abend über einen Cron Job.

4
Chris_O

Das funktioniert ganz gut:

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

So etwas kann den Trick machen, ändern Sie einfach mycpt, wie Sie möchten

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