好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

  阅读:56次