質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

3回答

4108閲覧

Wordpressで選択したファイルをZIPまとめてダウンロードさせる方法

tomori244

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

1クリップ

投稿2020/05/20 06:49

前提・実現したいこと

Wordpress の記事ページ(カスタム投稿)で、カスタムフィールドよりアップしたファイルにチェックボックスをつけて、選択されているファイルのみZIPファイルにしてダウンロードさせるようなページを作ています。

以下のサイトを参考にしているのですがうまくいきません…
https://arts-factory.net/zip/

発生している問題・エラーメッセージ

チェックボックスを複数選択してダウンロードボタンを押すと、ページがリロードされたような感じになってページ下部が表示されない。
もちろんZIPファイルもダウンロードできてない。

該当のソースコード

php

1<form class="memberSingle__form" method="post" action=""> 2 <ul class="memberSingle__list"> 3 <?php 4 $fields = $cfs->get('upload'); //親ループ 5 foreach ($fields as $field) : 6 ?> 7 <li class="memberSingle__item"> 8 <label class="memberSingle__inner"> 9 <span class="memberSingle__checkbox"> 10 <input class="memberSingle__checkbox--checkbox" type="checkbox" name="file[]" value="<?php echo $field['upload_data']; ?>"> 11 </span> 12 </label> 13 <a class="memberSingle__link" href="<?php echo $field['upload_data']; ?>" download> 14 <span class="memberSingle__img"></span> 15 <span class="memberSingle__title"> 16 <?php if($field['upload_title']): ?> 17 <?php echo $field['upload_title']; ?> 18 <?php else: ?> 19 <?php echo preg_replace( '/^.*//u', '', $field['upload_data']); ?> 20 <?php endif; ?> 21 </span> 22 <span class="btn01 memberSingle__btn">ダウンロード</span> 23 </a> 24 </li> 25 <?php endforeach; wp_reset_postdata(); ?> 26 </ul> 27 <div class="memberSingle__zipArchive"> 28 <?php var_dump(); ?> 29 <?php if(CFS()->get('upload_archive')): ?> 30 <a class="btn01 memberSingle__zipArchive--btn" href="<?php echo CFS()->get('upload_archive'); ?>" download>全てのファイルをダウンロード</a> 31 <?php endif; ?> 32 <div class="btn01 memberSingle__zipArchive--btn"> 33 <input class="memberSingle__zipArchive--submit" type="submit" value="チェックしたファイルをダウンロード"> 34 </div> 35 </div> 36 </form> 37 <?php echo('<pre>');var_dump($pathAry);echo('</pre>'); ?> 38 <?php 39 if (!empty($_POST["file"])){ 40 // ダウンロードさせたいファイル 41 $pdf= $_POST['file']; 42 $pathAry = array(); 43 for($i=0; $i<sizeof($pdf); $i++){ 44 $pathAry[] = $pdf[$i]; 45 } 46 47 // zipのインスタンス作成 48 $objzip = new zipArchive($pathAry); 49 50 // 一時ファイル(zip)の名前とPath 51 $zipName = "file_" . date("Ymds") .'.zip'; 52 $zipPath = get_stylesheet_directory_uri() . '/tmp/' . $zipName; 53 54 // 一時ファイル(zipファイル)を作成 55 $result = $objzip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 56 if ($result !== true) { 57 echo "err - open zip-file"; 58 exit; 59 } 60 61 set_time_limit(0); 62 63 // zipに追加 64 foreach ($pathAry as $filepath) { 65 $filename = basename($filepath); 66 $objzip->addFromString($filename, file_get_contents($filepath)); 67 } 68 $objzip->close(); 69 70 // 出力(ダウンロード) 71 header('Content-Type: application/zip; name="' . $zipName . '"'); 72 header('Content-Disposition: attachment; filename="' . $zipName . '"'); 73 header('Content-Length: '.filesize($zipPath)); 74 echo file_get_contents($zipPath); 75 76 // 一時ファイル(zipファイル)の削除 77 unlink($zipPath); 78 exit(); 79 80 } else { 81 header("Location:" . home_url() . "/member/"); 82 } 83 ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

出力開始した後でheaderの書き換えはできません
現状多分その旨のエラーメッセージが出ているはずです

zip圧縮+ダウンロード処理のphpは
出力が開始するより前に書かれなくてはいけません

投稿2020/05/20 07:56

KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご回答ありがとうございます。
自己解決しましたので明記します。

zip圧縮+ダウンロード処理の部分を別phpファイルに記述後、テーマフォルダ第一階層に置いて、POSTでデータを受け渡しました。

具体的な記述は以下のようになります。

php

1(single.php) 2<form class="memberSingle__form" method="post" action="<?php echo get_stylesheet_directory_uri(); ?>/ziparchive.php"> 3 <ul class="memberSingle__list"> 4 <?php 5 $fields = $cfs->get('upload'); //親ループ 6 foreach ($fields as $field) : 7 ?> 8 <li class="memberSingle__item"> 9 <label class="memberSingle__inner"> 10 <span class="memberSingle__checkbox"> 11 <input class="memberSingle__checkbox--checkbox" type="checkbox" name="file[]" value="<?php echo $field['upload_data']; ?>"> 12 </span> 13 </label> 14 <a class="memberSingle__link" href="<?php echo $field['upload_data']; ?>" download> 15 <span class="memberSingle__img"></span> 16 <span class="memberSingle__title"> 17 <?php if($field['upload_title']): ?> 18 <?php echo $field['upload_title']; ?> 19 <?php else: ?> 20 <?php echo preg_replace( '/^.*//u', '', $field['upload_data']); ?> 21 <?php endif; ?> 22 </span> 23 <span class="btn01 memberSingle__btn">ダウンロード</span> 24 </a> 25 </li> 26 <?php endforeach; wp_reset_postdata(); ?> 27 </ul> 28 <div class="memberSingle__zipArchive"> 29 <?php var_dump(); ?> 30 <?php if(CFS()->get('upload_archive')): ?> 31 <a class="btn01 memberSingle__zipArchive--btn" href="<?php echo CFS()->get('upload_archive'); ?>" download>全てのファイルをダウンロード</a> 32 <?php endif; ?> 33 <div class="btn01 memberSingle__zipArchive--btn"> 34 <input class="memberSingle__zipArchive--submit" type="submit" value="チェックしたファイルをダウンロード"> 35 </div> 36 </div> 37 </form>

php

1(ziparchive.php) 2if (!empty($_POST["file"])){ 3 // ダウンロードさせたいファイル 4 $pdf= $_POST['file']; 5 $pathAry = array(); 6 for($i=0; $i<sizeof($pdf); $i++){ 7 $pathAry[] = $pdf[$i]; 8 } 9 10 // zipのインスタンス作成 11 $objzip = new zipArchive($pathAry); 12 13 // 一時ファイル(zip)の名前とPath 14 $zipName = "file_" . date("Ymds") .'.zip'; 15 $zipPath = 'tmp/' . $zipName; 16 17 // 一時ファイル(zipファイル)を作成 18 $result = $objzip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 19 if ($result !== true) { 20 echo "err - open zip-file"; 21 exit; 22 } 23 24 set_time_limit(0); 25 26 // zipに追加 27 foreach ($pathAry as $filepath) { 28 $filename = basename($filepath); 29 $objzip->addFromString($filename, file_get_contents($filepath)); 30 } 31 $objzip->close(); 32 33 // 出力(ダウンロード) 34 header('Content-Type: application/zip; name="' . $zipName . '"'); 35 header('Content-Disposition: attachment; filename="' . $zipName . '"'); 36 header('Content-Length: '.filesize($zipPath)); 37 echo file_get_contents($zipPath); 38 39 // 一時ファイル(zipファイル)の削除 40 unlink($zipPath); 41 exit(); 42 43 } else { 44 header("Location:" . home_url() . "/member/"); 45 }

投稿2020/05/20 13:25

tomori244

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ご回答ありがとうございます。
自己解決しましたので明記します。

zip圧縮+ダウンロード処理の部分を別phpファイルに記述後、テーマフォルダ第一階層に置いて、POSTでデータを受け渡しました。

具体的な記述は以下のようになります。

php

1(single.php) 2<form class="memberSingle__form" method="post" action="<?php echo get_stylesheet_directory_uri(); ?>/ziparchive.php"> 3 <ul class="memberSingle__list"> 4 <?php 5 $fields = $cfs->get('upload'); //親ループ 6 foreach ($fields as $field) : 7 ?> 8 <li class="memberSingle__item"> 9 <label class="memberSingle__inner"> 10 <span class="memberSingle__checkbox"> 11 <input class="memberSingle__checkbox--checkbox" type="checkbox" name="file[]" value="<?php echo $field['upload_data']; ?>"> 12 </span> 13 </label> 14 <a class="memberSingle__link" href="<?php echo $field['upload_data']; ?>" download> 15 <span class="memberSingle__img"></span> 16 <span class="memberSingle__title"> 17 <?php if($field['upload_title']): ?> 18 <?php echo $field['upload_title']; ?> 19 <?php else: ?> 20 <?php echo preg_replace( '/^.*//u', '', $field['upload_data']); ?> 21 <?php endif; ?> 22 </span> 23 <span class="btn01 memberSingle__btn">ダウンロード</span> 24 </a> 25 </li> 26 <?php endforeach; wp_reset_postdata(); ?> 27 </ul> 28 <div class="memberSingle__zipArchive"> 29 <?php var_dump(); ?> 30 <?php if(CFS()->get('upload_archive')): ?> 31 <a class="btn01 memberSingle__zipArchive--btn" href="<?php echo CFS()->get('upload_archive'); ?>" download>全てのファイルをダウンロード</a> 32 <?php endif; ?> 33 <div class="btn01 memberSingle__zipArchive--btn"> 34 <input class="memberSingle__zipArchive--submit" type="submit" value="チェックしたファイルをダウンロード"> 35 </div> 36 </div> 37 </form>

php

1(ziparchive.php) 2<?php 3if (!empty($_POST["file"])){ 4 // ダウンロードさせたいファイル 5 $pdf= $_POST['file']; 6 $pathAry = array(); 7 for($i=0; $i<sizeof($pdf); $i++){ 8 $pathAry[] = $pdf[$i]; 9 } 10 11 // zipのインスタンス作成 12 $objzip = new zipArchive($pathAry); 13 14 // 一時ファイル(zip)の名前とPath 15 $zipName = "file_" . date("Ymds") .'.zip'; 16 $zipPath = 'tmp/' . $zipName; 17 18 // 一時ファイル(zipファイル)を作成 19 $result = $objzip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 20 if ($result !== true) { 21 echo "err - open zip-file"; 22 exit; 23 } 24 25 set_time_limit(0); 26 27 // zipに追加 28 foreach ($pathAry as $filepath) { 29 $filename = basename($filepath); 30 $objzip->addFromString($filename, file_get_contents($filepath)); 31 } 32 $objzip->close(); 33 34 // 出力(ダウンロード) 35 header('Content-Type: application/zip; name="' . $zipName . '"'); 36 header('Content-Disposition: attachment; filename="' . $zipName . '"'); 37 header('Content-Length: '.filesize($zipPath)); 38 echo file_get_contents($zipPath); 39 40 // 一時ファイル(zipファイル)の削除 41 unlink($zipPath); 42 exit(); 43 44 } else { 45 header("Location:" . home_url() . "/member/"); 46 } 47?>

投稿2020/05/20 13:21

tomori244

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問