ログイン後にCookieが設定されている場合にのみユーザーが自分のプロファイルにアクセスでき、最大3つのCookieしか設定できないようなサイトに、一種の安全メカニズムを追加するよう求められました。私はデータベースにクッキーを保存するためのテーブルを作成したので、それらをカウントすることができます。
WordPressがどのように機能するのかはよくわかりませんが、テーマのfunctions.php
ファイルを編集してwp_login
を使用してアクションを追加する必要があることがわかりました。私はfunctions.php
ファイルを編集し、アクションを追加し、ユーザーIDを要求しました、そしてそれは0
を返します。私はこれがwp_get_current_user
がどのように機能することになっているかを知っています、誰もログインしていなければ0
を返します。しかし、ユーザISはログインしましたが、それでもIDを返しません。これがコードです:
add_action( 'wp_login', 'login_cookie' );
function login_cookie() {
global $wpdb;
$user = wp_get_current_user();
//Get current user
$id = $user->ID;
if(!isset($_COOKIE['userCookie'])) {
// Query the database to see how many cookies they have used
$cookie_count = $wpdb->get_var("SELECT COUNT(*) FROM wp_cookies WHERE user_id=".$id."");
// If the returned value is bigger or equal to 3 than the user cannot login
// they will be logged out, and redirected
if($cookie_count >= 3) {
wp_logout();
wp_redirect("");
}
//Else they can login and they recieve a new cookie, which will get inserted into the database
else {
$value = password_hash($id,PASSWORD_DEFAULT);
setcookie('userCookie', $value, time()+360000*24*100, "", "",false);
$wpdb->insert(
"wp_cookies",
[ 'user_id'=>$id, 'cookie_value'=>$value ],
[ '%d', '%s' ]
);
}
}
}
また、これは管理者ではなく通常のユーザーにのみ影響するはずです。そのためのアイデアはありますか?
wp_login
フックは、$user->user_login
(文字列)と$user
(WP_User)の2つのパラメータへのアクセスを提供します。それらをあなたの関数に渡すには、優先度(デフォルトは10)を追加し、add_action()呼び出しから2つの引数を要求する必要があります。
function login_cookie($user_login, $user) {
global $wpdb;
var_dump($user); // get WP_User object
//Get current user ID
$id = $user->ID;
.....
}
add_action( 'wp_login', 'login_cookie', 10, 2 );
実際にはwp_login
フックはそのパラメータでユーザオブジェクトを渡しています。
function login_cookie( $user_login, $user ) {
$user_id = $user->ID; // get user id
// your next code
}
add_action( 'wp_login', 'login_cookie', 10, 2 );