【wordpress统计当前日志中所有的附件错误怎么做】WordPress统计当前日志中所有的附件错误怎么解决

更新时间:2019-05-14    来源:WordPress    手机版     字体:

【www.bbyears.com--WordPress】

在这里稍微分析下:
原理:

无论是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的插件,敬请等待

本文来源:http://www.bbyears.com/wangyezhizuo/51084.html