WordPress统计当前日志中所有的附件错误怎么解决
今天发现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 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统计当前日志中所有的附件错误怎么解决的详细内容...