Aqui está um exemplo de como ignorar essa limitação usando ações / ganchos:
function new_attachment( $att_id ){// the post this was sideloaded into is the attachments parent!// fetch the attachment post
$att = get_post( $att_id );// grab it's parent
$post_id = $att->post_parent;// set the featured post
set_post_thumbnail( $post_id, $att_id );}// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble
remove_action('add_attachment','new_attachment');
A idéia é que, quando media_sideload_imageexecutado, ele:
baixa a imagem
adiciona-o como um anexo (uma postagem do tipo attachment)
depois anexa esse anexo à postagem cujo ID você forneceu ($ post_id)
Seu problema é que ele não fornece o ID de postagens de anexo recém-criado.
Porém , quando um anexo é criado, uma ação é acionada contendo seu ID. Podemos nos conectar a isso antes de criar o anexo e salvar a miniatura em destaque com o ID da postagem que ele nos forneceu e depois soltá-la depois.
Se isso responder à sua pergunta, você pode marcá-la como correta?
Tom J Nowell
não consigo ler o seu inglês. alguém pode editar esta publicação?
HiDd3N
2
@ HiDd3N Simplifiquei um pouco do inglês usado, ele deveria ter palavras mais comuns com uma idade de leitura mais baixa
Tom J Nowell
6
Eu criei uma função para obter o ID do banco de dados, pesquisando por URL.
function get_attachment_id_from_src ($image_src){global $wpdb;
$query ="SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
$id = $wpdb->get_var($query);return $id;}
A resposta de @Tom J Nowell é imediata. Encontrei outra alternativa (usando funções diferentes) explicada aqui, mas gosto mais desta.
No meu caso, tenho uma matriz de $ posts com todas as postagens que desejo inserir e uma $ media separada (as mesmas chaves $ nid que $ posts) com a mídia. Meu código é a mesma solução que a de Tom, mas refatorada para usar uma função anônima:
No meu caso, suponho que o primeiro item em cada $ media [$ nid] seja a imagem em destaque de sua postagem.
O WordPress definitivamente mudará media_sideload_image () para retornar o $ id. De fato, a função tem em mãos, veja a fonte aqui . Na verdade, há um ticket para isso e eles ainda têm patches para aplicar isso ao seu núcleo nesse meio tempo, se você quiser.
Eu criei uma função para obter o ID do banco de dados, pesquisando por URL.
Você pode obter o URL (insted do código html) com um quarto parâmetro definido como
'src'
Codex: media_sideload_image ()fonte
Não há mais necessidade de soluções mais antigas.
Você pode obter o ID com um quarto parâmetro ($ return) definido como 'id'
https://codex.wordpress.org/Function_Reference/media_sideload_image
fonte
A resposta de @Tom J Nowell é imediata. Encontrei outra alternativa (usando funções diferentes) explicada aqui, mas gosto mais desta.
No meu caso, tenho uma matriz de $ posts com todas as postagens que desejo inserir e uma $ media separada (as mesmas chaves $ nid que $ posts) com a mídia. Meu código é a mesma solução que a de Tom, mas refatorada para usar uma função anônima:
No meu caso, suponho que o primeiro item em cada $ media [$ nid] seja a imagem em destaque de sua postagem.
O WordPress definitivamente mudará media_sideload_image () para retornar o $ id. De fato, a função tem em mãos, veja a fonte aqui . Na verdade, há um ticket para isso e eles ainda têm patches para aplicar isso ao seu núcleo nesse meio tempo, se você quiser.
fonte
Eu estava procurando uma solução e decidi olhar o código para o
media_sideload_image()
qual era muito simples. Usa omedia_handle_sideload()
que nos dá o apegoid
.Modifiquei-o para retornar o anexo em
id
vez da fonte html da imagem e até adicionei uma maneira de enviar um novo nome de arquivo.fonte