Переменные объекта Wordpress wp_user не загружаются при попытке обновления столбца MySQLi - PullRequest
0 голосов
/ 23 января 2020

Когда пользователь входит в систему, мне нужно изменить целое число в таблице на моей базе данных. По какой-то причине переменные в объекте wp_user пусты, и в таблице ничего не обновляется. Если я отправляю запрос на тестовую страницу, все отображается правильно. Вот мой точный код:

function mv_update_notification_data() {
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $current_user = wp_get_current_user();
    $user_id = $current_user->ID;
    $user_email = $current_user->user_email;
    $user_facility = get_user_meta( $user_id, 'user_facility',  true );
    $username = $current_user->user_login;

    if ( $username == $user_facility . 'DOC' ){
        $conn->query("UPDATE db SET doc_notified = 1 WHERE facility = '$user_facility'");
    }
}
add_action('wp_login', 'mv_update_notification_data');

Если пользователь входит в систему и имеет имя пользователя «testDO C», а для $user_facility для этого пользователя установлено значение «test», столбец doc_notified в таблице должно измениться на 1, но это не так.

Запрос запускается, если я не вложил его в условие.

1 Ответ

0 голосов
/ 24 января 2020

Есть ли какая-то особая причина, по которой вы создаете свое собственное соединение и обработчик mysqli? Поскольку вы используете WordPress, у вас есть доступ к классу $wpdb, который значительно проще использовать с меньшими настройками и без необходимости заботиться о санации значений, и т. Д. c. (если вы не используете один из методов, выполняющих строгий запрос SQL, и в этот момент вы захотите использовать $wpdb::prepare())

Если вам НУЖНО использовать ваше собственное соединение с mysqli, не стесняйтесь заменить функцию обновления $ wpdb-> на ваш запрос ниже - но, как сказал @Dharman, вам нужно использовать подготовленные параматеризованные операторы, в противном случае вы открыты для SQL Инъекции .

Тем не менее проблема заключается в том, что хук wp_login не срабатывает достаточно поздно, чтобы иметь надлежащий доступ к wp_get_current_user() function.

Если вы посмотрите документы для хука wp_login, вы увидите, что у него есть 2 аргумента, $user_login и $user, эти дать вам доступ к имени пользователя и WP_User объекту соответственно.

Для того, чтобы эти аргументы были доступны в области видимости вашей функции, вы должны указать этому хуку, сколько аргументов принимать при звонке add_action(). Значение по умолчанию: 1.

. Этот код, приведенный ниже, должен работать после изменения имени таблицы. Вы заметите, что я использую метод $wpdb::update(). Этот метод позволяет вам вызывать $wpdb::prepare(), поэтому вам не нужно больше беспокоиться о очистке этого значения - , но никогда не бывает плохой идеей данные, которые вы проверяете, имеют формат, который вы ожидаете! . Я не включил ничего подобного, но вы можете запустить это значение с помощью некоторых функций WP Sanitization / Escaping и / или PHP filter_var , если вы используете sh .

add_action( 'wp_login', 'mv_update_notification_data', 99, 2 ); // Later priority, and pass 2 args)
function mv_update_notification_data( $user_login, $user ){
    global $wpdb; // Give this function access to the `$wpdb` class

    $user_facility = get_user_meta( $user->ID, 'user_facility', true );

    if( $user_login == $user_facility . 'DOC' ){
        $result = $wpdb->update(
            $YOUR_TABLE_NAME,
            array(
                'doc_notified' => 1
            ),
            array(
                'facility' => $user_facility
            ),
            array(
                '%d'
            ),
            array(
                '%s'
            )
        );

        // Do something with `$result` (returns: [int|false])
    }
}

РЕДАКТИРОВАТЬ:

Если (по какой-то причине) вы хотите использовать строгий запрос вместо $wpdb->update(), вы можете использовать $wpdb::query() метод. Для простых вставок / обновлений встроенных функций stati c достаточно , обычно , но для того, чтобы увидеть, как $wpdb обрабатывает SQL запросов, вы можете заменить всю функцию $wpdb->update(); выше со следующим:

$sql = "UPDATE db SET doc_notified = 1 WHERE facility = %s";
$args = array( $user_facility );

$result = $wpdb->query( $wpdb->prepare( $sql, $args ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...