201502/25 Memo
WordPressでURLから作成したスクショをメディアライブラリに登録&サムネイル生成する方法
先日「WordPressでURLからスクリーンショットを撮って記事に貼り、自分のサーバーにも保存する方法」という記事を書きました。
その中で「メディアライブラリに登録するにはプラグインを使わないといけない」と書いていましたが、プラグインを使わないでメディアライブラリに登録する方法が分かりました。ついでにサムネイルなどの生成もできます!
URLからスクリーンショットを作成&メディアライブラリに保存&サムネイルを生成する
//URLを入力しスクリーンショットを撮る function screenshotCapt($atts, $content = null) { $siteDir = 'http://●●●●.com/wp-content/uploads/'; $homeDir = '/home/サーバー上の絶対パス/wp-content/uploads/'; global $post; define('DS', '/'); // 画像保存ディレクトリ define('SCREENSHOT_DIR', $homeDir); extract(shortcode_atts(array( "base"=>'http://capture.heartrails.com/', "url" => '', "width" => '400', "height" => '400' ), $atts) ); if( empty( $url )) return null; /* 処理 */ $image_flag = false; $dir = SCREENSHOT_DIR; $date = $post->post_date; $idNum = $post->ID; $year = date('Y', strtotime($date) ); $month = date('m', strtotime($date) ); $vowels = array("http:", "https:", "/", "."); $file = str_replace($vowels, "", $url); $filename = $siteDir.$year.DS.$month.DS.$idNum.'_'.$file.'.jpg'; if( !file_exists($dir.$year) ) { mkdir($dir.$year); } if( !file_exists($dir.$year.DS.$month) ) { mkdir($dir.$year.DS.$month); } if( file_exists($dir.$year.DS.$month.DS.$idNum.'_'.$file.'.jpg') ) { $image_flag = true; }else{ $geturl = $base.$width.'x'.$height.'?'.$url; $image = file_get_contents($geturl); $fpc = file_put_contents($dir.$year.DS.$month.DS.$idNum.'_'.$file.'.jpg', $image); if($fpc){ insertMediaLib($idNum, $dir.$year.DS.$month.DS.$idNum.'_'.$file.'.jpg'); } } return '<p><a href="'.$url.'" target="_blank"><img src="'.$filename.'" alt="'.$url.'" class="ssimg aligncenter"/></a></p>'; } add_shortcode("Screenshot", "screenshotCapt"); //スクリーンショットをメディアライブラリに登録 include( ABSPATH . 'wp-admin/includes/image.php' ); function insertMediaLib($postID, $fName){ $wp_filetype = wp_check_filetype(basename($fName), null ); $wp_upload_dir = wp_upload_dir(); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename($fName), 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($fName)), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $fName, $postID ); $attach_data = wp_generate_attachment_metadata( $attach_id, $fName ); wp_update_attachment_metadata( $attach_id, $attach_data ); }
これで、[Screenshot url=""]
とするだけで、URLのスクリーンショットがメディアライブラリに保存され、且つ、メディア設定で指定したサイズの画像が生成されます。
メディアライブラリ登録の解説
メディアライブラリの登録はwp_insert_attachment( $attachment, $filename, $parent_post_id )
を使います。
mime_typeや画像のタイトルなどを含む配列($attachment)、ファイル名($filename)、画像を使用する記事のID($parent_post_id)を指定します。
今回は記事内でショートコードが指定された際に動くので、記述している記事のIDを指定していますが、使用する記事のIDが不明の場合(新規登録の場合など)は$parent_post_id = "0"
でOKだそうです。
参考:wp_insert_attachment() で新規 insert | DEVLAB
サムネイルなどのリサイズ画像生成
wordpressでは画像をアップロードすると、アップロードしたファイルとは別に、サムネイルサイズや中サイズなどのリサイズ画像も生成されます。
リサイズ画像の生成はwp_generate_attachment_metadata( $attachment_id, $file )
を使用します。生成されるサイズはメディア設定で指定したサイズになります。
$attachment_idは、アップロードした画像に付与されるIDです。こちらはwp_insert_attachment()
の返り値で取得できます。
$fileはサーバー上の絶対パスから始まる画像のファイル名です。
また、wp_generate_attachment_metadata()
の返り値はデータを更新するwp_update_attachment_metadata( $attachment_id, $attachment_metadata )
で必要な$attachment_metadata(アップロードした画像の詳細データ)を返します。
参考:Function Reference/wp generate attachment metadata « WordPress Codex
そんなわけで
WordPressでURLからスクリーンショットを撮り、メディアライブラリに登録し、サムネイルなどのリサイズ画像を作る、ということができるようになりました!使用用途としてはかなり限定されますが、参考になれば幸いです。
実はひっそりちょっとしたサイトギャラリーを作ってまして。それで色々しらべておりました。ギャラリーはコンテンツが充実してきたらまたブログでご紹介しますね。