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 шт):

Автор решения: KAGG Design

Функция 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 );
    }
}
→ Ссылка