WordPress 3.6 推出了一個(gè)新的函數(shù):get_attached_media(),使得獲取一個(gè)指定日志的所有附件文件變得異常簡單,。
以前如果我們要獲取指定日志的所有圖片:我們需要通過類似如下的代碼:
$args = array('post_parent' => $post->ID,'post_type' => 'attachment','post_mime_type' => 'image','posts_per_page' => -1,'orderby' => 'menu_order','order' => 'ASC',);$attachments = get_posts( $args );
WordPress 3.6 新增的get_attached_media()函數(shù)使得這個(gè)過程更加簡潔: 獲取所有附件,,不管什么類型:
$attachments = get_attached_media( '', $post->ID );
獲取所有的音頻附件:
$attachments = get_attached_media( 'audio', $post->ID );
獲取所有圖片附件:
$attachments = get_attached_media( 'image', $post->ID );
獲取所有視頻附件:
$attachments = get_attached_media( 'video', $post->ID );
上述wordpress官方的第一段代碼是通過查詢wp_posts表中所有post_parents字段為post_ID,,并且post_type為attachment的數(shù)據(jù),這樣就會(huì)造成兩個(gè)問題
1,、只統(tǒng)計(jì)插入的圖片,,不統(tǒng)計(jì)刪除的圖片
2,、post_parents的字段類型為BIGINT,這樣只能統(tǒng)計(jì)一次,,比如你在日志A插入了圖片I,,之后在日志B中再插入圖片I,這樣就沒辦法同時(shí)統(tǒng)計(jì)了
這樣看來wordpress統(tǒng)計(jì)當(dāng)前日志附件相當(dāng)不準(zhǔn),。 如何修正呢 修正之前思考這么幾個(gè)問題:
1,、用什么來記錄當(dāng)前日志的附件?
2,、在什么地方進(jìn)行統(tǒng)計(jì)
3,、該如何取出
關(guān)于記錄日志的附件,選擇了postmeta這個(gè)表來記錄,,增加一個(gè)meta_key,;至于在什么地方統(tǒng)計(jì),選擇鉤子save_post,,整體代碼如下:
add_action('save_post', 'save_post_my_func', 10 , 2);function save_post_my_func() {global $wpdb;$content = $post->post_content;if (!stristr($content, '/wp-content/uploads/')){// 如果說當(dāng)前日志中沒有任何附件鏈接,,我將這個(gè)字段更新為空update_post_meta($post_id, '_wp_post_attach_total_', '');return ;}$data = array();if (preg_match_all('/(href|src)=[^>]+\/wp\-content\/uploads\/(sites\/\d+\/)?([^"\'>\s]+)["\'>\s]/is', $content, $match)){// 統(tǒng)計(jì)所有帶有附件鏈接的img還有l(wèi)ink$files = array_flip(array_flip($match[3]));$sql = sprintf("SELECT `post_id` FROM `%s` WHERE `meta_key`='_wp_attached_file' AND (`meta_value`='%s');",$wpdb->postmeta, implode("' OR `meta_value`='", $files));(FALSE != ($row = $wpdb->get_col($sql))) && $data = $row;}// 統(tǒng)計(jì)日志中的相冊(cè)if (preg_match_all('/\?)([^"\'\]]*)\1\s*\]/is', $content, $gallery)){$where = array();$gallery = explode(',', implode(',', $gallery[2]));foreach ($gallery as $val){$where[] = '`post_id`='.trim($val);}$sql = sprintf("SELECT `post_id` FROM `%s` WHERE `meta_key`='_wp_attached_file' AND (%s);", $wpdb->postmeta, implode(' OR ', $where));(FALSE != ($row = $wpdb->get_col($sql))) && $data = array_merge($data, $gallery);}// 統(tǒng)計(jì)當(dāng)前日志中的縮略圖if (FALSE != ($thumb_id = get_post_meta($post_id, '_thumbnail_id'))){$data[] = $thumb_id[0];}// 為了后續(xù)擴(kuò)展,以及向其他應(yīng)用開放擴(kuò)展,,這里我創(chuàng)建了一個(gè)過濾鉤子$data = apply_filters('wp_post_attach_total', $data, $post_id);if (!empty($data)){$data = array_flip(array_flip($data));update_post_meta($post_id, '_wp_post_attach_total_', implode(',', $data));}}
大家可以通過下面的代碼獲取當(dāng)前日志附件
get_post_meta($post_id, '_wp_post_attach_total_');
注:最后代碼參考自亂燉,。