首先,您必须获取图像。这里介绍了如何获取画廊的所有图像。
WordPress使用两个类来解压缩文件。PHP中的代码ZipArchive()
(参见David Walsh)。和PclZip,您可以在中找到此类wp-admin/includes/class-pclzip.php
。如果您遇到问题,请ZipArchive()
尝试PclZip类。
现在,您只需要将两者粘合在一起即可。也许以后我可以发布一些示例代码,目前我不在办公桌前。
更新资料
您的问题可以分为两部分。第一个是从图库中获取所有图像。第二个是压缩图像并发送压缩文件。
我只解释第一部分,获取画廊的所有图像,因为压缩文件有点不合时宜。
也许还有其他解决方案,但是在此示例中,我将原始的画廊短代码替换为自定义的画廊短代码以获取图像。原因是,WordPress稍微改变了v3.5中的图库。
在3.5之前,画廊的图像是帖子的附件。3.5之后,图像将作为属性传递到短代码。由于WP3.5,我们无法再获取帖子的附件图像,因此我们必须从shortcode属性中获取列表。我的策略是用自定义简码替换原始简码,获取属性并调用原始简码以获取图库输出。
所有画廊相关的东西都在一个类中。要创建一个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()
稍后将在带有hook的插件中调用该方法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。比起include wp-includes/media.php
,此文件包含原始库短代码的回调函数。现在,我们调用一个方法来获取一个包含所有图像的数组,通过调用原始的画廊回调来创建画廊输出,创建一个链接并将该链接附加到画廊输出。图像本身以及图像的路径都存储在class变量中$images
,稍后我们需要此数组。
class变量$image
为每个带有画廊的帖子保存一个条目,因此我们可以在首页或单个视图中使用该函数。每个条目包含每个图库的数组,因为每个帖子中可以有多个图库。
插件的核心是从短代码获取图像的方法。
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列表。如果这是帖子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()
并遍历检索到的附件。为了处理不同的大小,我们获得了附件图像和网址条。从附件中获取路径,并将其与文件名放在一起。$images
现在在阵列中是所有图像及其来自图库的路径。
基本上,您的问题在这一点上得到了回答。但是您也想从图像创建一个zip文件。您可以$images
在最后一个方法中从数组创建一个zip文件。但是,每次显示画廊时都会调用此方法,创建zip文件可能需要一段时间。也许没有人会要求您在此处创建的zip文件,这会浪费资源。
我们如何做得更好?您还记得我将所有图像都放在class变量中$images
吗?我们可以将此类var用于ajax请求。但是ajax请求只是另一个页面加载,我们只有在创建画廊的输出后才能访问图像。我们必须将图像保存在一个位置,即使在另一个页面请求之后也可以访问它们。
在这个例子中,我使用一个会话变量来存储带有图像的数组。即使在另一个页面重新加载后,也可以访问会话变量。为了存储图像,我用shutdown
钩子注册了一个方法。WordPress完成呈现页面后,shutdown
将调用该挂钩。此时,我们应该已经从所有显示的画廊中收集了所有图像。我们只存储图像,并可以在ajax请求中访问它们。
触发ajax请求时,我们调用会话var并从数据创建一个zip文件。但这对于这个问题来说有点离题。
我在GitHub上创建了带有完整插件代码的存储库。我希望它能为您指明正确的方向。