サポート » 使い方全般 » 3.1でのheader送信タイミング

  • 解決済 shokun0803

    (@shokun0803)


    自作プラグインで、ログインして投稿記事を表示しているときにformでボタンを表示し、ボタンを押したら「承認」などのデータをカスタムフィールドに登録するように作っています。

    実際は2.9のときに作ったプラグインなので、現在3.1用にカスタマイズ中なのですが、カスタムフィールドへの登録などは正常に動いています。

    で、ボタンを押したときの動作なのですが、ボタンが押されたときに<form method="post" action="">なので自分自身が呼び出されます。submitで「承認」などのpostデータが飛んでくるのでカスタムフィールドなどの処理を行い、header("Location: " . get_permalink() );で自分自身にリダイレクトをかけています。

    ここが問題で、2.9まではボタンを押した瞬間に画面がリフレッシュされ、ボタンも「承認する」ボタンから「未承認にする」ボタンに変わっていました。しかし、3.1(3.0は試していないのでもしかしたら3.0でも)で同じ動作を行うと、リダイレクトされないことに気がつきました。
    調べてみると今までheader("Location: " . get_permalink() );でリダイレクトしていた部分がこの記述よりも前にheaderが送信されているらしくリダイレクトされないことがわかりました。しかし、残念ながらどのタイミングでheaderが送信されているのかわかりません・・・

    どなたか解決法、もしくは2.9と3.1でheader送信のタイミングの違いなどがわかる方はいませんでしょうか?よろしくお願いいたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • モデレーター Takayuki Miyoshi

    (@takayukister)

    shokun0803 さんの header("Location: " . get_permalink() ); はどのタイミングで実行されているんでしょうか。僕はよく下のようなやり方で、init のアクションフックのタイミングでリダイレクトかけますが、どのバージョンでも問題なく動いてますよ。

    add_action( 'init', 'foobar' );
    
    function foobar() {
    	// ここでフォームを処理 
    
    	wp_redirect( add_query_arg( array( 'updated' => 1 ) ) );
    	exit();
    }
    モデレーター jim912

    (@jim912)

    通常の編集時(クイック編集等以外)では、投稿、ページともにwp-includes/post.phpの209行目

    redirect_post($post_id); // Send user on their way while we keep working

    でリダイレクトされ、その直前に header( ‘Location: ****’ ); exit; を追加しても、問題なくリダイレクトされます。

    3.0でカスタム投稿タイプが実装された関係上、ページ編集のURLが変わっていますが、その絡みで、フックがなされていないなどの可能性はありませんか?

    トピック投稿者 shokun0803

    (@shokun0803)

    すみません、毎度ありがとうございます。
    端的に言いますと、3.1が原因ではありませんでした。

    今まではテーマファイルに直接関数の呼び出しを書いていましたが、汎用性を考えてフックでボタンを表示するように改造したことが原因の1つでした。
    フックで呼び出された部分がheaderの送信後であったために正常に動作していませんでした。

    みよしさんの助言どおり、initでフックした別の関数を用意して、リダイレクト処理をボタン表示とは別で動かすことで無事解決いたしました。

    いいんちょーさんの助言は投稿編集画面でのリダイレクトに関するものですよね?すみません、投稿記事を表示している画面だとちゃんと説明していませんでした。記事を表示しているときに管理者がボタンひとつで記事を承認できるプラグインで、管理者に記事の編集権限などは持たせていないのです(笑)

    今回wp_redirect( add_query_arg( array( 'updated' => 1 ) ) );は使わずにheader("Location: " . get_permalink() );でリダイレクトかけているのですが、wp_redirectを使うほうが安全なのですかね?用意されているものを使う方がよい気がしますが・・・

    プラグインとしての公開はちょっと自信がなくてできないのですが、一部コードの公開などは今後自ブログなどで少しずつでも行おうかなと考えています。今回もいいんちょーの「WordPressの実行フロー」記事などを見ながら検証をしていたのですが、なかなか自分だけでエラーを探すのは難しいですね。

    大変助かりました、ありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「3.1でのheader送信タイミング」には新たに返信することはできません。