@ Tom J Nowell ответ на месте. Я нашел другую альтернативу (с использованием различных функций), объясненную здесь, но мне она нравится больше.
В моем случае у меня есть массив $ posts со всеми публикациями, которые я хочу вставить, и отдельный $ media (те же ключи $ nid, что и $ posts) со СМИ. Мой код такой же, как и у Тома, но с использованием анонимной функции:
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' );
}
В моем случае я предполагаю, что 1-й элемент в каждом $ media [$ nid] должен быть изображением своего поста.
WordPress обязательно должен изменить media_sideload_image (), чтобы он возвращал $ id. Фактически у функции есть это под рукой, см. Источник здесь . На самом деле для этого есть путевой билет, и у них даже есть патчи, чтобы применить его к вашему ядру, если хотите.