• 解決済 levi1128

    (@levi1128)


    【PHPバージョン】
    PHP5.3.3

    【目的】
    ある固定ページでsubmit後に、別のページに遷移するという実装をしたいです。

    【状況】
    上記実装のために、まずはテストページを作成して、遷移できるかだけをテストしていますが下記エラーがでます。
    「Cannot modify header information – headers already sent by xxxxx」
    具体的な実装は、固定ページ「テスト」にショートコード[test]を入力し、ショートコードの本体コードは子テーマのfunction.phpに以下の様に記述しています。

    <?php
    /*他の目的コード*/
    function() {
     中略
    }
    add_shortcode(‘xx’, ‘xx’);

    /*本目的のコード*/
    function test() {
    header(“Location: http://www.example.com&#8221;);
    }
    add_shortcode(‘test’, ‘test’);

    【調べたたこと】
    ・function.phpがBOMつきではいけない
     ⇒BOMなしです
    ・php.inの設定をout_bufferingがonになっていなければいけない
     ⇒onにしています
    ・「Location」と「:」の間に半角スペースを入れてはいけない
     ⇒入れていません
    ・headerより前にprintやechoを行ってはいけない
     ⇒恐らく今回はこれに引っかかっていると思いますが、解決方法が分かりません。

    大変恐縮ではございますが、詳しい方教えていただけないでしょうか。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • テンプレートファイル上で実行されるショートコードは、すでにレスポンスヘッダーが出力された後で実行されます。リダイレクトのLocation ヘッダーは、このレスポンスヘッダーに含める必要があるため、テンプレートファイル上でのショートコードでは、リダイレクトすることはできません。
    ※ バッファリング設定などにより一部の環境では動作しますが、環境に左右されることは望ましい実装とは言えません。

    実現方法としては、テンプレートファイルを読み込む前の template_redirect で、独自にショートコードを取得し、実行させる方法です。

    Function Reference/get shortcode regex の Usage に、$post->post_content から、独自のショートコードを取得するコードが載っていますので参考としてください。

    トピック投稿者 levi1128

    (@levi1128)

    >>jim912様
    早速のご返信ありがとうございます。
    また、参照URLもご提示いただきありがとうございます。

    >>テンプレートファイル上で実行されるショートコードは、すでにレスポンスヘッダーが出力された後で実行されます。リダイレクトのLocation ヘッダーは、このレスポンスヘッダーに含める必要があるため、テンプレートファイル上でのショートコードでは、リダイレクトすることはできません。
    ⇒理解いたしました。

    >>実現方法としては、テンプレートファイルを読み込む前の template_redirect で、独自にショートコードを取得し、実行させる方法です。
    Function Reference/get shortcode regex の Usage に、$post->post_content から、独自のショートコードを取得するコードが載っていますので参考としてください。
    ⇒私の力不足から、ここを理解することができませんでした。もしお時間あられましたら、もう少し詳しく教えていただけないでしょうか。お手数おかけして、大変申し訳ありません。

    具体的にどの点がわからないのか不明なので、全体の手順のみ記述します。

    1. template_redirect アクションにて、$post->post_content をチェック。自分のショートコードを抜き出す
    2. ショートコードが存在していたら、do_shortcode にて、ショートコードを実行
    3. 実行されたショートコードにてリダイレクト

    となります。
    $post->post_content から、ショートコードを抜き出すためのサンプルコードが、Usage に掲載されているものです。
    your-shortcode の部分を作成したショートコード名に置き換え、// shortcode is being used の記述の部分で、do_shortcode を行います。$matches[0]に $post->post_content に入力されたショートコードが入っているはずです。

    トピック投稿者 levi1128

    (@levi1128)

    >>jim912様
    少し時間がかかりましたが、おかげさまで解決することができました。
    今回のheader(“Location: http:”)ができないために、諦めていた実装がいくつかありましたので大変嬉しいです。心からありがとうございました。

    (検索で辿り着いた方のためにコードを載せておきます)

    /*実際に固定ページに入力するショートコード*/
    function test() {
    	header("Location: http://www.example.com");
    	exit;
    }
    add_shortcode('test', 'test');
    
    /*テンプレートファイルを読み込む前のtemplate_redirectで、独自にショートコード[test]を取得し実行させる*/
    function your_prefix_detect_shortcode() {
    	global $post;
    	$pattern = get_shortcode_regex();
    	if(preg_match_all( '/'. $pattern .'/s', $post -> post_content, $matches)
    		&& array_key_exists( 2, $matches )
    		&& in_array( 'test', $matches[2] ) ) {
    		do_shortcode('[test]');
    	}
    }
    add_action( 'wp', 'your_prefix_detect_shortcode' );
    トピック投稿者 levi1128

    (@levi1128)

    >>jim912様
    上記コードをfunction.phpに記入した場合、wordpress管理画面の「固定ページ一覧」をクリックすると、http://www.example.comにリダイレクトされますが、それは仕方ないのでしょうか。

    それとも私のコードが悪いのでしょうか。

    重ね重ね質問してしまい申し訳ありません。

    add_action( 'wp', 'your_prefix_detect_shortcode' );

    add_action( 'template_redirect', 'your_prefix_detect_shortcode' );

    としてみてください。

    トピック投稿者 levi1128

    (@levi1128)

    >>jim912様
    ありがとうございます。
    実装できました!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「header("Location: http:");ができない」には新たに返信することはできません。