まず、画像を取得する必要があります。ギャラリーのすべての画像を取得する方法は、ここで説明されています。
WordPressはファイルの解凍に2つのクラスを使用します。PHPビルトインZipArchive()
(使用方法はDavid Walshを参照)。そしてPclZip、このクラスはにありwp-admin/includes/class-pclzip.php
ます。問題が発生した場合はZipArchive()
、PclZipクラスを試してください。
両方を接着する必要があります。あとでサンプルコードを投稿できるかもしれませんが、現在はデスクにいません。
更新
質問は2つの部分に分けることができます。最初の方法は、ギャラリーからすべての画像を取得することです。2つ目は、画像を圧縮し、zipファイルを送信します。
ファイルを圧縮することは少し話題に合わないため、ギャラリーのすべての画像を取得する最初の部分のみを説明します。
他の解決策があるかもしれませんが、この例では、元のギャラリーショートコードをカスタムのコードに置き換えて画像を取得します。その理由は、WordPressがv3.5のギャラリーを少し変更したためです。
3.5より前では、ギャラリーの画像は投稿の添付ファイルです。3.5以降、画像は属性としてショートコードに渡されます。WP3.5以降では、投稿の添付画像を取得できなくなったため、ショートコード属性からリストを取得する必要があります。私の戦略は、元のショートコードをカスタムショートコードに置き換え、属性を取得し、元のショートコードを呼び出してギャラリー出力を取得することです。
ギャラリー関連のものはすべてクラス内にあります。zipファイルを作成するには、ギャラリークラスの出力を入力として受け取る別のクラスを使用できます。クラスと単純なコンストラクターから始めましょう。
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
はギャラリー付きの各投稿のエントリが保持されるため、フロントページまたはシングルビューで関数を使用できます。各投稿には複数のギャラリーが存在する可能性があるため、各エントリには各ギャラリーの配列が含まれます。
プラグインの中核は、ショートコードから画像を取得する方法です。
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
属性を処理する必要があります。すべての変数を設定した後、最終的にギャラリーから画像を取得できます。取得した画像は$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ファイルを作成することもできます。$images
最後の方法で配列からzipファイルを作成できます。ただし、このメソッドはギャラリーが表示されるたびに呼び出され、zipファイルの作成には時間がかかる場合があります。ここで作成したzipファイルを要求する人はいないでしょう。これはリソースの無駄です。
どうすればそれを改善できますか?すべての画像をクラス変数に入れたことを覚えています$images
か?このクラス変数をajaxリクエストに使用できます。ただし、ajaxリクエストは単なるページロードであり、ギャラリーの出力が作成されたときにのみ画像にアクセスできます。別のページがリクエストされた後でも、画像にアクセスできる場所に画像を保存する必要があります。
この例では、セッション変数を使用して配列を画像とともに保存します。セッション変数は、別のページをリロードした後でもアクセスできます。画像を保存するには、shutdown
フックにメソッドを登録します。WordPressがページのレンダリングを完了すると、shutdown
フックが呼び出されます。この時点で、表示されているすべてのギャラリーからすべての画像を収集しているはずです。画像を保存するだけで、ajaxリクエストでそれらにアクセスできます。
ajaxリクエストがトリガーされると、セッション変数を呼び出して、データからzipファイルを作成します。しかし、これはこの質問のトピックから少し外れています。
完全なプラグインコードでGitHubにリポジトリを作成しました。それが正しい方向にあなたを指し示すことを願っています。