WordPress統計當前日誌中所有的附件錯誤怎麼解決

來源:互聯網
上載者:User

在這裡稍微分析下:
原理:

無論是wordpress什麼版本,原理都是一樣的,都是通過這段核心代碼進行查詢

 代碼如下 複製代碼

$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,至此以後查詢就變得類似像下面一樣簡單了

// 擷取所有類型附件
$attachments = get_attached_media( '', $post->ID );

// 擷取所有的音頻附件:
$attachments = get_attached_media( 'audio', $post->ID );

這樣就OK了嗎?

大家可以做一個這樣的測試:

    先在一篇日誌中插入5張圖,儲存;
    然後從這幾張圖中,隨便刪除2張,修改,儲存(這個時候日誌中只有3張圖了)
    最後用這個函數再來看,輸出還是5個post資料

為什麼會這樣?

這段代碼是通過查詢wp_posts表中所有post_parents欄位為post_ID,並且post_type為attachment的資料,這樣就會造成兩個問題

    只統計插入的圖片,不統計刪除的圖片
    post_parents的欄位類型為BIGINT,這樣只能統計一次,比如你在日誌A插入了圖片I,之後在日誌B中再插入圖片I,這樣就沒辦法同時統計了

這樣看來wordpress統計當前日誌附件相當不準。
我是如何修正的

我思考了這麼幾個問題?

    用什麼來記錄當前日誌的附件?
    在什麼地方進行統計
    該如何取出

關於記錄日誌的附件,我選擇了postmeta這個表來記錄,增加一個meta_key;至於在什麼地方統計,我選擇了鉤子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/'))
    {
        // 如果說當前日誌中沒有任何附件連結,我將這個欄位更新為空白
        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))
    {
        // 統計所有帶有附件連結的img還有link
        $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;
    }

    // 統計日誌中的相簿
    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);
    }

    // 統計當前日誌中的縮圖
    if (FALSE != ($thumb_id = get_post_meta($post_id, '_thumbnail_id')))
    {
        $data[] = $thumb_id[0];
    }

    // 為了後續擴充,以及向其他應用開放擴充,這裡我建立了一個過濾鉤子
    $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));
    }
}

大家可以通過下面的代碼擷取當前日誌附件

 代碼如下 複製代碼

get_post_meta($post_id, '_wp_post_attach_total_');

為什麼要做這樣的研究
初衷

原本是要統計wordpress有多少附件是上傳後卻用不到的,卻發現wordpress提供的功能卻有問題
後續

今後有時間,我會做一個清理wordpress的外掛程式,敬請等待

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.