WordPressにて開発をしていると、登録処理や削除処理をした後に自ページにリダイレクトしたい場合があると思います。
言葉にすると簡単そうな処理ですが、詰まったので、備忘録として残します。
WordPressだとPHPのheader関数が使えない……
WordPressでなければPHPのheader関数を使えば良いのですが、Wordpressでheader関数を使用すると以下のようなエラーが出るはずです。
Warningだから大丈夫かなと思いきや、まるで機能しません。
実は、Wordpressは事前にheaderを宣言しているので使えないのです。
さらに、header関数はファイルの最初に持って来ないと機能しません。
つまりなにかの処理をした後にページの再読み込みには使えないということです。
ちなみにWordpress側で同じような関数として「WP_redirect」関数や「WP_safe_redirect」関数がありますが、こちらもNGでした。
内部でheader関数を使用しているので同じようなエラーが出ます。
手軽にWordpressのページを再読み込みする方法!
どうしてもPHPで処理したい場合は、新たに関数を作成してフックして持ってくるらしいですが、さすがに面倒くさそうなのでパスしました。
PHPでの実装は難しそうなので、javascriptでの実装を考えました。
要はjavascriptで再読み込みすればよいだけなので、処理の最後にreload関数を使用します。
ただreload関数はそのまま使用すると永久に再読み込みを繰り返すので、以下のように1回のみ再読み込みするようにします。
1 |
echo '<script type="text/javascript">if (window.name != "any") {window.location.reload();window.name = "any";} else {window.name = "";}</script>'; |
PHPのechoを使用してjavascriptを記入します。
1行のみで横に長いですが、縦に分割するとその分echoを書かないといけないので逆に面倒です。
処理は簡単で、初回のみreloadを行い、その後すぐにanyの文言を取得、
2回目以降はanyを持っているので、reload処理のないelseに入ります。
!=は等しくないという条件なので、anyに等しければ再読み込み、
等しくなければ再読み込みをしないという流れになります。
これで一度のみ再読み込みが実施されます。
reload関数での再読み込みは、POSTやGETで送信したデータを引き継ぎます。
もしも登録処理をしている場合、データを二回送信して、同じデータを登録してしまいます。
それを防ぐには、以下のjavascriptを使用します。
1 |
echo '<script type="text/javascript">window.location.href = window.location.pathname;</script>'; |
javascriptのhref要素はリンク先を表します。
このリンク先にpathnameを指定することで、POSTやGETのデータのない状態で自分のページへと移動することができます。
おわりに
PHPと違い、javascriptはコードが残るのでそこだけが不満ではあります。
とはいえやっていることはページのリロードなので、特に問題はないと思います。
PHPのheader関数が自由に使えれば完全解決なんですけどね……。
たまに出てくる制約付きだと簡単な関数が使えなくなる非常事態はなかなかに恐ろしいものだと思います。