Come caricare un'immagine dal front-end e salvarla nella libreria media?

31 mag 2016, 11:11:26
Visualizzazioni: 22.3K
Voti: 2

Sto lavorando su un plugin. Voglio caricare un'immagine dal front-end tramite input type="file". Ho fatto molte ricerche su Google ma non sono riuscito a caricare l'immagine. Ecco il mio codice per il caricamento dell'immagine:

<form method="post" action="options.php">
  <input type="file" name="my_image_upload" id="my_image_upload" multiple="false" />
  <input type="hidden" name="post_id" id="post_id" value="55" />
  <?php wp_nonce_field( 'my_image_upload', 'my_image_upload_nonce' ); ?>
  <input id="submit_my_image_upload" name="submit_my_image_upload" type="submit" value="Upload" />
</form>

<?php

if ( 
    isset( $_POST['my_image_upload_nonce'], $_POST['post_id'] ) 
    && wp_verify_nonce( $_POST['my_image_upload_nonce'], 'my_image_upload' )
    && current_user_can( 'edit_post', $_POST['post_id'] )
) {
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );
    $attachment_id = media_handle_upload( 'my_image_upload', $_POST['post_id'] );

    if ( is_wp_error( $attachment_id ) ) {
        // Si è verificato un errore durante il caricamento dell'immagine.
    } else {
        // L'immagine è stata caricata con successo!
    }

} else {
    // Il controllo di sicurezza è fallito, mostra un errore all'utente.
}

function wp_verify_nonce_X($nonce, $action = -1) {
        return true;
        $user = wp_get_current_user();
        $uid = (int) $user->id;
        $i = wp_nonce_tick();
        if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
            return 1;
        if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce )
            return 2;
        // Nonce non valido
        return false;
    }

// Dopo l'implementazione di questo codice ottengo questo errore
Fatal error: Call to undefined function wp_verify_nonce() in /home/projectdemos/public_html/WP-Team-Showcase/wp-content/plugins/wp-team-showcase/team.php on line 435

Ho cercato su Google questo errore e ho provato tutte le possibili soluzioni trovate ma non sono riuscito a risolverlo. Ditemi come caricare l'immagine e salvarla, se c'è un'altra soluzione oltre a questo codice.

0
Tutte le risposte alla domanda 2
1

Ora ho una risposta alla mia domanda. Ho risolto questo problema utilizzando questo codice. Lo aggiungo solo per condividerlo e aiutare altri, dato che ha funzionato per me.

<input type="file" name="my_file_upload" id="my_file_upload_id" class="bg_checkbox"  >

function register_team_show_case_setting() {
//registriamo le nostre impostazioni
    register_setting('my_team_show_case_setting', 'my_file_upload');
}
add_action('admin_init', 'register_team_show_case_setting');

Codice per caricare e salvare l'immagine:

require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attach_id = media_handle_upload('my_file_upload', $post_id);
if (is_numeric($attach_id)) {
    update_option('option_image', $attach_id);
    update_post_meta($post_id, '_my_file_upload', $attach_id);
}

Codice per visualizzare l'immagine

echo wp_get_attachment_url(get_option('option_image'));
6 giu 2016 11:14:34
Commenti

Ciao. Come posso caricare più immagini con il tuo esempio?

wpdev wpdev
12 apr 2018 17:32:56
9

Stai chiamando una funzione di WordPress prima che WordPress sia completamente caricato. Un modo rapido ma poco elegante per risolvere questo problema è aggiungere

require_once(ABSPATH .'wp-includes/pluggable.php');

all'inizio del tuo file di plugin in modo che abbia le funzioni necessarie.

Un modo migliore e corretto per risolvere questo problema è attendere che WordPress abbia terminato il caricamento utilizzando uno degli hook disponibili

add_action( 'init', 'wpse_228301' );

oppure

add_action( 'wp_loaded', 'wpse_228301' );
31 mag 2016 15:11:02
Commenti

dopo aver utilizzato require_once(ABSPATH .'wp-includes/pluggable.php'); in cima l'errore è stato rimosso ma nessuna immagine viene caricata nella libreria multimediale

raxa raxa
31 mag 2016 18:41:14

Ti esorto a sviluppare il plugin come dovrebbe essere, quindi utilizza gli hook di azione init o wp_loaded per inizializzare il plugin. In questo modo tutte le funzioni di WordPress saranno disponibili per te. Il modo in cui lo stai gestendo ora con il caricamento dei file funziona nella maggior parte dei casi, ma non è assolutamente il modo corretto di procedere. Inoltre, il mio obiettivo era eliminare il tuo messaggio di errore, non ho controllato tutto il tuo codice, quindi se l'errore che avevi è scomparso, qualche altra parte del tuo codice non funziona correttamente.

Jebble Jebble
1 giu 2016 10:35:32

Ho caricato un'immagine utilizzando questo codice <input type="file" name="my_file_upload" id="my_file_upload"><?php require_once( ABSPATH . 'wp-admin/includes/image.php' ); require_once( ABSPATH . 'wp-admin/includes/file.php' ); require_once( ABSPATH . 'wp-admin/includes/media.php' ); $attach_id = media_handle_upload( 'my_file_upload', $post_id ); if ( is_numeric( $attach_id ) ) { update_post_meta( $post_id, '_my_file_upload', $attach_id ); } ?> nel mio file team.php. Ora voglio visualizzarla nel file post-type.php. Puoi dirmi come visualizzarla?

raxa raxa
1 giu 2016 11:41:41

Dovresti creare un nuovo post per questo per evitare di ingombrare, dato che questo problema è risolto, ma lo salvi come post meta "_my_file_upload" così puoi recuperarlo sul front-end recuperando quel post meta:

$attachment = get_post_meta( get_the_ID(), '_my_file_upload' );

Jebble Jebble
1 giu 2016 12:26:32

$attachment = get_post_meta( get_the_ID(), '_my_file_upload' ); mi restituisce un array vuoto

raxa raxa
1 giu 2016 12:59:55

Questo non funzionerà nei commenti. Per favore, apri un nuovo argomento per questo :)

Jebble Jebble
1 giu 2016 13:09:46

Ho incollato il mio codice qui, per favore controllalo http://pastebin.com/mXNC2UMJ

raxa raxa
1 giu 2016 13:40:14

Ancora una volta, per favore crea un nuovo argomento con informazioni sufficienti in modo che io e altre persone possiamo avere un post adeguato su cui lavorare.

Jebble Jebble
1 giu 2016 14:03:10

Continuiamo questa discussione nella chat.

raxa raxa
2 giu 2016 10:45:04
Mostra i restanti 4 commenti