当前位置:首页 > CMS教程 > WordPress > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2014-06-21 14:41:37 浏览: 评论:0 

今天发现wordpress博客自带的统计当前日志中所有的附件有问题,并不能正确的统计出来,后来经过反复调整最后是可以了,下面我把具体的方法与各位分享.

在这里稍微分析下原理:无论是wordpress什么版本,原理都是一样的,都是通过这段核心代码进行查询.

  1. $args = array
  2.     'post_parent' => $post->ID, 
  3.     'post_type' => 'attachment'
  4.     'post_mime_type' => 'image'
  5.     'posts_per_page' => -1, 
  6.     'orderby' => 'menu_order'
  7.     'order' => 'ASC'
  8. ); 
  9. $attachments = get_posts( $args ); 

不过呢,wordpress在3.6以后呢,为大家封装了一个方法get_attached_media,至此以后查询就变得类似像下面一样简单了.

  1. // 获取所有类型附件 
  2. $attachments = get_attached_media( ''$post->ID ); 
  3. // 获取所有的音频附件: 
  4. $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,整体代码如下:

  1. add_action('save_post''save_post_my_func', 10 , 2); 
  2.  
  3. function save_post_my_func() { 
  4.     global $wpdb
  5.  
  6.     $content = $post->post_content; 
  7.     if (!stristr($content'/wp-content/uploads/')) 
  8.     { 
  9.         // 如果说当前日志中没有任何附件链接,我将这个字段更新为空 
  10.         update_post_meta($post_id'_wp_post_attach_total_'''); 
  11.         return ; 
  12.     } 
  13.  
  14.     $data = array(); 
  15.     if (preg_match_all('/(href|src)=[^>]+/wp-content/uploads/(sites/d+/)?([^"'>s]+)["'>s]/is'$content$match)) 
  16.     { 
  17.         // 统计所有带有附件链接的img还有link 
  18.         $files = array_flip(array_flip($match[3])); 
  19.         $sql = sprintf("SELECT `post_id` FROM `%s` WHERE `meta_key`='_wp_attached_file' AND (`meta_value`='%s');"
  20.                         $wpdb->postmeta, implode("' OR `meta_value`='"$files)); 
  21.  
  22.         (FALSE != ($row = $wpdb->get_col($sql))) && $data = $row
  23.     } 
  24.  
  25.     // 统计日志中的相册 
  26.     if (preg_match_all('/?)([^"']]*)1s*]/is', $content$gallery)) 
  27.     { 
  28.         $where = array(); 
  29.         $gallery = explode(',', implode(','$gallery[2])); 
  30.         foreach ($gallery as $val
  31.         { 
  32.             $where[] = '`post_id`='.trim($val); 
  33.         } 
  34.  
  35.         $sql = sprintf("SELECT `post_id` FROM `%s` WHERE `meta_key`='_wp_attached_file' AND (%s);"$wpdb->postmeta, implode(' OR '$where)); 
  36.         (FALSE != ($row = $wpdb->get_col($sql))) && $data = array_merge($data$gallery); 
  37.     } 
  38.  
  39.     // 统计当前日志中的缩略图 
  40.     if (FALSE != ($thumb_id = get_post_meta($post_id'_thumbnail_id'))) 
  41.     { 
  42.         $data[] = $thumb_id[0]; 
  43.     } 
  44.  
  45.     // 为了后续扩展,以及向其他应用开放扩展,这里我创建了一个过滤钩子 
  46.     $data = apply_filters('wp_post_attach_total'$data$post_id); 
  47.     if (!emptyempty($data)) 
  48.     { 
  49.         $data = array_flip(array_flip($data)); 
  50.         update_post_meta($post_id'_wp_post_attach_total_', implode(','$data)); 
  51.     } 

大家可以通过下面的代码获取当前日志附件,代码如下

get_post_meta($post_id, '_wp_post_attach_total_');

为什么要做这样的研究,初衷原本是要统计wordpress有多少附件是上传后却用不到的,却发现wordpress提供的功能却有问题。

Tags: 附件 错误 日志

分享到: