Establecer Imagen Destacada en Formulario Frontend

13 nov 2012, 11:31:25
Vistas: 21.1K
Votos: 7

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'; } } ?>
0
Todas las respuestas a la pregunta 6
3

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 :)

13 nov 2012 12:14:00
Comentarios

¡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?

Eckstein Eckstein
13 nov 2012 19:44:53

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 );

fischi fischi
14 nov 2012 12:32:17

por cierto, ¿tu imagen se envía correctamente? Prueba con print_r( $_FILES ) para ver si tienes la configuración correcta y la imagen disponible.

fischi fischi
14 nov 2012 12:33:04
0

¡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 ); 
23 feb 2018 09:29:48
1

/******* ¡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 ); 
23 feb 2018 09:20:49
Comentarios

Por favor, añade más detalles a tu respuesta.

Christine Cooper Christine Cooper
23 feb 2018 13:07:34
2

¿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 );
10 sept 2014 00:13:32
Comentarios

Por favor agrega una explicación a tu respuesta: por qué eso podría resolver el problema?

fuxia fuxia
10 sept 2014 01:58:55

lo siento, los $_FILES tienen algunos campos como ["name"] y ["tmp_name"] que deben usarse, de lo contrario no funcionará la carga de archivos

biancardi biancardi
10 sept 2014 08:58:04
0

Es posible que desees intentar marcar primero la casilla de recapcha si estás utilizando recapcha. El recapcha evitará cualquier envío POST o GET.

17 mar 2020 10:56:22
0

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.' ;
                }
            }
        }
    }   
5 dic 2024 12:09:23