web-dev-qa-db-ja.com

current_user_canが常に正しく動作するとは限らない

私はメンバーだけのセクションを含むカスタムWordpressテーマを持っています。これを実装するために、制限付きページの上部に次のコードがあります。

<?php if ( ! current_user_can ('view_players_area') ) { header('Location: ' . wp_login_url( "http://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]" ) ); } ?>

ほとんどの場合、これはうまく機能しますが、それほど頻繁にはまったく理由もなく機能しなくなります。ログインしてもエラーメッセージは表示されず、ログインページにリダイレクトされ続けます。私はもともとis_user_logged_in()を使用していましたが、このコードを使用する原因となった同様の問題がありました。

誰かがこれを引き起こしているかもしれないことについて何か提案を持っているならば、私は非常に感謝するでしょう - メンバー領域が次の数週間で稼働する必要があるので、これは私の髪を引き裂きます。

よろしく

ベン

編集

返信とチャットルームの一部のユーザーからのアドバイスに従って、リダイレクトがテンプレートで行われないようにコードを変更しました。今functions.phpインクルードに、私は以下があります:

<?php

function redirect_restricted_areas( $query )
{
    if ( !is_admin() && $query->is_main_query() )
    {
          if ( ! current_user_can( 'view_players_area' ) && (
               $query->is_singular ('player-page') ||
               $query->is_post_type_archive ('player-page')
          ) ) 

          header('Location: ' . wp_login_url( "http://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]" ) );
    }

}

add_action ( 'pre_get_posts', 'redirect_restricted_areas' );

残念ながら、これは私のコードを単純にする良いアドバイスですが、それは私の問題を解決しません。

さらに編集

そのため、デバッグをすると、$ current_userが常に設定されているわけではないことがわかりますが、その理由はわかりません。

他の編集

これをさらに調べてみると、クッキーと関係があるようです。 Wordpressの認証Cookieについて少し学んだところ、次のことに気付きました。 dBug(print_r()のきれいなバージョン)を使用して、私はPHPに従ってWordpress認証クッキーが存在しないと判断しました、それでも私がChromeインスペクタを開くとクッキーがそこに座っているのをはっきりと見ることができます。これをどうすればよいのかまだわかりませんが、誰かが私を正しい方向に向けることができるのであれば...

1
Ben Wainwright

テンプレートファイルにheaderを設定しないでください。これらはHTTPリクエスト自体の一部です。

あなたの問題について:

テンプレートを追加します(必要なファイルは何でも - 「テンプレート階層」を参照)。その上にget_header();などのようなデフォルトのものを含めます。制限部分については、以下を使用します。

if ( current_user_can( 'view_players_area' ) )
{
    // Code that you want to show to logged in users
    // with a capability of `view_players_area`
}
else
{
    # @link http://queryposts.com/function/wp_login_form/
    wp_login_form();
}
2
kaiser

ヘッダを設定した後はexit()が必要です(そしてwp_redirect()を使うことをお勧めします)。

テストされていませんが、以下がうまくいくはずです。 current_user_can()がうまくいかない場合は、まず競合を排除するために他のプラグインを無効にしてから、ユーザーが本当に必要なアクセス権を持っていることを確認します。

function redirect_restricted_areas( $query )
{

    //Determine if we're on the log-in page
    global $pagenow;
    $on_login_page = in_array( $pagenow, array( 'wp-login.php', 'wp-register.php' ) );

    //If we're on the front-end and the main query is restricted
    //redirect the user if they do not have permission.
    if ( !$on_login_page && !is_admin() && $query->is_main_query() )
    {
          if ( ! current_user_can( 'view_players_area' ) && (
               $query->is_singular ('player-page') ||
               $query->is_post_type_archive ('player-page')
          ) ) {

            $url = wp_login_url( "http://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]" );
            wp_redirect( $url );
            exit();
          }
    }

}
add_action ( 'pre_get_posts', 'redirect_restricted_areas' );
1
Stephen Harris

あなたのコードと一緒にファイルの一番上にこれを置く:

global $current_user;
if ( !$current_user->ID ) {
    get_currentuserinfo();
}
1
MaximOrlovsky

あなたは wp_redirect(); とhook after_setup_theme を使ってみることができます。この時点で任意の出力)。

早期の救済措置で、より管理しやすいコンディショナルを作成します。

これが私の推測です...

if(!function_exists('mbe_redirect_restricted_areas')){
    function mbe_redirect_restricted_areas(){

        // Determine login page status.
        global $pagenow;

        // Do nothing on login page.
        if(in_array($pagenow, array(
            'wp-login.php',
            'wp-register.php'
        )){
            return false;
        }

        // Do nothing in admin area.
        if(is_admin()){
            return false;
        }

        // Do nothing if user is logged in and has capability.
        if(is_user_logged_in() && current_user_can('view_players_area')){
            return false;
        }

        // Do nothing if not in player page area.
        if(stripos($_SERVER['REQUEST_URI'], 'player-page') === false){
            return false;
        }

        // Guests and users without capability.
        wp_redirect(wp_login_url("http://{$_SERVER['HTTP_Host']}{$_SERVER['REQUEST_URI']}"));
        exit;

    }
    add_action('after_setup_theme', 'mbe_redirect_restricted_areas');
}
0
Michael Ecklund