web-dev-qa-db-ja.com

特定の投稿カテゴリまたはカテゴリページにユーザーをリダイレクトする

このフックで特定のカテゴリのユーザーをリダイレクトしようとしているim:

// Show app-data posts only to app users
function user_redirect()
{
    if ( is_category( 'app-data' ) ) {
        $url = site_url();
        wp_redirect( $url );
        exit();
    }
}
add_action( 'the_post', 'user_redirect' );

しかし、それは動作していないと私は理由がわからない。ユーザーがカテゴリを参照している場合はリダイレクトします。ユーザーがカテゴリまたはそのカテゴリの投稿を参照している場合はリダイレクトします

2
CDrosos

なぜうまくいかないのですか?

あなたのコードには一つの大きな問題があります... HTMLコンテンツが既に送信された後にリダイレクトすることはできません...そのようなリダイレクトは無視されます...

では、なぜあなたのコードは間違っているのでしょうか。 the_postフックのため。このフックはpostのオブジェクトが設定されたときに起動します。そのため、通常はループ内にあり、リダイレクトするには遅すぎます。

それでは、どのようにあなたのコードを修正するのですか?

別のフックを使ってください。

これが 典型的なリクエストの間に起動された利用可能なフックのリストです

リダイレクトを行うための最良の方法の1つ( およびそのために一般的に使用される )はtemplate_redirectです。ご覧のとおり、ヘッダーを取得する直前に起動されたので、すべてがすでに設定されています。

function redirect_not_app_users_if_app_data_category() {
    if ( (is_category( 'app-data' ) || in_category('app-data'))&& ! is_user_logged_in() ) {
        wp_redirect( home_url() );
        die;
    }
}
add_action( 'template_redirect', 'redirect_not_app_users_if_app_data_category');
2

フック名the_posttemplate_redirectに変更します。

add_action( 'template_redirect', 'wpse_restrict_catgorey');
function wpse_restrict_catgorey(){

  if( ! is_user_logged_in() && is_category( 'app-data' ) ) {
    wp_redirect( home_url() );
    exit;
  }
}
2
Jignesh Patel