Обновление профиля пользователя с помощью 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, поэтому я просто прокомментировал ее. Я не сосредоточен на этом прямо сейчас.
Я не думаю, что это влияет на функцию обратного вызова.
Заранее благодарю вас.
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
в качестве метакея.