Inviare post e caricare immagini dal front-end
Sto cercando di fare qualcosa di simile alla domanda sopra. Sto provando a far pubblicare post e caricare immagini agli utenti dal front-end. Ho già creato il form per i post e funziona.
Ho seguito e provato la risposta pubblicata da Robin I Knight upload-post-thumbnail-from-the-front-end. Purtroppo non sono riuscito a farlo funzionare. C'è qualcosa che dovrei modificare o cambiare?
Grazie.

Se stai parlando della risposta che ho pubblicato qui si tratta semplicemente di caricare un file in un iframe per ottenere un submit "simile ad Ajax".
Ora, se hai già un form che gestisce l'invio del post, puoi semplicemente aggiungere il campo per il caricamento del file da qualche parte nel tuo form:
<form ...
...
<input type="file" name="thumbnail" id="thumbnail">
...
...
</form>
Assicurati che il tuo form abbia l'attributo enctype="multipart/form-data"
.
Poi, nello script di elaborazione del form, dopo aver creato il post (supponendo che tu stia usando wp_insert_post();
)
mantieni l'ID del post in una nuova variabile:
$new_post = wp_insert_post($post_array);
e dopo aggiungi:
if (!function_exists('wp_generate_attachment_metadata')){
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
if ($_FILES) {
foreach ($_FILES as $file => $array) {
if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
return "errore nel caricamento : " . $_FILES[$file]['error'];
}
$attach_id = media_handle_upload( $file, $new_post );
}
}
if ($attach_id > 0){
//e se vuoi impostare quell'immagine come thumbnail del Post allora usa:
update_post_meta($new_post,'_thumbnail_id',$attach_id);
}
e la tua immagine verrà caricata e salvata come thumbnail del post.

Grazie @Bainternet. Stavo avendo difficoltà a far inserire la miniatura, ma per qualche motivo quando ho sostituito '$new_post' con '$pid' inserisce la miniatura del post

lool sono così stupido. Ho appena capito perché dovevo usare '$pid'
avevo questa riga $pid = wp_insert_post($new_post);

Contento che tu abbia risolto, e ancora meglio che tu abbia capito il punto.

Sì, grazie mille per il tuo aiuto. Ora che ho capito, è il momento di aggiungere un po' di ajax :)

@Bainternet♦ grazie per la tua risposta, è utile, ma come farlo funzionare con più immagini. Ho cambiato il mio input in <input type="file" id="image" name="image[]" multiple="multiple" > ma non carica nulla. -qualche aiuto per favore?

Markup HTML:
<p>
<label for="custom-upload">Carica Nuova Immagine:</label>
<input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
</p>
<?php
/*Recupero dell'immagine*/
$attachment = get_post_meta($postid, 'custom_image');
if($attachment[0]!='')
{
echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
}
?>
Caricamento dell'immagine:
<?php
global $post; /*Oggetto post globale*/
$post_id = $post->ID; /*Recupero l'ID del post corrente*/
$upload = $_FILES['upload']; /*Riceve l'immagine caricata dal form*/
add_custom_image($post_id, $upload); /*Chiama la funzione per il caricamento dell'immagine*/
function add_custom_image($post_id, $upload)
{
$uploads = wp_upload_dir(); /*Recupera il percorso della directory di upload di WordPress*/
if (is_writable($uploads['path'])) /*Verifica se la directory di upload è scrivibile*/
{
if ((!empty($upload['tmp_name']))) /*Verifica se l'immagine caricata non è vuota*/
{
if ($upload['tmp_name']) /*Verifica se l'immagine è stata caricata nella directory temporanea*/
{
$file=handle_image_upload($upload); /*Chiama la nostra funzione personalizzata per EFFETTIVAMENTE caricare l'immagine*/
$attachment = array /*Crea un allegato per il nostro post*/
(
'post_mime_type' => $file['type'], /*Tipo di allegato*/
'post_parent' => $post_id, /*ID del post*/
);
$aid = wp_insert_attachment($attachment, $file['file'], $post_id); /*Inserisce l'allegato al post e restituisce l'ID dell'allegato*/
$a = wp_generate_attachment_metadata($aid, $file['file'] ); /*Genera i metadati per il nuovo allegato*/
$prev_img = get_post_meta($post_id, 'custom_image'); /*Recupera l'immagine precedentemente caricata*/
if(is_array($prev_img))
{
if($prev_img[0] != '') /*Se l'immagine esiste*/
{
wp_delete_attachment($prev_img[0]); /*Elimina l'immagine precedente*/
}
}
update_post_meta($post_id, 'custom_image', $aid); /*Salva l'ID dell'allegato nei metadati*/
if ( !is_wp_error($aid) )
{
wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) ); /*Se non ci sono errori, aggiorna i metadati della nuova immagine caricata*/
}
}
}
else
{
echo 'Per favore carica un\'immagine.';
}
}
}
function handle_image_upload($upload)
{
global $post;
if (file_is_displayable_image( $upload['tmp_name'] )) /*Verifica se è un'immagine*/
{
/*gestisce il file caricato*/
$overrides = array('test_form' => false);
$file=wp_handle_upload($upload, $overrides);
}
return $file;
}
?>
