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

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

新規登録して質問してみよう
ただいま回答率
85.31%
WordPress

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

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

4378閲覧

【PHP】ファイルダウンロード(.zip)させようとするとファイル自体の中身が文字列でページに表示されてしまう【WordPress】

isMiss

総合スコア1

WordPress

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

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/05/05 09:06

編集2021/05/06 15:31

実現したいこと

■作成したいもの

WordPressでホームページを作成しています。 作成中のページ上で、ボタンを押下すると特定のファイル操作が行われて ZIPファイルをクライアントがダウンロードできる仕組みを作成したいです。

■お伺いしたいこと

今回ケースのエラーが起こる可能性があると思われる原因、
そもそも今回は後述しますが恐らくPHPでheader情報の付与が上手くいっていないと思われるのですが
もし同じご意見であれば、その付与が上手くいかない原因、ご意見をお伺いさせていただきたいです。
異なるご見解であれば、そのご意見もお伺いしたいです。

補足:
itagagakiさんのご助言があって、
headers_sent関数で確認したところ既にヘッダ送信済みのため、
headerのcontent-typeの設定が上手くいっていないことが
分かりました。
しかし、該当の既に送信を行ったモジュールはテーマ共通のPHPファイルであったため、
なぜPOST後のレスポンス送信時のエラーで差異が出るのかが不明です。
(既存テーマの(Cocoon)ではうまくいっています。)
このヘッダ送信済みとなってしまう "契機" の観点で 問題のありそうな部分があれば
ご助言いただきたいです…。

## 前提  前提として、WordPressのテーマは既存の物では無くて、一から自分で作成した  テーマを使っています。  一から自分で作成したテーマについては、ほぼプレーンな状態で、特別な設定は  特に行っていない状態です。

      現象が起きているページは、
WordPress の 固定ページ(page.php)です。

 クライアントのダウンロード方法は一般的でブラウザを使ってページにアクセスし、  ボタン押下でエクスプローラーから保存する経由になります。  サーバの使用言語はPHPです。

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

既存のWordPressのテーマ(Cocoonなど)であれば作成したPHPのコードで

     ZIPファイルが正常にダウンロードできています。

しかし一から自分で作成したテーマでPHPのコードを走らせると、ページ上に ZIPファイルの中身の文字列が表示されてしまいます。

    (以下の画像参照です。)
文字列が表示されるケースでは、ページ遷移が一度走って、
遷移後のページで以下のようなページが表示されます。
(URLは遷移前と遷移後で同じ)

![イメージ説明](1a8b961fa9985e18848bfc3b4a366ba3.png)

     エラーメッセージは特に表示されていません。

また、デベロッパーツールを使ってPOSTの結果を確認いたしました。
上手くいっているテーマの時と上手くいっていないテーマの時のPOSTの結果差分は以下の通りです。
イメージ説明

(黒塗りのところについては差分は出ていません。)
上手くいっているケースではPOSTしたときは
content-type: application/zip となっていましたが、
上手くいかなかったときは
content-type: text/html; charaset=UTF-8 となっていました。

そのため、以下にコードを載せますが
恐らくPHPの header が上手く処理できておらず、readfileが行われている可能性が
あると個人的には考えております。

該当のソースコード(既存・今回作成したテーマともに同じコード)

HTML

1<form method="POST" action="" enctype="multipart/form-data"> 2 <div class="file_button"> 3 <input class="input-file" type="file" name="upimg" accept="image/png"> 4 </div></br></br> 5 <button type="submit" name="add" class="section1-content-button" onsubmit="return check_blank(this)" >ダウンロード</button > 6<!-- 省略 -->

PHP

1 // !!! OPEN処理とZIPファイルダウンロード処理部以外は、長くなるので割愛させていただきます。 !!! 2 // ファイルダウンロードさせるための処理定義 3 function download($pPath, $pMimeType = null) { 4 //-- Content-Typeとして送信するMIMEタイプ 5 $mimeType = (isset($pMimeType)) ? $pMimeType 6 : (new finfo(FILEINFO_MIME_TYPE))->file($pPath); 7 8 //-- 適切なMIMEタイプが得られない時は、未知のファイルを示すapplication/octet-streamとする 9 if (!preg_match('/\A\S+?/\S+/', $mimeType)) { 10 $mimeType = 'application/octet-stream'; 11 } 12 13 //-- Content-Type 14 header('Content-Type: ' . $mimeType); 15 16 //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する 17 header('X-Content-Type-Options: nosniff'); 18 19 //-- ダウンロードファイルのサイズ 20 header('Content-Length: ' . filesize($pPath)); 21 22 //-- ダウンロード時のファイル名 23 header('Content-Disposition: attachment; filename="' . basename($pPath) . '"'); 24 25 //-- keep-aliveを無効にする 26 header('Connection: close'); 27 28 //-- readfile()の前に出力バッファリングを無効化する 29 while (ob_get_level()) { ob_end_clean(); } 30 31 //-- 出力 32 readfile($pPath); 33 34 // 作成したzipは削除しておく 35 unlink($pPath); 36 37 //-- 最後に終了させる 38 exit; 39 } 40 41  // POSTされたときの処理開始 42 if(isset($_POST['add'])) { 43 44 // !!! 中略 45 46 // $zip_tmp_path、$zip_nameはそれぞれサーバ上のZIPファイルの場所と名前 47 $res = $zip->open($zip_tmp_path.'/'.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 48 49   // !!! 中略(ここからファイルダウンロードさせるための処理実行) !!! 50 51 // $pMimeTypeの引数は未指定で実行 52 download($zip_tmp_path.'/'.$zip_name); 53 }

試したこと

■ 調査を行って現象として、以下記事に近いと感じたため文字コードの改善を試みました。

 「【PHP】headerでContent-Typeを指定したのに効かない場合の対処法」
https://mementoo.info/archives/2292

1.一から作成したテーマのPHPファイルをUTF-8(BOMなし)に変換して再配置

2.該当ページに対して charset=utf-8 を指定するようにHTMLを編集

■ type を 無条件に zip 指定のコードで現象起こるかどうか

 ご助言いただき、PHPコードにて無条件で
header('Content-Type: application/zip')
を指定してダウンロード処理を実行してみました。

 結果は変わりませんでした。以下試したダウンロード処理部のコードです。
(引数に正しくzipファイルのパスを渡しています。)

PHP

1function download($pPath) { 2 3 //-- Content-Type 4 header('Content-Type: application/zip'); 5 6 //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する 7 header('X-Content-Type-Options: nosniff'); 8 9 //-- ダウンロードファイルのサイズ 10 header('Content-Length: ' . filesize($pPath)); 11 12 //-- ダウンロード時のファイル名 13 header('Content-Disposition: attachment; filename="' . basename($pPath) . '"'); 14 15 //-- keep-aliveを無効にする 16 header('Connection: close'); 17 18 //-- readfile()の前に出力バッファリングを無効化する ※詳細は後述 19 while (ob_get_level()) { ob_end_clean(); } 20 21 //-- 出力 22 readfile($pPath); 23 24 // 作成したzipは削除しておく 25 unlink($pPath); 26 27 //-- 最後に終了させるのを忘れない 28 exit; 29}

■ header関数を呼ぶ前にheaders_sent関数で確認してみました。

ご助言いただき、headers_sent関数で既にヘッダが送信されているか確認しました。
以下コードです。

PHP

1function download($pPath) { 2 3 if (!headers_sent($filename, $linenum)) { 4 5 //-- Content-Type 6 header('Content-Type: application/zip'); 7 8 //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する 9 header('X-Content-Type-Options: nosniff'); 10 11 //-- ダウンロードファイルのサイズ 12 header('Content-Length: ' . filesize($pPath)); 13 14 //-- ダウンロード時のファイル名 15 header('Content-Disposition: attachment; filename="' . basename($pPath) . '"'); 16 17 //-- keep-aliveを無効にする 18 header('Connection: close'); 19 20 //-- readfile()の前に出力バッファリングを無効化する ※詳細は後述 21 while (ob_get_level()) { ob_end_clean(); } 22 23 //-- 出力 24 readfile($pPath); 25 26 // 作成したzipは削除しておく 27 unlink($pPath); 28 29 //-- 最後に終了させるのを忘れない 30 exit; 31 } 32 else { 33 echo "$filename$linenum 行目でヘッダがすでに送信されています。\n" . 34 "リダイレクトできません。代わりにこの <a " . 35 "href=\"http://www.example.com\">リンク</a> をクリックしてください。\n"; 36 exit; 37 } 38}

確認したところ、同じPHPコードで Wordpressのテーマ Cocoon では既にヘッダ送信済み判定ではなかったのですが、
自作テーマでは既にヘッダ送信済み判定となりました。

実行結果:
/home/c1221591/public_html/[質問者の取得しているドメイン].com/wp-includes/formatting.php の 5740 行目で
ヘッダがすでに送信されています。 リダイレクトできません。代わりにこの リンク をクリックしてください。

該当の送信済みとなったformatting.phpのコードは以下の箇所でした。

※注釈つけています。
該当箇所:
<!-- ↓↓↓ ここが 5740行目 ↓↓↓ -->
window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;

参考文献:
https://developer.wordpress.org/reference/functions/print_emoji_detection_script/

PHP

1/** 2 * Prints inline Emoji detection script. 3 * 4 * @ignore 5 * @since 4.6.0 6 * @access private 7 */ 8function _print_emoji_detection_script() { 9 $settings = array( 10 <!-- 文字制限により中略 --> 11 <script<?php echo $type_attr; ?>> 12 13 14 <!-- ↓↓↓ ここが 5740行目 ↓↓↓ --> 15 window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>; 16 } 17}

■ header関数使う前に、ob_cleanで出力バッファを意図的にクリアして、出力の終わりにob_flushする
ご助言いただき、ob_●● を試してみました。

PHP

1function download($pPath) { 2 if (!ob_clean()) { 3 echo <<<EOM 4 <script>alert('ob_cleanの失敗');</script> 5 EOM; 6 exit; 7 } 8 9 //-- Content-Type 10 header('Content-Type: application/zip'); 11 12 //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する 13 header('X-Content-Type-Options: nosniff'); 14 15 //-- ダウンロードファイルのサイズ 16 header('Content-Length: ' . filesize($pPath)); 17 18 //-- ダウンロード時のファイル名 19 header('Content-Disposition: attachment; filename="' . basename($pPath) . '"'); 20 21 //-- keep-aliveを無効にする 22 header('Connection: close'); 23 24 if (!ob_flush()) { 25 echo <<<EOM 26 <script>alert('ob_flushの失敗');</script> 27 EOM; 28 exit; 29 } 30 31 //-- 出力 32 readfile($pPath); 33 34 // 作成したzipは削除しておく 35 unlink($pPath); 36 37 //-- 最後に終了させるのを忘れない 38 exit; 39}

上記のように、header 処理の前に、出力バッファをクリアしてからフラッシュして
readfileしましたが、結果は不具合結果と同じでした。
ob_cleanした後に、headers_sent()で送信済みかどうか確認してみると既に送信済み
判定となっているため、同不具合が発生していると思われます。

試したこと最新(CHERRYさんからいただいた方針です。こちらで期待動作となりました。)

<?php の次行からダウンロードの処理を記載して、テーマの処理が始まる前にダウンロード処理するコードを記載することを 試しました。以下コードです。 (問題をシンプルにするために header関数を使わないようにしました。) ``` PHP <!-- page.php --> <?php define('WP_DEBUG', false); function download($pPath) { //-- Content-Type header('Content-Type: application/zip'); //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する header('X-Content-Type-Options: nosniff'); //-- ダウンロードファイルのサイズ header('Content-Length: ' . filesize($pPath)); //-- ダウンロード時のファイル名 header('Content-Disposition: attachment; filename="' . basename($pPath) . '"'); //-- keep-aliveを無効にする header('Connection: close'); //-- readfile()の前に出力バッファリングを無効化する while (ob_get_level()) { ob_end_clean(); } //-- 出力 readfile($pPath); // 作成したzipは削除しておく unlink($pPath); //-- 最後に終了させるのを忘れない exit; } if(isset($_POST['add'])) { // zip 作成処理 // 出力処理 ※”$zip_tmp_path.'/'.$zip_name” は zipファイルのパス download($zip_tmp_path.'/'.$zip_name); } ?> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/> <meta name="referrer" content="no-referrer-when-downgrade"/> </head> <?php if(have_posts()){ while(have_posts()){ the_post(); the_content(); } } ?>
``` HTML <!-- 記事内容 --> <!-- 省略 --> <form method="POST" action="" enctype="multipart/form-data"> <div class="file_button"> <input class="input-file" type="file" name="upimg" accept="image/png"> </div></br></br> <button type="submit" name="add" class="section1-content-button" onsubmit="check_blank(this);" >ダウンロード</button > </form> <!-- 省略 -->

結果、期待通りに download 処理を行うことができました。

補足情報(FW/ツールのバージョンなど)

OS:Windows 10 pro(64bit)
GoogleChrome:バージョン 90.0.4430.93(Official Build) (64 bit)

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

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

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

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

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

itagagaki

2021/05/05 09:18

> isset($pMimeType)) ? $pMimeType この$pMimeTypeがどこから来ているのかが知りたいです。
isMiss

2021/05/05 09:19

承知しました。 少々お待ちください。
isMiss

2021/05/05 09:36 編集

>この$pMimeTypeがどこから来ているのかが知りたいです。 質問文のPHPコードを $pMimeTypeがどこから来ているのか 分かるように 修正いたしました。$pMimeType は 今回ケースでは null となります。 便宜上、引数でTypeを渡すことのできるようにしているだけのロジックになります。
itagagaki

2021/05/05 09:37

なるほど。すると new finfo(FILEINFO_MIME_TYPE))->file($pPath) になるわけですね。 無条件に header('Content-Type: application/zip') にしたらダウンロードはできますか? ファイルがZipファイルであることが明白ならそれでいい気がするのですが、それではダメなんでしょうか?
isMiss

2021/05/05 09:40 編集

>無条件に header('Content-Type: application/zip') にしたらダウンロードはできますか? 試してみますので、少々お待ちください。 >ファイルがZipファイルであることが明白ならそれでいい気がするのですが、 >それではダメなんでしょうか? はい、それでも大丈夫です。なので、先ほどのご提案で一度通してみたいと思います。 コードの汎用性を考慮して種別を判別していただけでございました。
isMiss

2021/05/05 09:53 編集

itagagakiさん >無条件に header('Content-Type: application/zip') にしたらダウンロードはできますか?  試してみましたが、結果は変わらずでした。 (結果というのは、ページにZIPファイル自体の文字列が表示される、ダウンロード実施されない、  POSTの Response Headers の content-type が text/html; charset=UTF-8 のままであること。)
isMiss

2021/05/05 10:07

itagagakiさん 的外れの可能性もあるので、読み飛ばしていただいても構いません。 簡単な補足ですが… 恐らく zip形式で content-type の設定の実行自体は 上手くできているのですが、その実行結果として、正常に response headers に対して application/zip が付与できていないと考えています。 (実際、WordPress の cocoonのテーマでは application/zip が付与できている) headers が 正常に付与できない例として headers をPHPで設定する前に HTML要素が読み込まれた場合、処理が無効となる ケースがあるみたいです。 (ヘッダー関数の前にechoやhtmlなど何らかの出力した場合) 参考記事:  「header関数のエラー」  https://www.flatflag.nir87.com/force-download-833#i-5 ただ、ヘッダー関数の前にechoやhtmlなど何らかの出力をした覚えがないので、 妙に感じている次第です…。
isMiss

2021/05/05 10:10

> header関数を呼ぶ前にheaders_sent関数で確認してみましょうか。 承知しました。確認してみます。
isMiss

2021/05/05 10:39 編集

>header関数を呼ぶ前にheaders_sent関数で確認してみましょうか。 こちら、確認しました。 質問文に結果を追記いたしました。 結果から申し上げるとitagagakiさんの懸念通り、既にechoが別スクリプトで 行われていました。 具体的には、WordPressのformatting.php というテーマ共通のPHPにおける print_emoji_detection_script という関数が呼ばれて、 その中で<?php echo wp_json_encode( $settings ); ?>; が行われていることが 判明しました。 今回作成したテーマの functions.php にて以下コードを埋め込んで、 絵文字の echo を行わないようにしました。 remove_action('wp_head', 'print_emoji_detection_script', 7 ); remove_action('wp_print_styles', 'print_emoji_styles'); すると、更に実行すると /home/c1221591/public_html/[質問者が取得しているドメイン].com/wp-includes/general-template.php の 3190 行目でヘッダがすでに送信されています。 リダイレクトできません。代わりにこの リンク をクリックしてください。 というエラーが出ました。 echo、ヘッダ送信済み 地獄ですが、 こちら、解消ができないか確認中でございます…。
isMiss

2021/05/05 15:24 編集

itagagaki さん echo、ヘッダ送信済みとなってしまう問題についてですが、 1つずつ解消していたところ、いずれもWordPressのテーマ共通のPHPから呼び込まれていることが 分かりました。 例えば、現在、WordPressの add_filter() の echo で既に送信済みとなってヘッダに対する content-typeの付与処理の失敗が起こっていますが、契機としては 以下参考記事の通り、the_content()で 記事を取得しに行っているときとなっています。 https://www.koikikukan.com/archives/2015/01/09-011111.php なぜ、既存の Cocoon のテーマでは起こらなかったことが 自作テーマ では このような レスポンスを 返す前に 記事の取得処理 が発生してしまうのか 悩ましいです…。
isMiss

2021/05/06 14:35

itagagaki さん CHERRYさん記載の方針で修正したところ期待動作となりました。 根本的な原因は不明ですが、記事を読み込む前に何らかの header 処理が行われていたと思われます。 itagagakiさんのご助言のおかげで、何が問題となっていたか判明することに 繋がりました。助かりました。 ありがとうございました。
guest

回答2

0

ベストアンサー

content-typeの付与処理の失敗が起こっていますが、契機としては

以下参考記事の通り、the_content()で 記事を取得しに行っているときとなっています。

なぜ、既存の Cocoon のテーマでは起こらなかったことが
自作テーマ では このような レスポンスを 返す前に 記事の取得処理 が発生してしまうのか

テーマの全体が不明ですので断言はできませんが、おそらく自作テーマのどこかに 意図せずに文字列や画面出力するコードが記載されているのだと思われます。

通常、テーマのテンプレートで the_content() が呼び出されるタイミングでは、すでに HTML ヘッダ等は送出されていることが多いので、 the_content() で呼び出される部分で、 heder() 等の処理をすると質問に記載されているすでにヘッダは送信されているというエラーになります。

(例) page.php

<?php get_header(); ?> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <?php while ( have_posts() ) : the_post(); <header class="entry-header"> <?php the_title( '<h1 class="entry-title">', '</h1>' ); ?> </header><!-- .entry-header --> <div class="entry-content"> <?php the_content(); ?> </div><!-- .entry-content --> endwhile; ?> </main><!-- .site-main --> </div><!-- .content-area --> <?php get_footer(); ?>

質問のコードを見る感じでは、ダウンロード時の画面出力は不要と思われますので、どうしても page.php で処理を行いたいのであれば、<?php の次行からダウンロードの処理を記載して、テーマの処理が始まる前にダウンロード処理するコードを記載することになると思います。

具体的なコードが不明なのでダウンロード部分は 質問のコードから流用しますが、以下のようなイメージでしょうか。

<?php // ダウンロード処理のコード if( isset($_POST['add']) ){ // ダウンロードを処理する条件判定? // ダウンロード処理(コードは省略) exit(); } // 本来のテンプレートの内容 get_header(); ?> (以下略)

投稿2021/05/06 00:41

CHERRY

総合スコア25234

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

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

isMiss

2021/05/06 12:26

ありがとうございます。 確認いたします。
isMiss

2021/05/06 14:38 編集

質問文にコードと処理結果を追記いたしました。 コード自体は、CHERRYさんの記載コードとほぼ同様の内容です。 結果、期待通りの動作ができました。 根本的な原因は不明ですが、意図しない経路で contentを読む込む処理がどこかで発生していたと思われます。 皆様、ありがとうございました。
isMiss

2021/05/06 15:20

※補足 >質問のコードを見る感じでは、ダウンロード時の画面出力は不要と思われますので こちらはその通りでございます。 なので、本件では、リンクからどのページを読んでいるか判定した上で 実行したいPHPファイルを選択して読み込ませる処理を実装して対応していきたいと思いました。 よろしくお願いいたします。
isMiss

2021/05/06 15:30

>if( isset($_POST['add']) ){ // ダウンロードを処理する条件判定? のところですが、 質問文の html における submit の name の値が誤っていて、 別の文字列になっていました。失礼しました。 正しくは以下で、質問文を修正しました。 <button type="submit" name="add" ... (省略)
guest

0

header関数使う前に、ob_cleanで出力バッファを意図的にクリアして、
出力の終わりにob_flushしたらどうでしょう?

投稿2021/05/06 00:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

isMiss

2021/05/06 12:23 編集

>header関数使う前に、ob_cleanで出力バッファを意図的にクリアして、 >出力の終わりにob_flushしたらどうでしょう? 質問に追記いたしました。もし m6u さんの意図通りのコードでなければ申し訳ございませんが、 header関数を使用する前に出力バッファをクリアしてみましたが、結果は変わりございませんでした。 出力バッファクリア後に、 headers_sent () でヘッダ送信済みか確認したところ送信済みだったため、 恐らく当不具合が発生していると思われます。 ヘッダ送信される契機が不明です…。 シーケンスとしては以下の通りのつもりですが…。 ---- 不具合が発生している固定ページ上でボタン押下           ↓         POST発生           ↓    サーバ上でPOSTを受け取る・処理する           ↓     バッファクリアの上ヘッダ送信           ↓         readfile() // zip ファイルをダウンロードさせる ---- POST時にページ遷移が起こって、送信時と同じページに 飛んでいるのですが(一般的なPOSTの動きと思っています。)、 このときに the_content() するから、ヘッダ送信済み扱いなのかも? とかボンヤリ考えていますが、切り分けの仕方が思いつかず…、 憶測ばかりですみませんが、 何か切り分け・もしくは解決策のお心当たりについて 案ございましたらご教授いただきたい、という状況です。
isMiss

2021/05/06 14:50 編集

CHERRYさん記載の方針で修正したところ期待動作となりました。 コードを質問文に追記しています, 根本的な原因は不明ですが、記事を読み込む前に何らかの header 処理が行われていたと思われます。 m6u さんのご助言もあり、問題の切り分けができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問