某些項目中,網站允許用戶使用外鏈圖片發布文章,或者處于某些特殊原因,網站希望抓取文中的第一張遠程圖片作為特色圖片,并像QQ空間一樣,將這張圖片保存到本地,并插入到數據庫中。
這個動作我們使用一個hook來實現:
| add_action('publish_post', 'fetch_images',999); |
再創建一個fetch_images函數,來實現本文所說的所有功能。
| function fetch_images( $post_ID ){ if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return; if ( !current_user_can('edit_post', $post_ID) ) return; $post = get_post($post_ID); |
接下來,我們要獲取文章內容中的第一張圖片:
| $first_image = ''; preg_match('/<img.+src=[\'\"]([^\'\"]+)[\'\"].* \/>/i',$post->post_content,$images); if(!empty($images))foreach($images as $image){ if(strpos($image,'http') === 0){ $first_image = $images[1]; break; } } |
但實際上,通過上述的代碼獲得的圖片src可能也是有問題的,或者根本沒有抓取到數據。不過我們先不考慮這些問題,我們先實現本文的目標。
接下來就是關鍵代碼一,它要實現“抓取-保存到本地”兩個功能:
| $get = wp_remote_get( $get_image_src ); $type = wp_remote_retrieve_header( $get, 'content-type' ); $file_name = basename($get_image_src); $file_content = wp_remote_retrieve_body($get); $mirror = wp_upload_bits($file_name,null,$file_content); |
這個地方有一個變化,上面我們獲得了$first_image,這個地方的$get_image_src是上述得到的要抓取的遠程圖片地址。
在WordPress中,提供了wp_remote_get、wp_remote_retrieve_body等原創抓取和信息獲取函數,你可以查看官方文檔以了解和remote相關的函數。wp_upload_bits則將抓取到的圖片的二進制內容保存到本地,根據其文件類型,最終成為本地保存的圖片,并將保存完后獲得的本地圖片信息保存在$mirror中。
既然已經保存到本地了,接下來就是將圖片信息保存到數據庫中。





