テンプレートファイル上で実行されるショートコードは、すでにレスポンスヘッダーが出力された後で実行されます。リダイレクトのLocation ヘッダーは、このレスポンスヘッダーに含める必要があるため、テンプレートファイル上でのショートコードでは、リダイレクトすることはできません。
※ バッファリング設定などにより一部の環境では動作しますが、環境に左右されることは望ましい実装とは言えません。
実現方法としては、テンプレートファイルを読み込む前の template_redirect で、独自にショートコードを取得し、実行させる方法です。
Function Reference/get shortcode regex の Usage に、$post->post_content から、独自のショートコードを取得するコードが載っていますので参考としてください。
>>jim912様
早速のご返信ありがとうございます。
また、参照URLもご提示いただきありがとうございます。
>>テンプレートファイル上で実行されるショートコードは、すでにレスポンスヘッダーが出力された後で実行されます。リダイレクトのLocation ヘッダーは、このレスポンスヘッダーに含める必要があるため、テンプレートファイル上でのショートコードでは、リダイレクトすることはできません。
⇒理解いたしました。
>>実現方法としては、テンプレートファイルを読み込む前の template_redirect で、独自にショートコードを取得し、実行させる方法です。
Function Reference/get shortcode regex の Usage に、$post->post_content から、独自のショートコードを取得するコードが載っていますので参考としてください。
⇒私の力不足から、ここを理解することができませんでした。もしお時間あられましたら、もう少し詳しく教えていただけないでしょうか。お手数おかけして、大変申し訳ありません。
具体的にどの点がわからないのか不明なので、全体の手順のみ記述します。
- template_redirect アクションにて、$post->post_content をチェック。自分のショートコードを抜き出す
- ショートコードが存在していたら、do_shortcode にて、ショートコードを実行
- 実行されたショートコードにてリダイレクト
となります。
$post->post_content から、ショートコードを抜き出すためのサンプルコードが、Usage に掲載されているものです。
your-shortcode の部分を作成したショートコード名に置き換え、// shortcode is being used の記述の部分で、do_shortcode を行います。$matches[0]に $post->post_content に入力されたショートコードが入っているはずです。
>>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' );
>>jim912様
上記コードをfunction.phpに記入した場合、wordpress管理画面の「固定ページ一覧」をクリックすると、http://www.example.comにリダイレクトされますが、それは仕方ないのでしょうか。
それとも私のコードが悪いのでしょうか。
重ね重ね質問してしまい申し訳ありません。
add_action( 'wp', 'your_prefix_detect_shortcode' );
を
add_action( 'template_redirect', 'your_prefix_detect_shortcode' );
としてみてください。
>>jim912様
ありがとうございます。
実装できました!