今天發(fā)現(xiàn)wordpress博客自帶的統(tǒng)計(jì)當(dāng)前日志中所有的附件有問題,并不能正確的統(tǒng)計(jì)出來,后來經(jīng)過反復(fù)調(diào)整最后是可以了,下面我把具體的方法與各位分享.
在這里稍微分析下原理:無論是wordpress什么版本,原理都是一樣的,都是通過這段核心代碼進(jìn)行查詢.
- $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以后呢,為大家封裝了一個(gè)方法get_attached_media,至此以后查詢就變得類似像下面一樣簡單了.
- // 獲取所有類型附件
- $attachments = get_attached_media( '', $post->ID );
- // 獲取所有的音頻附件:
- $attachments = get_attached_media( 'audio', $post->ID );
這樣就OK了嗎?大家可以做一個(gè)這樣的測試:先在一篇日志中插入5張圖,保存,然后從這幾張圖中,隨便刪除2張,修改,保存(這個(gè)時(shí)候日志中只有3張圖了),最后用這個(gè)函數(shù)再來看,輸出還是5個(gè)post數(shù)據(jù).
為什么會(huì)這樣?
這段代碼是通過查詢wp_posts表中所有post_parents字段為post_ID,并且post_type為attachment的數(shù)據(jù),這樣就會(huì)造成兩個(gè)問題.
只統(tǒng)計(jì)插入的圖片,不統(tǒng)計(jì)刪除的圖片,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è)問題?用什么來記錄當(dāng)前日志的附件?在什么地方進(jìn)行統(tǒng)計(jì),該如何取出,關(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ì)日志中的相冊
- if (preg_match_all('/?)([^"']]*)1s*]/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 (!emptyempty($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_');
為什么要做這樣的研究,初衷原本是要統(tǒng)計(jì)wordpress有多少附件是上傳后卻用不到的,卻發(fā)現(xiàn)wordpress提供的功能卻有問題。
新聞熱點(diǎn)
疑難解答
圖片精選