ショートコード内のリダイレクト機能


13

WordPressでユーザーを認証できるように、外部サポートシステムをWordPressに接続するための無料のプラグイン開発しています。

このため、現在外部システムから、ユーザーはこれを最後にWordPressのログインページに送られます

?action=freshdesk-remote-login

プラグインは、ユーザーがWPにログインしているかどうかを確認し、ログインフォームが表示されない場合はログインに成功した後、サードパーティのサイトにリダイレクトします。

リダイレクトは次のようなものを使用して行われます。 wp_redirect( $sso_url );

これでうまくいきましたが、ユーザーが選択したページに追加できるショートコードを提供する予定です。ユーザーがこのページに移動すると、ログインしている場合はサードパーティのサイトに転送され、ログインしていない場合はログインページに転送されます。

ショートコード内で動作するようにwp_redirectを提案できる方法はありますか?

回答:


21

@Rarstが説明するように、ショートコードは通常、遅すぎて内部からリダイレクトできません。それらは通常the_content、コンテンツがブラウザに送信された後かなりの時間、フックで実行されます。ショートコードの存在に基づいてリダイレクトする必要がある場合は、コンテンツがサーバーを離れる前にそのショートコードを確認する必要があります。

function pre_process_shortcode() {
  if (!is_singular()) return;
  global $post;
  if (!empty($post->post_content)) {
    $regex = get_shortcode_regex();
    preg_match_all('/'.$regex.'/',$post->post_content,$matches);
    if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
      // redirect to third party site
    } else {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

それが「概念実証」です。必要な特定の条件は異なる可能性があります。これはかなり「重い」処理です。絶対に必要な場所でのみ実行されるようにします。


トンありがとう。これはまさに完璧で、まさに私が探していたものです。
ハリッシュチョウハン

こんにちは、このコードが特定のページでのみ実行されることを確認するためのチェックを追加しましたが、wp_redirectをショートコード内に配置しても正常に機能することに気付きました。私はjavascriptを使って試しましたが、wp_redirect( $sso_url );うまくいきました。
ハリッシュチョウハン

1
wp_redirect通常の条件下ではショートコードでは機能しません。確認しました。それがあなたのために働いているなら、あなたのテーマまたはプラグインは私がそれを働かせるように提案したものと非常に似たようなことをしています。
s_ha_dum

はい、あなたは正しいです。時間を無駄にしてすみません。コードのインスタンスが複数ありました。上記のコードの使用に戻ります:)
ハリッシュチョウハン

5

wp_redirect()HTTPヘッダー経由でリダイレクトを実行するため、技術的にはページ出力の開始後に機能しません(または少なくとも機能しないはずです)。したがって、この関数をショートコードで使用することはできません。

だからといって、ショートコードを使用して制御することはできません。出力が開始される前に(template_redirectフックの周りのどこかに)フィッティング条件(ページがあり、ページにショートコードが含まれている場合)を確認し、リダイレクトを実行できます。

別のオプションは、ページのロード後にリダイレクトを実行する条件付きJavaScriptを出力することです。


こんにちは私はこれを見つけました: `function pippin_login_form_shortcode($ atts、$ content = null){extract(shortcode_atts(array( 'redirect' => '')、$ atts)); if(!is_user_logged_in()){if($ redirect){$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink(); } $ form = wp_login_form(array( 'echo' => false、 'redirect' => $ redirect_url)); } $ formを返します。} add_shortcode( 'loginform'、 'pippin_login_form_shortcode'); `ここでは、wp_redirectがショートコード内に配置されているようです。
ハリッシュチョウハン


@HarishChouhan wp_redirect()そのコードのどこに表示されますか?
ラルスト

こんにちは、ごめんなさい。サンプルコードでは、URLを保存するだけで、実際にはリダイレクトしません。あなたに応じて、JavaScriptベースのリダイレクトが私の唯一の選択肢のように思えますか?
ハリッシュチョウハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.