欢迎来到资源库(www.zyku.net)

WordPress

当前位置:首页 > CMS教程 > WordPress > 日志

WordPress获取当前日志的所有附件的方法

时间:2017-02-28|栏目:WordPress|点击:|我要投稿

WordPress 3.6 推出了一个新的函数:get_attached_media(),使得获取一个指定日志的所有附件文件变得异常简单。

以前如果我们要获取指定日志的所有图片:我们需要通过类似如下的代码:

$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 );

获取所有图片附件:

$attachments = get_attached_media( 'image', $post->ID );

获取所有视频附件:

$attachments = get_attached_media( 'video', $post->ID );

上述wordpress官方的第一段代码是通过查询wp_posts表中所有post_parents字段为post_ID,并且post_type为attachment的数据,这样就会造成两个问题

1、只统计插入的图片,不统计删除的图片

2、post_parents的字段类型为BIGINT,这样只能统计一次,比如你在日志A插入了图片I,之后在日志B中再插入图片I,这样就没办法同时统计了

这样看来wordpress统计当前日志附件相当不准。 如何修正呢 修正之前思考这么几个问题:

1、用什么来记录当前日志的附件?

2、在什么地方进行统计

3、该如何取出

关于记录日志的附件,选择了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('/\?)([^"\'\]]*)\1\s*\]/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_');

注:最后代码参考自乱炖。

(资源库 www.zyku.net)

上一篇:WordPress条件判断标签及用法大全

栏    目:WordPress

下一篇:WordPress三招教你快速屏蔽WordPress垃圾评论

本文标题:WordPress获取当前日志的所有附件的方法

本文地址:https://www.zyku.net/wp/1041.html

关于我们 | 版权申明 | 寻求合作 |

重要申明:本站所有的文章、图片、评论等内容,均由网友发表或上传并维护或收集自网络,仅供个人学习交流使用,版权归原作者所有。

如有侵犯您的版权,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:95148658 | 邮箱:mb8#qq.com(#换成@)

苏ICP备2020066115号-1

本网站由提供CDN加速/云存储服务