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」に、この関数(ちょっとカスタマイズしたもの)を使用して、投稿内の外部画像でアイキャッチ画像を自動生成する機能を追加しました。こちらも是非ご利用ください。

コメント

  • nekomoriya より:

    XO Featured Image Tools プラグインを利用させていただいています♪某プラグインが機能せず、こちらにたどり着きました。素敵なプラグインありがとうございます♪しかし、投稿保存時に自動でアイキャッチを生成することができておりません。設定は初期のまま、触っておりません。なぜかわからず困っております。いかがなものでしょうか?
    使用サイトはhttp://rose.hughughag.net/です。

    • 石鷹 より:

      こんにちは、ご利用ありがとうございます。
      このプラグインのメインの機能なのでぜひ改善したいところですが、皆目検討がつきません(汗
      同じテーマで検証してみましたが、投稿の保存時に自動でアイキャッチを生成できました。
      念の為、設定画面(管理画面のメニューより[設定]-[XO Featured Image])の [自動生成]-[投稿] がチェックされていることを確認してみてください。

      • nekomoriya より:

        ありがとうございます!間違いなくチェックされています、、、
        何故なんでしょう?
        とても、嬉しいプラグインで、見つけた時は、飛び上がって喜びました。是非、何とかしたいのですが…

        • 石鷹 より:

          他のプラグインが影響しているかもしれません。使用しているプラグインを表記してもらえませんか?
          お手数おかけします。

          • nekomoriya より:

            ありがとうございます♪お手数おかけします。
            Adminimize、Akismet Anti-Spam、Delete-Revision、Disable Revisions and Autosave、Easy FancyBox、EWWW Image Optimizer、EZ zenback、FeedBurner FeedSmith、Force Regenerate Thumbnails、Google Analytics Dashboard for WP、Post Snippets、Resize At Upload Plus、SiteGuard WP Plugin、Slider by Nivo – Responsive Image Slider、TSL iframe unfilter、WordPress Popular Posts、WP to Twitter、WP-SpamFree、Yet Another Related Posts Plugin、アドバンスド自動更新。以上です。よろしくお願いいたします。

          • 石鷹 より:

            多いですね (^^♪
            下記のプラグインを除くすべてのプラグインをインストール(設定はデフォルト)して検証してみました。

            • Disable Revisions and Autosave ・・・ 配布サイトが閉鎖(?)のため
            • FeedBurner FeedSmith ・・・ 閉鎖(2018年5月19日)のため
            • Resize At Upload Plus ・・・ インストールに失敗

            結果は症状を再現することができませんでした。上記プラグインが影響しているのかもしれませんので、お手数ですが上記プラグインを一時停止して試してみてもらえないでしょうか?
            また、かなり古いプラグインもあるので、それらの使用停止も考慮してみてください。

          • nekomoriya より:

            遅くなりました。ご指摘のプラグインを停止してみます。また。ご連絡しますね。ありがとうございます♪

          • nekomoriya より:

            できました!古いプラグイン使うのも、プラグインが多すぎるのも駄目ですね、、、プラグインをなるべく使わないでできるように勉強します♪今後ともよろしくお願いいたします。

          • 石鷹 より:

            よかったです。気になっていたので・・・。
            また何かありましたら気軽にコメントしてくださいね。
            ではでは

  • nekomoriya より:

    ごめんなさい。また、使えなくなりました、、、なぜでしょうねー

コメントを残す

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

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