web-dev-qa-db-fra.com

(résolu) Télécharger des images depuis une page personnalisée à l'aide de Blueimp Uploader?

Je travaille avec un formulaire de téléchargement frontend qui utilise blueimp jQuery-File-Uploader pour faire le gros du travail ... mais, après avoir tenté d'ajouter la fonctionnalité WordPress nécessaire à blueimp, j'ai commencé à courir avec des erreurs que je suis incapable de comprendre. en dehors.

Mise à jour/Mon code

HTML (le formulaire frontal):

<form id="fileupload" action="" method="POST" enctype="multipart/form-data">

    <span class="btn btn-success fileinput-button">
        <span>Add files...</span>
        <!-- The file input field used as target for the file upload widget -->
        <input type="file" name="files[]" multiple />
    </span>

    <div id="progress" class="progress">
        <div class="progress-bar progress-bar-success"></div>
    </div>
</form>

JS (j'utilise le même js que celui utilisé dans le fichier de démonstration Basic Plus) Il suffit de remplacer la variable url par l'emplacement du fichier UploadHandler.php.

PHP (parties relatives de mon script de téléchargement ... J'utilise le script par défaut UploadHandler et j'essaie de le personnaliser pour WordPress)

// Required WordPress files and hooks
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-load.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/media.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/file.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/image.php" );

$upload_dir = wp_upload_dir();

global $current_user;
get_currentuserinfo();
$logged_in_user = $current_user->ID;

// Some default blueimp code

// First few lines of the __construct function
global $upload_dir;
$this->options = array(
    'script_url' => $this->get_full_url(),
    'upload_dir' => $upload_dir['path'] . '/',
    'upload_url' => $upload_dir['url'] . '/',

// A lot more default script code

// The handle_file_upload function with WordPress customizations
protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
    $index = null, $content_range = null) {
    global $logged_in_user;
    $file = new stdClass();
    $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
    $index, $content_range);
    $file->size = $this->fix_integer_overflow(intval($size));
    $file->type = $type;
    if ($this->validate($uploaded_file, $file, $error, $index)) {
        $this->handle_form_data($file, $index);
        $upload_dir = $this->get_upload_path();
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, $this->options['mkdir_mode'], true);
        }
        $file_path = $this->get_upload_path($file->name);
        $append_file = $content_range && is_file($file_path) &&
            $file->size > $this->get_file_size($file_path);

        if ($uploaded_file && is_uploaded_file($uploaded_file)) {
            // multipart/formdata uploads (POST method uploads)
            if ($append_file) {
                file_put_contents(
                    $file_path,
                    fopen($uploaded_file, 'r'),
                    FILE_APPEND
                );
            } else {
                move_uploaded_file($uploaded_file, $file_path);
            }
        } else {
            // Non-multipart uploads (PUT method support)
            file_put_contents(
                $file_path,
                fopen('php://input', 'r'),
                $append_file ? FILE_APPEND : 0
            );
        }
        $file_size = $this->get_file_size($file_path, $append_file);
        if ($file_size === $file->size) {
            $file->url = $this->get_download_url($file->name);
            if ($this->is_valid_image_file($file_path)) {
                $this->handle_image_file($file_path, $file);
            }
        } else {
            $file->size = $file_size;
            if (!$content_range && $this->options['discard_aborted_uploads']) {
                unlink($file_path);
                $file->error = $this->get_error_message('abort');
            }
        }
        $this->set_additional_file_properties($file);
    }

    $attachment = array(
        'post_mime_type'    => $file->type,
        'post_title'        => preg_replace( '/\.[^.]+$/', '', basename( $file_path )),
        'post_content'      => '',
        'post_author'       => $logged_in_user,
        'post_status'       => 'inherit',
        'post_type'         => 'attachment',
        'guid'              => $this->options['upload_url'] . $name
    );

    $attachment_id = wp_insert_attachment( $attachment, $file_path );

    // Generate the attachment data
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $file_path );

    // Update the attachment metadata
    wp_update_attachment_metadata( $attachment_id, $attachment_data );

    return $file;
}

Numéro mis à jour:

Au début, cela semble fonctionner ... mais, lorsque vous cochez la case wp_posts database table, rien n’a été ajouté. En outre, lorsque vous regardez dans le media library, il affiche uniquement l'image téléchargée (aucune des autres images figurant dans la base de données) et les erreurs suivantes apparaissent dans le error_log:

PHP Warning: strpos() expects parameter 1 to be string, object given in /Applications/MAMP/htdocs/wordpress/wp-includes/post.php on line 188
PHP Warning: preg_match() expects parameter 2 to be string, object given in /Applications/MAMP/htdocs/wordpress/wp-includes/post.php on line 188
PHP Catchable fatal error: Object of class stdClass could not be converted to string in /Applications/MAMP/htdocs/wordpress/wp-includes/post.php on line 189

Je comprends le fait que la variable que j'appelle est un objet, pas une chaîne, mais je ne sais pas quoi mettre à sa place.

Toute aide est appréciée ont essayé tout ce que je peux penser. Il faut vraiment que tout soit opérationnel dès que possible! Merci

2
Designer 17

Après avoir fait des tests et travaillé avec un ami, j'ai pu trouver une solution:

Il suffit de changer la façon dont la fonction get_full_url saisit l’url:

// Go to 'protected function get_full_url()'
// Line 200 (approx. if you've made the same changes stated above) in UploadHandler.php 
// change this line, should be the last one in the function
substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));

// After editing this is what you should end with
substr($_SERVER['DOCUMENT_ROOT'],0, strrpos($_SERVER['DOCUMENT_ROOT'], '/'));

C’est ce qui a fonctionné pour moi (avec le code personnalisé de la question), me permettant d’utiliser le programme de téléchargement de démo dans une page WordPress personnalisée. Création d'un formulaire de téléchargement frontend! J'espère que ça aide quelqu'un.

1
Designer 17