web-dev-qa-db-ja.com

wp_logoutアクションが機能しない

ユーザーが特にWebサイトからログアウトするときに、永続的なログインを制御するために設定されているCookieを削除しようとしています。

私はそれが同じくらい簡単だろうと思いました:

function remove_user_cookie() {

    unset($_COOKIE['woai']);
    unset($_COOKIE['woak']);

}
add_action('wp_logout', 'remove_user_cookie');

私も試してみました:

function remove_user_cookie() {

    if( $_GET['action'] == 'logout' ) :

        unset($_COOKIE['woai']);
        unset($_COOKIE['woak']);

    endif;

}
add_action('wp_logout', 'remove_user_cookie');

ただし、ユーザーのCookieはそのまま残り、自動的に再度ログインします。

Wp_logoutアクションが正しく機能しないのか、それともユーザーを自動的にログインさせる私のコードと衝突するのかはわかりません。

今、私はこれをheader.phpに書いています:

<?php if( !is_user_logged_in() ) :

    // check if user has cookies
    if ( isset($_COOKIE['woai']) && isset($_COOKIE['woak']) ) :

        $args = array(
            'meta_key' => 'login_key',
            'meta_value' => $_COOKIE['woak'],
            'meta_compare' => '=',
            'fields' => 'ID',
            'include' => $_COOKIE['woai']
        );
        $user_query = new WP_User_Query($args);

        if( $user_query->results[0] != '' || $user_query->results[0] != NULL ) :

            // get user id and login name
            $user_id = $user_query->results[0];
            $user_login = get_user_by( 'id', $user_id );

            // log the user in
            wp_set_current_user( $user_id, $user_login->user_login );
            wp_set_auth_cookie( $user_id );

            do_action( 'wp_login', $user_login->user_login );

        endif;

    endif; // end if cookies

endif; ?>

そしてユーザーがログインすると、彼らはこれで設定された新しいキーを取得します。

function set_user_cookie($user_login) {

    // if they have cookies, delete them
    if ( isset($_COOKIE['woai']) && isset($_COOKIE['woak']) ) :
        unset($_COOKIE['woai']);
        unset($_COOKIE['woak']);
    endif;

    $user_id = get_user_by( 'login', $user_login );

    // generate new key for user
    $salt = wp_generate_password(20); // 20 character "random" string
    $key = sha1($salt . $email . uniqid(time(), true));

    // set new cookies
    setcookie("woai", $user_id->ID, time()+31536000);  /* expire in 1 year */
    setcookie("woak", $key, time()+31536000);  /* expire in 1 year */

    // update the db
    update_field('field_53c3de9cd031e', $key, 'user_'.$user_id->ID.'');

}
add_action('wp_login', 'set_user_cookie', 10, 1);
3
lukeseager

以下のコードを試してください

function remove_user_cookie() {

setcookie("woak");
setcookie("woai");

}
add_action('wp_logout', 'remove_user_cookie');

なぜあなたはいくつかの値を保存するためにクッキーを使用しますか?セッションを使用することをお勧めします

1
TBI Infotech

(私は私のクライアントのための永続的なログイン、2つのワードプレスベースのサイトのためのprestashopと3つのカスタムphpアプリケーションのログインを作成しました)私は同じ挑戦をしました、しかし、これは私がそれを解決した方法です。

最初の一歩

add_action('wp_logout', 'doMyLogoutCall');
add_action('init', 'runInitLogoutProcess');

第二段階

function doMyLogoutCall()
{?>
 <img style="display:none" src="<?php echo home_url();
    ?>?loadwordpressbyimage=1">
<?php
}

function runInitLogoutProcess()
{
  // check if wordpress action is set to logout and clear cookie
  if (isset($_GET)) {
        if (isset($_GET['action'])) {
            if ($_GET['action'] == 'logout') {
                setcookie('woai', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false);
               setcookie('woak', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false);
            }
        }

  // check if your wp_logout hook is called and do the same.
      if (isset($_GET['loadwordpressbyimage'])) {
            if ($_GET['loadwordpressbyimage'] == 1) {
                setcookie('woak', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false);
               setcookie('woai', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false);
            }
        }


} 

//それでおしまい。

0
De Paragon