답변:
다음은 동작 / 후크를 사용하여이 제한을 무시하는 방법의 예입니다.
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');
아이디어는 media_sideload_image
실행되면 다음과 같습니다.
attachment
).문제는 새로 생성 된 첨부 파일 게시물 ID를 제공하지 않는다는 것입니다.
그러나 첨부 파일을 만들면 해당 ID가 포함 된 작업이 시작됩니다. 첨부 파일을 만들기 전에 여기에 연결하고 추천 미리보기 이미지를 제공 한 게시물 ID와 함께 저장 한 다음 나중에 연결을 해제 할 수 있습니다.
URL로 검색하여 DB에서 ID를 얻는 함수를 만들었습니다.
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;
}
네 번째 매개 변수를 Codex로 설정하여 URL (html 코드로 표시)을 얻을 수 있습니다 'src'
. media_sideload_image ()
$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
더 이상 이전 솔루션이 필요하지 않습니다.
네 번째 paramenter ($ return)를 'id'로 설정하여 ID를 얻을 수 있습니다.
<?php media_sideload_image($file, $post_id, $desc, $return); ?>
https://codex.wordpress.org/Function_Reference/media_sideload_image
@Tom J Nowell의 답변이 정점에 있습니다. 나는 여기에 설명 된 다른 대안 (다른 기능을 사용하는)을 발견 했지만 이것을 더 좋아합니다.
필자의 경우 삽입하려는 모든 게시물이 포함 된 $ posts 배열과 미디어와 별도의 $ media ($ posts와 동일한 $ nid 키)가 있습니다. 내 코드는 Tom과 동일한 솔루션이지만 익명 함수를 사용하기 위해 리팩터링되었습니다.
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' );
}
필자의 경우 각 $ media [$ nid]에서 첫 번째 항목이 해당 게시물의 특집 이미지라고 가정합니다.
WordPress shouold는 media_sideload_image ()를 확실히 변경하여 $ id를 반환합니다. 실제로이 기능을 사용하려면 여기를 참조 하십시오 . 사실 이것에 대한 트랙 티켓이 있으며 원하는 경우 평균 시간에 코어에 적용 할 패치가 있습니다.
나는 해결책을 찾고 media_sideload_image()
있었고 매우 간단한 코드를보기로 결정했습니다 . 그것은 사용하는 media_handle_sideload()
우리에게 첨부 파일을 제공한다 id
.
id
이미지의 html 소스 대신 첨부 파일을 반환하도록 수정했으며 새로운 파일 이름을 보내는 방법을 추가했습니다.
function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
if ( ! empty($file) ) {
// Download file to temp location
$tmp = download_url( $file );
// fix file filename for query strings
if( empty($file_name) ) {
preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
$file_array['name'] = basename($matches[0]);
} else {
$file_array['name'] = sanitize_file_name($file_name);
}
$file_array['tmp_name'] = $tmp;
// If error storing temporarily, unlink
if ( is_wp_error( $tmp ) ) {
@unlink($file_array['tmp_name']);
$file_array['tmp_name'] = '';
}
// do the validation and storage stuff
$id = media_handle_sideload( $file_array, $post_id, $desc );
// If error storing permanently, unlink
if ( is_wp_error($id) ) {
@unlink($file_array['tmp_name']);
}
return $id;
}
return null;
}