今回の記事では、phpを使用して、チェックボックスで選択したファイル(PDF等)をzipにまとめてダウンロードさせる方法を紹介します。さらに今回の方法はPDFを簡単にアップロード出来る管理画面付きです。
ホワイトペーパーページや、資料ダウンロードページなどでよく見られる仕様なので覚えて貰えればいつか役に立つかと思います。
選択したファイルをzipにまとめてダウンロードさせる方法(準備)
まず前提条件として今回の方法は、WordPressを使用します。
初めに準備として、カスタム投稿とカスタムフィールドを作成します。
カスタム投稿機能はCustom Post Type UIを使用すれば簡単に設定出来ます。カスタムフィールドはAdvanced Custom Fieldsを使用すれば簡単に設定出来ます。
今回はカスタム投稿タイプの「document」という名前で作成しました。この投稿で必要な機能は「タイトル」と「アイキャッチ」と次で作成する「カスタムフィールド」のみです。その他はOFFでOKです。

カスタムフィールドは「file」という名前で作成しています。

【*重要】カスタムフィールドの返り値は必ず「ファイルのURL」にしといて下さい。

作成した「document」の投稿機能にいくつかテスト投稿をしてみて下さい。正常に投稿されてページが表示されればOKです。
選択したファイルをzipにまとめてダウンロードさせる方法(phpコード)
phpファイルでダウンロードページのフォームを作成していきます。
ループを使って先程作成したカスタムフィールド付きの投稿をループ表示させています。
以下に重要な部分だけまとめておきます
- 1行目。formタグのactionで次で紹介するzip.phpを読み込んでください。
- 5行目。カスタム投稿とフィールドを呼び出してます。こうすることでWP管理画面から追加が可能に。
- 25行目。inputタグの中のnameはpdfでは無くpdf[]にして下さい。出ないと配列として認識されない。
- 25行目。inputタグの中のvalueはカスタムフィールドの返り値にして下さい。今回は$fileにまとめています。この件が返り値をURLにしなくてはいけない理由です。ただこうする場合はサイト内を右クリックできない様にする事をお勧めします。
<form method="post" action="<?php echo get_template_directory_uri(); ?>/zip.php">
<ul>
<?php
// カスタム投稿
$information= get_posts( array (
'numberposts' => 3, 'orderby',
'post_type' => array('document'),
));
if( $information):
?>
<?php
foreach( $information as $post ):
setup_postdata( $post );
?>
<?php //カスタムフィールド
$file = get_field('file'); ?>
<div>
<label>
<li>
<span><?php the_title(); ?></span>
<input type="checkbox" class="checkbox-input" id="<?php echo $file;?>" name="pdf[]" value="<?php echo $file;?>" />
</li>
<!-- サムネイル -->
<div>
<?php if ( has_post_thumbnail() ): ?>
<img src="<?php the_post_thumbnail_url(); ?>">
<?php else: ?>
<img src="ここに代替画像のURL">
<?php endif; ?>
</label>
</div>
</div>
<?php endforeach; wp_reset_postdata(); ?>
<?php else: ?>
<p>表示できる情報はありません。</p>
<?php endif; ?>
</ul>
<p>
<input type="submit" value="ダウンロード" /> <input type="reset" value="リセット" />
</p>
</form>
次にzip.phpを作成して、以下のコードを記述します。
以下に重要な部分だけまとめておきます
- 3行目。$_POSTの[]の中は先程のinputタグのnameの値と同じにして下さい。ただし[]はいらないです。
- 16行目。後ほどtmpのファイルを作成します。
<?php
if (!empty($_POST["pdf"])){
// ダウンロードさせたいファイル
$pdf= $_POST['pdf'];
$pathAry = array();
for($i=0; $i<sizeof($pdf); $i++){
$pathAry[] = $pdf[$i];
}
// zipのインスタンス作成
$objzip = new zipArchive($pathAry);
// 一時ファイル(zip)の名前とPath
$zipName = "file_".date("Ymds") .'.zip';
$zipPath = 'tmp/'.$zipName;
// 一時ファイル(zipファイル)を作成
$result = $objzip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($result !== true) {
echo "err - open zip-file";
exit;
}
set_time_limit(0);
// zipに追加
foreach ($pathAry as $filepath) {
$filename = basename($filepath);
$objzip->addFromString($filename, file_get_contents($filepath));
}
$objzip->close();
// 出力(ダウンロード)
header('Content-Type: application/zip; name="' . $zipName . '"');
header('Content-Disposition: attachment; filename="' . $zipName . '"');
header('Content-Length: '.filesize($zipPath));
echo file_get_contents($zipPath);
// 一時ファイル(zipファイル)の削除
unlink($zipPath);
exit();
}else{
header("Location:index.html");
}
?>
最後にzipを一時的に保存するファイルを作成します。
先程、重要な部分で書いた様に「tmp」というファイルを作成する必要があります。ファイルのディレクトリはzip.phpがある場所と同じです。
このファイルは、一時的にzipにしたファイルを置く場所ですので、ファイルの中身には何も入れなくて大丈夫です。しかしこのファイルがないと上記のphpは機能しないので必ず用意して下さい。

(ここで紹介したzip.phpはWordPressでも無くても問題なく動作します。)
以上が「【php】選択したファイルをzipにまとめてダウンロードさせる方法」でした。
個人的な技術メモ的な記事にですが、誰かの役に立場幸いです。また、何か違う部分があればコメントにてご教授下さい。