Enviar publicación y subir imagen desde el front-end
Estoy tratando de hacer algo similar a la pregunta anterior. Intento permitir que los usuarios publiquen y suban imágenes desde el front-end. Ya he creado el formulario de publicación y está funcionando.
Seguí e intenté implementar la respuesta publicada por Robin I Knight subir-miniatura-de-publicacion-desde-el-front-end. Desafortunadamente no pude hacer que funcionara. ¿Hay algo que deba cambiar o editar?
Gracias.

Si estás hablando de la respuesta que publiqué aquí, simplemente se trata de subir un archivo en un iframe para lograr un envío "similar a Ajax".
Ahora bien, si ya tienes un formulario que maneja el envío de publicaciones, puedes simplemente agregar el campo de carga de archivos en algún lugar de tu formulario:
<form ...
...
<input type="file" name="thumbnail" id="thumbnail">
...
...
</form>
Asegúrate de que tu formulario tenga el atributo enctype="multipart/form-data"
.
Luego, en tu script de procesamiento del formulario, después de crear la publicación (asumiendo que estás usando wp_insert_post();
), guarda el ID de la publicación en una nueva variable:
$new_post = wp_insert_post($post_array);
Y después de eso agrega:
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 "error en la carga: " . $_FILES[$file]['error'];
}
$attach_id = media_handle_upload( $file, $new_post );
}
}
if ($attach_id > 0){
// y si quieres establecer esa imagen como imagen destacada de la publicación, usa:
update_post_meta($new_post,'_thumbnail_id',$attach_id);
}
Y tu imagen será cargada y guardada como la imagen destacada de la publicación.

Gracias @Bainternet. Estaba teniendo problemas para que insertara la miniatura, pero por alguna razón cuando reemplacé '$new_post' con '$pid' se insertó la miniatura del post

jajaja soy tan tonto. Acabo de darme cuenta de por qué tenía que usar '$pid'
tenía esta línea $pid = wp_insert_post($new_post);

Me alegra que lo hayas resuelto, y mejor aún es que entendiste el punto.

Sí, muchas gracias por tu ayuda. Ahora que lo entiendo, es hora de agregar algo de ajax :)

@Bainternet♦ gracias por tu respuesta, es útil, pero ¿cómo hacer que funcione con múltiples imágenes? Cambié mi input a <input type="file" id="image" name="image[]" multiple="multiple" > pero no sube nada. -¿alguna ayuda por favor?

HTML Markup:
<p>
<label for="custom-upload">Subir Nueva Imagen:</label>
<input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
</p>
<?php
/*Recuperando la imagen*/
$attachment = get_post_meta($postid, 'custom_image');
if($attachment[0]!='')
{
echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
}
?>
Subiendo la imagen:
<?php
global $post; /*Objeto global de post*/
$post_id = $post->ID; /*Obteniendo el ID del post actual*/
$upload = $_FILES['upload']; /*Recibiendo la imagen subida desde el formulario*/
add_custom_image($post_id, $upload); /*Llamando a la función de subida de imagen*/
function add_custom_image($post_id, $upload)
{
$uploads = wp_upload_dir(); /*Obteniendo la ruta del directorio de subidas de WordPress*/
if (is_writable($uploads['path'])) /*Verificando si el directorio de subidas tiene permisos de escritura*/
{
if ((!empty($upload['tmp_name']))) /*Verificando si la imagen subida no está vacía*/
{
if ($upload['tmp_name']) /*Verificando si la imagen ha sido subida al directorio temporal*/
{
$file=handle_image_upload($upload); /*Llamando a nuestra función personalizada para SUBIR REALMENTE la imagen*/
$attachment = array /*Creando adjunto para nuestro post*/
(
'post_mime_type' => $file['type'], /*Tipo de adjunto*/
'post_parent' => $post_id, /*ID del post*/
);
$aid = wp_insert_attachment($attachment, $file['file'], $post_id); /*Insertando adjunto al post y retornando el ID del adjunto*/
$a = wp_generate_attachment_metadata($aid, $file['file'] ); /*Generando metadatos para el nuevo adjunto*/
$prev_img = get_post_meta($post_id, 'custom_image'); /*Obteniendo la imagen previamente subida*/
if(is_array($prev_img))
{
if($prev_img[0] != '') /*Si la imagen existe*/
{
wp_delete_attachment($prev_img[0]); /*Eliminar imagen anterior*/
}
}
update_post_meta($post_id, 'custom_image', $aid); /*Guardando el ID del adjunto en los metadatos*/
if ( !is_wp_error($aid) )
{
wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) ); /*Si no hay error, actualizar los metadatos de la imagen recién subida*/
}
}
}
else
{
echo 'Por favor sube la imagen.';
}
}
}
function handle_image_upload($upload)
{
global $post;
if (file_is_displayable_image( $upload['tmp_name'] )) /*Verificando si es una imagen*/
{
/*manejando el archivo subido*/
$overrides = array('test_form' => false);
$file=wp_handle_upload($upload, $overrides);
}
return $file;
}
?>
