Establecer Imagen Destacada en Formulario Frontend
He estado luchando durante días para resolver esto. He implementado exitosamente un formulario para enviar posts desde el frontend de mi sitio. Pero no logro hacer funcionar la carga de imágenes.
Quiero que cualquier imagen que el usuario suba se adjunte automáticamente a la entrada y se convierta en su imagen destacada.
¿Puede alguien explicarme cómo hacer esto con mi código existente?
He buscado en todas las preguntas relevantes de este foro y ninguna de las soluciones funciona para mí.
<?php
if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['insert_post'] )) { //verifica que nuestro formulario fue enviado
//Si lo fue, redirige al dashboard
?><script language="javascript"><!--
location.replace("/dashboard/")
//-->
</script> <?php
$title = $_POST['thread_title']; //establece nuestro título
if ($_POST['thread_description']=="") { // verifica si se ingresó una descripción
$description = "Ver título del hilo..."; // si no, usa un placeholder
} else {
$description = $_POST['thread_description']; //si existe, úsala
}
$tags = $_POST['thread_tags']; //carga las etiquetas del hilo (taxonomía personalizada) en un array
$post = array( //nuestros argumentos para 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); //envía nuestro post, guarda el ID resultante
$current_user = wp_get_current_user(); //verifica quién está conectado
add_post_meta($my_post_id, '_your_custom_meta', $var); //agrega metadatos personalizados, después de insertar el post
} else {
if(is_user_logged_in()) { // verifica que el usuario esté conectado antes de presentar el formulario
$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="Título del Hilo" />
<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">Elegir:</option>
<option class="writing" value="90">Escritura</option>
<option class="image" value="91">Imagen</option>
<option class="video" value="92">Video</option>
<option class="audio" value="94">Audio</option>
<option class="link" value="95">Enlace</option>
</select>
</div>
<input type="text" value="" tabindex="4" size="16" name="thread_tags" id="thread_tags" placeholder="Etiquetas" />
<br />
<!-- imágenes -->
<label for="images">Imagen Destacada:</label>
<input type="file" name="user-image-featured" id="user-image-featured" size="20">
<!-- Botón de envío-->
<br />
<input type="submit" value="Guardar Entrada" 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 'por favor inicia sesión'; } } ?>

puedes hacerlo ejecutando la función
set_post_thumbnail( $my_post_id, $thumbnail_id );
recuerda, primero debes procesar e insertar la imagen en la biblioteca:
$uploaddir = wp_upload_dir();
$file = $_FILES[ ... lo que tengas en tus datos 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 );
no probé el script - está adaptado de una versión que creé. quizás quieras cambiar el nombre del archivo y cosas así, pero en general funciona de esta manera :)

¡Gracias! He probado con funciones similares a esa sin éxito. ¿Estoy colocando el código en el lugar equivocado? ¿Dónde deberían ir esos dos fragmentos de código en el código anterior?

esto realmente no importa. Puedes crear la publicación antes que el adjunto o viceversa, lo único importante es tener ambos creados cuando llames a set_post_thumbnail( $my_post_id, $thumbnail_id );

¡Esto está funcionando correctamente!
$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 );

/******* ¡Esto funciona para mí! ********/
$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 );

¿Puedo corregir tu código?
// Obtener el directorio de subida de WordPress
$uploaddir = wp_upload_dir();
// Obtener el archivo del array $_FILES (lo que sea que tengas en tus datos POST)
$file = $_FILES[ ... lo que tengas en tus datos POST ... ];
// Crear la ruta completa del archivo a subir
$uploadfile = $uploaddir['path'] . '/' . basename( $file['name'] );
// Mover el archivo temporal a la ubicación definitiva
move_uploaded_file( $file['tmp_name'] , $uploadfile );
// Obtener solo el nombre del archivo
$filename = basename( $uploadfile );
// Verificar el tipo de archivo
$wp_filetype = wp_check_filetype(basename($filename), null );
// Crear un array con los datos del adjunto para WordPress
$attachment = array(
'post_mime_type' => $wp_filetype['type'], // Tipo MIME del archivo
'post_title' => preg_replace('/\.[^.]+$/', '', $filename), // Título sin extensión
'post_content' => '', // Contenido vacío
'post_status' => 'inherit', // Estado del adjunto
'menu_order' => $_i + 1000 // Orden en el menú
);
// Insertar el adjunto en la base de datos de WordPress
$attach_id = wp_insert_attachment( $attachment, $uploadfile );

Tengo el mismo problema. La imagen destacada no se importa correctamente en la publicación que se envía desde el front-end. Puedo ver la imagen en la biblioteca de medios, así que sé que funciona hasta ese punto.
Esta función funciona hasta '//function works till here'. ¿Alguien puede ayudarme?
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'] : '';}
//obtener nombre de categoría
$post_category_id = get_category_by_slug($post_category_name)->term_id;
if (!$post_category_id) {
$errors[] = 'nombre de categoría inválido';
return $errors;}
//crear el 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),);
//insertar post
$post_id = wp_insert_post($new_post);
//verificar si el post se creó correctamente
if ($post_id && is_wp_error($post_id)){
//la función funciona hasta aquí
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[] = 'Hay un error con la imagen:' . $attachment_id->get_error_message();
}else {
$attachment_id = wp_insert_attachment();
set_post_thumbnail($post_id, $attachment_id);
}
}else {
$errors[] = 'El archivo subido no existe.' ;
}
}
}
}
