WordPress 指定の URL の画像をメディアライブラリへ追加

指定の URL の画像をダウンロードして、メディアライブラリへ追加する方法を紹介します。

これは、アイキャッチ画像を自動登録する機能を作成していて必要となり作成しました。

作成前は、ファイルをダウンロードして、ファイルタイプを解析して、メディアライブラリへ追加して、メタデータを生成などなど結構面倒かなと思っていたのですが、たったふたつの関数をコールするだけで簡単に実装できました。

ステップとしては、以下の 2 ステップとなります。

  1. 指定の URL の画像をダウンロード
    WordPress の download_url 関数を使って、URL の画像をダウンロードします。
  2. メディア ライブラリへ追加
    WordPress の media_handle_sideload 関数を使って、ダウンロードした画像をメディア ライブラリへ追加します。

まとめたのが下記の関数です。

insert_attachment_from_url 関数

/**
 * 指定の URL の画像をダウンロードして、メディア ライブラリへ登録します。
 *
 * @param string $url
 * @param int $post_id 投稿 ID。
 * @param int $timeout タイムアウト。デフォルトは 30 秒。
 * @return int|WP_Error 添付ファイル ID。失敗した場合の WP_Error オブジェクト。
 */
function insert_attachment_from_url( $url, $post_id = 0, $timeout = 30 ) {
	if ( !function_exists( 'media_handle_upload' ) ) {
		require_once( ABSPATH . 'wp-admin/includes/image.php' );
		require_once( ABSPATH . 'wp-admin/includes/file.php' );
		require_once( ABSPATH . 'wp-admin/includes/media.php' );
	}

	$tmp_file = download_url( $url, $timeout );
	if ( is_wp_error( $tmp_file ) ) {
		return $tmp_file;
	}

	$file = array(
		'name' => basename( $url ),
		'tmp_name' => $tmp_file,
	);
	$attachment_id = media_handle_sideload( $file, $post_id );
	if ( is_wp_error( $attachment_id ) ) {
		@unlink( $tmp_file );
	}

	return $attachment_id;
}

使い方は、画像の URL(オプションで投稿 ID、タイムアウト時間(秒))を指定して、insert_attachment_from_url 関数を呼び出すだけです。詳細はコードのコメント ドキュメントを参照してください。

追記

自作のプラグイン「XO Featured Image tools」に、この関数(ちょっとカスタマイズしたもの)を使用して、投稿内の外部画像でアイキャッチ画像を自動生成する機能を追加しました。こちらも是非ご利用ください。

コメントを残す

メールアドレスが公開されることはありません。

日本語でコメントを入力してください。