Impostare l'Immagine in Evidenza dal Form Frontend
Ho lottato per giorni per risolvere questo problema. Sono riuscito a implementare con successo un form per inviare post dal frontend del mio sito. Ma non riesco a capire come far funzionare il caricamento delle immagini.
Voglio che qualsiasi immagine caricata dall'utente venga automaticamente allegata al post e diventi la sua immagine in evidenza.
Qualcuno può spiegarmi come farlo con il mio codice esistente?
Ho cercato tra tutte le domande pertinenti su questo forum e nessuna delle soluzioni funziona per me.
<?
if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['insert_post'] )) { //verifica che il nostro form sia stato inviato
//Se lo è stato, reindirizza alla dashboard
?><script language="javascript"><!--
location.replace("/dashboard/")
//-->
</script> <?php
$title = $_POST['thread_title']; //imposta il nostro titolo
if ($_POST['thread_description']=="") { // controlla se è stata inserita una descrizione
$description = "Vedi il titolo del thread..."; // se no, usa il segnaposto
} else {
$description = $_POST['thread_description']; //se sì, usala
}
$tags = $_POST['thread_tags']; //carica i tag del thread (tassonomia personalizzata) in un array
$post = array( //i nostri argomenti wp_insert_post
'post_title' => wp_strip_all_tags($title),
'post_content' => $description,
'post_category' => array('0' => $_POST['cat']),
'tax_input' => array('thread_tag' => $tags),
'post_status' => 'publish',
'post_type' => 'tsv_userpost'
);
$my_post_id = wp_insert_post($post); //invia il nostro post, salva l'ID risultante
$current_user = wp_get_current_user(); //controlla chi ha effettuato l'accesso
add_post_meta($my_post_id, '_your_custom_meta', $var); //aggiungi metadati personalizzati, dopo l'inserimento del post
} else {
if(is_user_logged_in()) { // controlla che l'utente sia loggato prima di presentare il form
$current_user = wp_get_current_user();
?>
<div id="postbox">
<form id="new_thread" name="new_thread" method="post" action="" enctype="multipart/form-data">
<input class="required" type="text" id="thread_title" value="" tabindex="1" name="thread_title" placeholder="Titolo Thread" />
<textarea id="thread_description" name="thread_description" cols="80" rows="20" tabindex="2"></textarea>
<div class="left">
<select name='cat' id='cat' class='postform required' tabindex="3">
<option value="" selected="selected">Scegli:</option>
<option class="writing" value="90">Scrittura</option>
<option class="image" value="91">Immagine</option>
<option class="video" value="92">Video</option>
<option class="audio" value="94">Audio</option>
<option class="link" value="95">Link</option>
</select>
</div>
<input type="text" value="" tabindex="4" size="16" name="thread_tags" id="thread_tags" placeholder="Tag" />
<br />
<!-- immagini -->
<label for="images">Immagine in Evidenza:</label>
<input type="file" name="user-image-featured" id="user-image-featured" size="20">
<!-- Pulsante Invia-->
<br />
<input type="submit" value="Salva Post" tabindex="5" id="thread_submit" name="thread_submit" class="thread-button" />
<input type="hidden" name="insert_post" value="post" />
<?php wp_nonce_field( 'new_thread' ); ?>
</form>
</div>
<?php } else { echo 'per favore effettua il login'; } } ?>

puoi farlo eseguendo la funzione
set_post_thumbnail( $my_post_id, $thumbnail_id );
ricorda, devi prima elaborare e inserire l'immagine nella libreria:
$uploaddir = wp_upload_dir();
$file = $_FILES[ ... qualunque dato tu abbia nel tuo POST ... ];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $file , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
non ho testato lo script - è adattato da una versione che ho creato. potresti voler modificare il nome del file e cose simili, ma nel complesso funziona così :)

Grazie! Ho provato con funzioni simili a quella senza successo. Sto inserendo il codice nel posto sbagliato? Dove dovrebbero andare quei due snippet di codice nel codice sopra?

questo non ha molta importanza. puoi creare il post prima dell'allegato o viceversa, l'unica cosa importante è avere entrambi creati quando chiami set_post_thumbnail( $my_post_id, $thumbnail_id );

Funziona correttamente!
$uploaddir = wp_upload_dir();
$file = $_FILES["post_Fimage"]["name"];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $_FILES["post_Fimage"]["tmp_name"] , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
//echo "<pre>";print_r($wp_filetype);echo "</pre>";
//echo "<pre>";print_r($_FILES);echo "</pre>";
set_post_thumbnail( $post_id, $attach_id );

/******* Questo funziona per me! ********/
$uploaddir = wp_upload_dir();
$file = $_FILES["post_Fimage"]["name"];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $_FILES["post_Fimage"]["tmp_name"] , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
set_post_thumbnail( $post_id, $attach_id );

Posso sistemare il tuo codice?
$uploaddir = wp_upload_dir();
$file = $_FILES[ ... qualunque cosa tu abbia nei tuoi dati POST ... ];
$uploadfile = $uploaddir['path'] . '/' . basename( $file['name'] );
move_uploaded_file( $file['tmp_name'] , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );

Aggiungi una spiegazione alla tua risposta: perché questa soluzione potrebbe risolvere il problema?

Ho lo stesso problema. L'immagine in evidenza non viene importata correttamente nel post che viene inviato tramite front-end. Posso vedere l'immagine nella libreria media, quindi so che funziona fino a quel punto.
Questa funzione funziona fino a '//function works till here'. Qualcuno può aiutarmi?
function save_post ( $form ){
$errors = array();
$form_setting = $form->get_settings();
$form_fields = $form->get_fields();
$form_fields_files = $form->get_uploaded_files();
$form_id = $form_fields['formId'];
if ($form_id === 'fxuqcf') {
$post_title = isset($form_fields['post-titel']) ? $form_fields['post-titel'] : '';
$post_content = isset($form_fields['post-bericht']) ? $form_fields['post-bericht'] : '';
$post_category_name = isset($form_fields['post-categorie']) ? $form_fields['post-categorie'] : '';}
//recupera il nome della categoria
$post_category_id = get_category_by_slug($post_category_name)->term_id;
if (!$post_category_id) {
$errors[] = 'nome della categoria non valido';
return $errors;}
//crea l'array del post
$new_post = array(
'post_type' => 'post',
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'publish',
'post_category' => array($post_category_id),);
//inserisce il post
$post_id = wp_insert_post($new_post);
//verifica se il post è stato creato correttamente
if ($post_id && is_wp_error($post_id)){
//la funzione funziona fino a qui
if (!empty($form_fields_files['post-afbeelding'])){
$uploaded_files = $form_fields_files['post-afbeelding'];
$file = $uploaded_files[0];
$file_array = array(
'name' => basename($file['file']),
'tmp-name' => $file['file']);
if (file_exist($file['file'])){
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_id = media_handle_sideload($file_array, $post_id);
if (is_wp_error($attachment_id)){
$errors[] = 'Si è verificato un errore con l\'immagine:' . $attachment_id->get_error_message();
}else {
$attachment_id = wp_insert_attachment();
set_post_thumbnail($post_id, $attachment_id);
}
}else {
$errors[] = 'Il file caricato non esiste.' ;
}
}
}
}
