首先,你必须获得图像。介绍了如何获取图库的所有图像here.
WordPress使用两个类来解压缩文件。PHP bilt在ZipArchive()
(用法见David Walsh)。和PclZip, 您可以在中找到该类wp-admin/includes/class-pclzip.php
. 如果你对ZipArchive()
尝试PclZip类。
现在你只需要把两者粘在一起。也许我可以稍后发布一些示例代码,目前我不在办公桌上。
Update
你的问题可以分为两部分。第一种方法是从库中获取所有图像。第二个是压缩图像并发送zip文件
我将只解释第一部分,即获取库的所有图像,因为压缩文件有点离题。
也许还有其他的解决方案,但在这个示例中,我用一个自定义的短代码替换了原来的库短代码来获取图像。原因是,WordPress在v3中更改了库。5一点
在3.5之前,图库的图像是文章的附件。3.5之后,图像将作为属性传递给短代码。自WP3起。5我们无法再获得帖子的附加图像,我们必须从短代码属性中获取列表。我的策略是用自定义短代码替换原始短代码,获取属性并调用原始短代码以获得库输出。
所有与画廊相关的东西都在一个类中。要创建zip文件,我们可以使用另一个类,该类将gallery类的输出作为输入。让我们从一个类和一个简单的构造函数开始。
class GalleryZip
{
private static $instance = null;
public static $images = array();
public static function get_instance() {
if ( ! session_id() )
session_start();
if ( null === self::$instance )
self::$instance = new self();
return self::$instance;
}
private final function __construct() {
remove_shortcode( \'gallery\' );
add_shortcode( \'gallery\', array( __CLASS__, \'gallery_zip_shortcode\' ) );
}
}
我们将调用该方法
get_instance()
稍后在带有挂钩的插件中
plugins_loaded
. 在构造函数中,我们删除了原始的短代码,并将其替换为自定义的短代码
gallery_zip_shortcode()
. 现在我们需要短代码回调
public static function gallery_zip_shortcode( $atts ) {
$post = get_post();
if ( ! function_exists( \'gallery_shortcode\' ) )
require_once ABSPATH . \'wp-includes/media.php\';
self::get_gallery_images_from_shortcode( $post->ID, $atts );
$output = gallery_shortcode( $atts );
$gallery_id = count( self::$images[$post->ID] ) - 1;
$link = sprintf( \'<div><a href="#" gallery-id="%d" post-id="%d" class="gallery-zip">%s</a></div>\', $gallery_id, $post->ID, __( \'Get as Zip\' ) );
$output .= $link;
return $output;
}
这种方法的第一件事是获取帖子,因为我们需要帖子ID
wp-includes/media.php
, 此文件包含原始库短代码的回调函数。现在我们调用一个方法来获取包含所有图像的数组,通过调用原始库回调创建库输出,创建链接并将链接附加到库输出。图像本身(分别是图像的路径)存储在类变量中
$images
, 我们稍后需要此阵列
类变量
$image
使用图库保存每篇文章的条目,因此我们可以在frontpage或单个视图中使用该功能。每个条目包含每个库的一个数组,因为每篇文章中可以有多个库。
该插件的核心是从短代码中获取图像的方法。
protected static function get_gallery_images_from_shortcode( $id, $atts ) {
// use the post ID if the attribute \'ids\' is not set or empty
$id = ( ! isset( $atts[\'ids\'] ) || empty( $atts[\'ids\'] ) ) ?
(int) $id : $atts[\'ids\'];
$exclude = ( isset( $atts[\'exclude\'] ) && ! empty( $atts[\'exclude\'] ) ) ?
$atts[\'exclude\'] : \'\';
if ( ! isset( self::$images[$id] ) || ! is_array( self::$images[$id] ) )
self::$images[$id] = array();
$images = self::get_gallery_images( $id, $exclude );
array_push( self::$images[$id], $images );
return $images;
}
首先,我们决定它是单个帖子还是帖子ID列表。如果它是一个post id列表,我们将处理WP3中的一个库。5岁以上。之后,我们必须处理
exclude
属性设置完所有变量后,我们终于可以从库中获取图像。检索到的图像将被推送到类var中
$images
供以后使用。
protected static function get_gallery_images( $id, $exclude ) {
$images = array();
$query_args = array(
\'post_status\' => \'inherit\',
\'post_type\' => \'attachment\',
\'post_mime_type\' => \'image\',
);
// handle gallery WP3.5+
// if $id contains an comma, it is a list of post IDs
if ( false !== strpos( $id, \',\' ) ) {
$query_args[\'include\'] = $id;
} elseif ( ! empty( $exclude ) ) {
// handle excluding posts
$query_args[\'post_parent\'] = $id;
$query_args[\'exclude\'] = $exclude;
} else {
// handle gallery before WP3.5
$query_args[\'post_parent\'] = $id;
}
$attachments = get_posts( $query_args );
$img_sizes = array_merge( array( \'full\' ), get_intermediate_image_sizes() );
$img_size = ( in_array( self::IMAGE_SIZE, $img_sizes ) ) ?
self::IMAGE_SIZE : \'full\';
foreach ( $attachments as $key => $post ) {
$img = wp_get_attachment_image_src( $post->ID, $img_size, false, false );
$images[] = sprintf( \'%s/%s\', dirname( get_attached_file( $post->ID ) ), basename( $img[0] ) );
}
return $images;
}
这是插件的黄金。只需使用查询参数设置数组,即可使用
get_posts()
并浏览检索到的附件。为了处理不同的大小,我们得到了附件图像和url的条带。从所附文件中,我们获取路径并将其与文件名放在一起。在阵列中
$images
现在是库中的所有图像及其路径。
基本上你的问题在这一点上得到了回答。但是您还需要从这些图像创建一个zip文件。您可以从阵列创建zip文件$images
在最后一种方法中。但是每次显示库时都会调用此方法,创建zip文件可能需要一段时间。也许没有人会请求您在这里创建的zip文件,这是对资源的浪费。
我们怎样才能做得更好?还记得我把所有图像都放在class变量中吗$images
? 我们可以将这个类var用于ajax请求。但是ajax请求只是另一个页面加载,我们只能在创建库的输出时访问图像。我们必须将图像保存在一个地方,这样即使在再次请求页面后,我们也可以访问它们
在本例中,我使用会话变量存储包含图像的数组。即使在重新加载另一个页面后,也可以访问会话变量。为了存储图像,我注册了一个方法shutdown
钩WordPress完成页面渲染后shutdown
将调用挂钩。此时,我们应该已经收集了所有展示画廊中的所有图像。我们只需存储图像,就可以在ajax请求中访问它们。
当ajax请求被触发时,我们调用会话var并从数据中创建一个zip文件。但这个问题有点离题。
我创建了一个repository on GitHub 具有完整的插件代码。我希望它为你指明了正确的方向。