Agregar imagen destacada a una publicación insertada programáticamente en WordPress
Quiero insertar una publicación programáticamente, así que aquí está el código para agregar una:
global $user_ID;
$new_post = array(
'post_title' => 'Mi Nueva Publicación',
'post_content' => 'Lorem ipsum dolor sit amet...',
'post_status' => 'publish',
'post_date' => date('Y-m-d H:i:s'),
'post_author' => $user_ID,
'post_type' => 'post',
'post_category' => array(0)
);
$post_id = wp_insert_post($new_post);
¿Cómo agregar una imagen destacada a la publicación y activarla para pruebas?

La miniatura de la entrada se guarda simplemente como metadato de la entrada con la clave: _thumbnail_id
. Entonces, después de insertar la entrada y obtener el ID de la misma, puedes establecer el metadato para esa entrada. El $thumbnail_id
es simplemente el ID de la imagen que deseas establecer como miniatura, depende de ti ya que no puedo deducir de tu pregunta cuál debería ser este valor.
global $user_ID;
$new_post = array(
'post_title' => 'Mi Nueva Entrada',
'post_content' => 'Lorem ipsum dolor sit amet...',
'post_status' => 'publish',
'post_date' => date('Y-m-d H:i:s'),
'post_author' => $user_ID,
'post_type' => 'post',
'post_category' => array(0)
);
$post_id = wp_insert_post($new_post);
if( ! is_wp_error( $post_id ) )
update_post_meta( $post_id, '_thumbnail_id', $thumbnail_id );

¿Cómo puedo probar este código? Si lo convierto en una función, ¿dónde debería llamarlo?

No lo sé. Mi intención era solo hacerte saber que podrías actualizar los metadatos de la publicación después de como sea que estés insertando el post.

¡La función de imagen destacada encontrará automáticamente cualquier metadato que contenga una imagen!

Eso no es lo que preguntaste. Preguntaste cómo establecer programáticamente una imagen destacada al insertar una publicación. Lo haces configurando la clave meta _thumbnail_id
para esa publicación. Si no era eso lo que querías decir, por favor revisa tu pregunta para mayor claridad.

Entonces, ¿para qué sirve la función update_post_meta, si la función de imagen destacada no puede recuperar la imagen de allí!

¿Eh? La clave meta _thumbnail_id
es exactamente lo que usa la función the_post_thumbnail()
para recuperar el ID de la imagen destacada. Puedes verificarlo en wp-includes/post-thumbnail-template.php

utiliza la función set_post_thumbnail
,
//$file es la ruta al archivo subido (por ejemplo como se establece en el array $_FILE del archivo enviado)
//$filename es el nombre del archivo
//primero necesitamos subir el archivo a la carpeta de uploads de WordPress
$upload_file = wp_upload_bits($filename, null, @file_get_contents($file));
if(!$upload_file['error']) {
//si es exitoso, inserta el nuevo archivo en la biblioteca de medios (crea un nuevo tipo de post attachment)
$wp_filetype = wp_check_filetype($filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_parent' => $post_id,
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit'
);
//wp_insert_attachment( $attachment, $filename, $parent_post_id );
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], $post_id );
if (!is_wp_error($attachment_id)) {
//si el post de attachment se creó correctamente, lo inserta como thumbnail al post $post_id
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
//wp_generate_attachment_metadata( $attachment_id, $file ); para imágenes
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
wp_update_attachment_metadata( $attachment_id, $attachment_data );
set_post_thumbnail( $post_id, $attachment_id );
}
}

$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ),
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $filename, $post_id );
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
Para más información consulta este enlace https://developer.wordpress.org/reference/functions/wp_insert_attachment/
