Я работаю в WordPress, пытаясь использовать запрос ajax для извлечения пользовательских данных путем передачи идентификатора пользователя.
Я вижу, что идентификатор пользователя отправляется правильно через AJAX POST, но я получаю внутреннее сообщение об ошибке, и я не знаю, почему.
Сначала я подумал, что это связано с тем, что я пытался получить некоторые пользовательские поля, которые я добавил в профиль пользователя, но даже когда я упростил свой сценарий, я все еще получаю сообщение об ошибке.
Любая помощь высоко ценится!
Внешний интерфейс
$('.author').click(function() { var id = $(this).attr('id'); var temp = id.split('-'); id = temp[1]; $.ajax({ type: 'POST', url: 'wp-content/themes/twentyeleven/author_info.php', data: {id: id}, dataType: 'html', success: function(data) { $('#author-bio').html(data); } }); return false; });
author_info.php
$user_id = $_POST['id']; $forename = get_the_author_meta('user_firstname', $user_id); $output = $user_id; echo $output;
Сообщение об ошибке
500 (Internal Server Error) jquery.min.js:4
Матье добавил взломанный подход к перехвату запроса и перенаправлению, что хорошо. Я предпочитаю строить ответы AJAX, которые возвращают массивы json_encoded
.
$('.author').click(function() { var id = $(this).attr('id'); var temp = id.split('-'); id = temp[1]; $.ajax({ url: 'http://absolute.path/wp-admin/admin-ajax.php', data: {'action' : 'ajax_request', 'fn': 'getAuthorMeta', 'id': id}, dataType: 'json', success: function(data) { //We expect a JSON encoded array here, not an HTML template. } }); return false; });
Теперь мы создаем функцию для обработки наших запросов ajax.
Во-первых, нам нужно определить наш метод add_action ajax ->
add_action('wp_ajax_nopriv_ajax_request', 'ajax_handle_request'); add_action('wp_ajax_ajax_request', 'ajax_handle_request');
Нам нужно использовать обе строки add_action
. Я не пойму, почему. Здесь вы увидите _ajax_request
. Это «действие», которое мы отправили в наших data: {'action' : 'ajax_request'}
функции AJAX data: {'action' : 'ajax_request'}
. Мы используем этот крючок для проверки нашего запроса AJAX, это может быть все, что вы хотите.
Затем нам нужно будет создать или использовать ajax_handle_request
.
function ajax_handle_request(){ switch($_REQUEST['fn']){ case 'getAuthorMeta': $output = ajax_get_author_meta($_REQUEST['id']); break; default: $output = 'That is not a valid FN parameter. Please check your string and try again'; break; } $output = json_encode($output); if(is_array($output)){ return $output; }else{ echo $output; } }
Теперь давайте построим нашу функцию, чтобы на самом деле получить мета-автора.
function ajax_get_author_meta($id){ $theMeta = get_the_author_meta([meta_option], $id); return $theMeta; }
Где [meta_option] – поле, предоставленное функцией get_the_author_meta WP .
На этом этапе мы вернемся к нашему success:function(data)
и (данные) – это ссылка на возвращаемый нами массив json_encoded
. Теперь мы можем перебирать объект, чтобы получить наши поля и выводить их на страницу по вашему желанию.
Я бы рекомендовал вам использовать метод действия WP AJAX .
Как и в вашем случае, добавьте следующее в файл functions.php.
add_action('wp_ajax_get_user_info', 'ajax_get_user_info'); add_action('wp_ajax_nopriv_get_user_info', 'ajax_get_user_info'); function ajax_get_user_info() { //Handle request then generate response using WP_Ajax_Response or your html. }
затем в теге javascript.
$('.author').click(function() { var id = $(this).attr('id'); var temp = id.split('-'); id = temp[1]; jQuery.post( ajaxurl, /* if you get error of undefined ajaxurl. set it to "http://example.com/wordpress/wp-admin/admin-ajax.php"*/ { 'action':'get_user_info', 'user_id':id }, function(response){ alert('The server responded: ' + response); } ); });
Я бы рекомендовал вам прочитать 5 советов по использованию AJAX в WordPress .
пс; Код выше не проверен, он может иметь ошибки. Но ты получил идею.
Вы не находитесь в POST в тот момент, потому что вы вызываете определенную страницу своего шаблона, которая, вероятно, не соответствует какой-либо статье в вашем блоге.
Вместо этого создайте pluggin, который сделает это:
add_action('template_redirect', 'my_author_meta_intercept'); function my_author_meta_intercept(){ if(isset($_POST['getAuthorMeta'])){ echo get_the_author_meta('user_firstname', $_POST['getAuthorMeta']); exit(); } }
Это приведет к короткому замыканию запроса на ту же страницу, что и раньше, когда вы вызываете его, используя:
http://mysite/mycurrenturl?getAuthorMeta=testMetaKey
Поэтому вызов этого сообщения обычно возвращает статью как обычно, но если вы перейдете? GetAuthorMeta, она остановит выбор шаблона и просто вернет точный контент, который вы хотите вернуть.
На вашей странице вам просто нужно изменить свой javascript, чтобы:
$('.author').click(function() { var id = $(this).attr('id'); var temp = id.split('-'); id = temp[1]; $.ajax({ type: 'POST', url: window.location.href, data: {getAuthorMeta: id}, success: function(data) { $('#author-bio').html(data); } }); return false; });
Просто убедитесь, что вы адаптируете концепцию к тому, что вам нужно!