it-swarm.com.de

current_user_can funktioniert nicht immer richtig

Ich habe ein benutzerdefiniertes Wordpress-Thema, das einen Abschnitt nur für Mitglieder enthält. Um dies zu implementieren, habe ich den folgenden Code am oberen Rand meiner eingeschränkten Seiten.

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

Meistens funktioniert dies einwandfrei, jedoch funktioniert es von Zeit zu Zeit aus KEINEM Grund. Keine Fehlermeldung, nur wenn Sie sich anmelden, wird kontinuierlich zur Anmeldeseite zurückgeleitet. Ich habe ursprünglich is_user_logged_in() verwendet und hatte ein ähnliches Problem, weshalb ich diesen Code verwendet habe.

Wenn jemand irgendwelche Vorschläge hat, was dies verursachen könnte, bin ich äußerst dankbar - dies hat mich dazu gebracht, mir die Haare auszureißen, da der Mitgliederbereich in den nächsten Wochen online gehen muss.

Grüße

Ben

Bearbeiten

Nach den Ratschlägen von Antworten und einigen Benutzern im Chatroom habe ich meinen Code so geändert, dass die Weiterleitung in der Vorlage nicht erfolgt. Jetzt in einem functions.php include habe ich folgendes:

<?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' );

Obwohl dies ein guter Rat ist, der meinen Code einfacher macht, löst er leider nicht mein Problem.

Weitere Bearbeitung

Mit einigem Debuggen sehe ich also, dass $ current_user nicht immer gesetzt ist, aber ich habe keine Ahnung warum.

Noch ein Edit

Dies weiter zu untersuchen, scheint etwas mit den Cookies zu tun zu haben. Nachdem ich etwas über die Wordpress-Authentifizierungscookies erfahren hatte, bemerkte ich Folgendes. Mit dBug (eine hübschere Version von print_r()) habe ich festgestellt, dass laut PHP das Wordpress-Authentifizierungs-Cookie nicht existiert. Wenn ich jedoch Chrome Inspector öffne, kann ich das Cookie deutlich sehen. Ich bin mir noch nicht ganz sicher, was ich davon halten soll, aber wenn jemand in der Lage ist, mich in die richtige Richtung zu lenken ...

1
Ben Wainwright

Legen Sie header nicht in einer Vorlagendatei fest. Diese sind Teil der HTTP-Anfrage.

Über Ihr Problem:

Fügen Sie eine Vorlage hinzu (welche Datei auch immer Sie benötigen - siehe "Vorlagenhierarchie"). Darüber hinaus enthalten Sie die Standardeinstellungen wie get_header(); und so weiter. Für den eingeschränkten Teil verwenden Sie Folgendes:

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

Sie müssen exit(), nachdem Sie den Header gesetzt haben (und ich würde empfehlen, wp_redirect() zu verwenden).

Ungetestet, aber das Folgende sollte funktionieren. Wenn es wirklich so ist, dass current_user_can() nicht funktioniert, deaktiviere ich zuerst alle anderen Plug-Ins, um einen Konflikt auszuschließen, und überprüfe dann, ob der Benutzer wirklich die Berechtigungen hat, die Sie für erforderlich halten.

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

Fügen Sie dies mit Ihrem Code oben in die Datei ein:

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

Sie können versuchen, mit wp_redirect(); und dem Hook after_setup_theme (sollte nicht sein Ausgabe an dieser Stelle).

Schaffen Sie besser handhabbare Bedingungen mit frühen Rettungsaktionen.

Hier ist meine Meinung dazu, denke ich ...

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