PHP 8.1 - ошибка в строчке с двумя массивами "Automatic conversion"
Решил обновиться до PHP 8.1, большинство предупреждений пофиксил, но не по силам массивы.
<?php
add_action( 'init', 'update_status' );
add_action( 'admin_init', 'update_status' );
function update_status() {
// Получаем активных пользователей из transient.
$get_users = get_transient( 'get_users' );
// Получаем данные текущего пользователя.
$current_user = wp_get_current_user();
// Обновим пользователя, если его нет в списке или если он не был на сайте в течение последних 60 секунд.
if ( ! isset( $get_users[ $current_user->ID ]['last'] ) || $get_users[ $current_user->ID ]['last'] <= time() - 60 ) {
$get_users[ $current_user->ID ] = [
'id' => $current_user->ID,
'username' => $current_user->user_login,
'last' => time(),
];
// Установим для этого transient на срок действия 1 минуту после его создания.
set_transient( 'get_users', $get_users, 1 * MINUTE_IN_SECONDS );
}
}
?>
Проблемная строчка: $get_users[ $current_user->ID ] = [... Выходит с ошибкой: Deprecated: Automatic conversion of false to array is deprecated
Помогите исправить, даже не представляю больше, что можно сделать.
Ответы (1 шт):
Функция get_transient
возращает false, если транзинт не существует.
Когда запрос идёт на фронте и пользователь не залогинен, то ID = 0, а поле user_login вообще не существует в объекте, и это ещё одна ошибка.
Ну и 1 *
писать бессмысленно.
Такой код не выдаёт ошибок при статическом анализе (phpcs, EA, PhpStorm inspections) и не выбрасывает deprecated error при выполнении.
<?php
add_action( 'init', 'update_status' );
add_action( 'admin_init', 'update_status' );
function update_status() {
// Получаем активных пользователей из transient.
$get_users = get_transient( 'get_users' );
$get_users = is_array( $get_users ) ? $get_users : [];
// Получаем данные текущего пользователя.
$current_user = wp_get_current_user();
$user_id = $current_user->ID ?? 0;
$user_login = $current_user->user_login ?? '';
// Обновим пользователя, если его нет в списке или если он не был на сайте в течение последних 60 секунд.
if ( ! isset( $get_users[ $user_id ]['last'] ) || $get_users[ $user_id ]['last'] <= time() - 60 ) {
$get_users[ $user_id ] = [
'id' => $user_id,
'username' => $user_login,
'last' => time(),
];
// Установим для этого transient на срок действия 1 минуту после его создания.
set_transient( 'get_users', $get_users, MINUTE_IN_SECONDS );
}
}