回答:
アクション/フックを使用してこの制限を回避する方法の例を次に示します。
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;
}
4番目のパラメーターをCodexに設定して、URL(htmlコードを含む)を取得できます'src'
:media_sideload_image()
$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
古いソリューションはもう必要ありません。
4番目のパラメーター($ return)を 'id'に設定すると、IDを取得できます
<?php media_sideload_image($file, $post_id, $desc, $return); ?>
https://codex.wordpress.org/Function_Reference/media_sideload_image
@トム・J・ノーウェルの答えはその場にあります。ここで説明されている別の代替(異なる機能を使用)を見つけましたが、これがもう1つ気に入っています。
私の場合、挿入するすべての投稿を含む$ postsの配列と、メディアを含む個別の$ media($ postsと同じ$ nidキー)があります。私のコードはトムのソリューションと同じですが、無名関数を使用するようにリファクタリングされています。
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] shuoldの最初のアイテムがその投稿の注目画像であると想定しています。
WordPressは確実に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;
}