Обновление профиля пользователя с помощью AJAX не работает


Я пытаюсь настроить некоторые пользовательские функции пользовательского интерфейса и использую AJAX, чтобы пользователи могли редактировать свой профиль. Это мой первый раз, когда я настраиваю AJAX на WP, и я чувствую, что я так близко! Я проверил множество других форумов и, похоже, не мог понять, где я сейчас нахожусь. Любой совет поможет!

У меня есть дочерняя тема, настроенная с помощью шаблона профиля пользователя, настроенного с помощью формы. Затем у меня есть файл js для обработки AJAX с помощью jQuery. Затем я поставил в очередь и локализовал мой сценарий в functions.php а также настроить действие обратного вызова в functions.php . Я думаю, что с моим обратным звонком что-то не так. У меня есть код, вставленный ниже.

ФОРМА:

<form id="user-profile-frontend">

    <label>
        <span>Email:</span>
        <input type="text" name="email" id="email-val" value="<?php echo $current_user->user_email ?>" />
    </label>

    <label>
        <span>First Name:</span>
        <input type="text" name="first-name" id="first-name" value="<?php echo $current_user->user_firstname ?>" />
    </label>

    <label>
        <span>Last Name:</span>
        <input type="text" name="last-name" id="last-name" value="<?php echo $current_user->user_lastname ?>" />
    </label>

    <label>
        <span>Display Name:</span>
        <input type="text" name="display-name" id="display-name" value="<?php echo $current_user->display_name ?>" />
    </label>

    <input type="submit" value="Update Profile" />
</form>

Файл jQuery AJAX JavaScript

jQuery('document').ready(function(){

    jQuery('#user-profile-frontend').submit(function(e){

        e.preventDefault();

        var user_meta_val = jQuery( '#first-name' ).val();
        var user_meta_key = jQuery( '#first-name' ).attr('id');

        if ( jQuery('user_meta_val') ) {
            jQuery.ajax ({
                url: user_meta_ajax.ajaxurl,
                type: 'POST',
                data: {
                    action: 'user_meta_callback',
                    'user_meta_val': user_meta_val,
                    'user_meta_key': user_meta_key
                }
            })
            .success( function(results) {
                console.log( 'User Meta Updated' );
            })
            .fail ( function(data) {
                console.log( data.responseText );
                console.log( 'Request Failed' + data.statusText );
            })
        } else {
            console.log( 'Uh oh. User error message' );
        }

        return false;
    });

});

Functions.php действия

function user_profile_enqueue() {

    // Register script for localization
    wp_register_script ( 
        'user-profile-mod',
        get_stylesheet_directory_uri() . '/js/user-profile-mod.js',
        array( 'jquery' ),
        '1.0',
        true
    );

    // Localize script so we can use $ajax_url
    wp_localize_script (
        'user-profile-mod',
        'user_meta_ajax',
        array(
            'ajaxurl'   => admin_url( 'admin-ajax.php' )
        )
    );

    // Enqueue script
    wp_enqueue_script( 'user-profile-mod' );
}
add_action( 'wp_enqueue_scripts', 'user_profile_enqueue' );

function user_meta_callback() {

    if ( !isset( $_POST) || empty($_POST) || !is_user_logged_in() ) {
        header( 'HTTP/1.1 400 Empty POST Values' );
        echo 'Could not verify POST values';
        exit;
    }

    $user_id = get_current_user_id();
    $user_meta_key = sanitize_text_field( $_POST['user_meta_key'] );
    $user_meta_val = sanitize_text_field( $_POST['user_meta_val'] );

    // Update single meta value
    update_user_meta( $user_id, $user_meta_key, $user_meta_val );

    // if (is_wp_error($user_id)) {
    //    echo $user_id->get_error_message();
    // }
    // else {
    //    echo 'Field updated!';
    // }

    exit;
}
add_action( 'wp_ajax_user_meta_callback', 'user_meta_callback' );
add_action( 'wp_ajax_nopriv_user_meta_callback', 'user_meta_callback' );

Сейчас я просто пытаюсь заставить его работать с одним, затем я буду использовать wp_update_user для обновления объекта пользователя при отправке.

Что я сделал до сих пор, чтобы попробуйте диагностировать проблему: Консоль Chrome не выдает никаких ошибок JS. Когда я отправляю форму, я получаю сообщение об успешном выполнении от jQuery с надписью "Мета пользователя обновлена", но я обновляю страницу и/или проверяю профиль на панели мониторинга, и данные не изменились.

Сайт разработчика размещен на движке WP и использует журнал для отладки на их конце, на данный момент у меня нет ошибок. Единственная ошибка, которая у меня была, заключалась в обработке ошибки is_wp_error, поэтому я просто прокомментировал ее. Я не сосредоточен на этом прямо сейчас.

Я не думаю, что это влияет на функцию обратного вызова.

Заранее благодарю вас.

Author: Dylan Wagner, 2017-07-26

1 answers

Все это работает, насколько я могу судить. В будущем, возможно, будет проще отлаживать вещи с помощью PHP error_log() для записи в debug.log в определенных точках, например, внутри вашего обратного вызова ajax.

Если вы хотите запустить этот ajax только для зарегистрированных пользователей, вы можете отказаться от крючка wp_ajax_nopriv и условного is_user_logged_in() и просто придерживаться крючка wp_ajax_*. wp_ajax_nopriv - это "Без привилегий", что означает, что он будет работать для пользователей, не вошедших в систему. Обычная функция wp_ajax будет выполняться только для вошедших в систему пользователи.

Основная проблема заключается в том, что ваши ключи не соответствуют ключам WordPress usermeta. Вы захватываете идентификатор ввода, который равен first-name, но WordPress ожидает first_name в качестве метакея. Держу пари, если бы вы проверили таблицу uusermeta в своих базах данных, вы бы увидели пару экземпляров first-name в качестве метакея.

 1
Author: Howdy_McGee, 2017-07-26 18:22:06