La respuesta de @Tom J Nowell es acertada. Encontré otra alternativa (usando diferentes funciones) explicada aquí, pero me gusta más esta.
En mi caso, tengo una serie de $ posts con todas las publicaciones que quiero insertar y un $ media separado (las mismas claves $ nid que $ posts) con los medios. Mi código es la misma solución que Tom, pero se refactorizó para usar una función anónima:
foreach( $posts as $nid=>$post )
$posts[$nid]['ID'] = wp_insert_post( $post );
foreach( $posts as $nid=>$post )
foreach( $media[$nid] as $m=>$mitem ) {
if( 0 == $m ) add_action( 'add_attachment',
function( $att_id ) use ($posts, $nid, $mitem) {
update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
$posts[$nid]['media_urls'][] = $mitem['url'];
}
);
media_sideload_image($mitem['url'], $post['ID']);
remove_all_actions( 'add_attachment' );
}
En mi caso, supongo que el primer elemento de cada $ media [$ nid] debe ser la imagen destacada de su publicación.
WordPress debe cambiar definitivamente media_sideload_image () para que devuelva el $ id. De hecho, la función lo tiene a mano, vea la fuente aquí . De hecho, hay un boleto de pista para esto e incluso tienen parches para aplicar esto a su núcleo mientras tanto si lo desea.