Вопрос или проблема
Успешный ответ AJAX не работает, но изменения сохраняются.
Я новичок в jQuery-Ajax, поэтому, пожалуйста, потерпите меня. Мой ответ Ajax, похоже, не загружается, но изменения сохраняются. Однако я получаю эту ошибку в admin-ajax.php “call_user_func() ожидает, что параметр 1 будет действительным обратным вызовом, функция ‘_update_post_ter_count’ не найдена или недействительное имя функции”. Вот моя функция, не могли бы вы подсказать, что я делаю не так?
add_action( 'wp_ajax_nopriv_save_sort', 'ccmanz_save_reorder' );
add_action('wp_ajax_save_sort','ccmanz_save_reorder');
function ccmanz_save_reorder() { //проверка
//проверка намерений пользователя
check_ajax_referer( 'wp-job-order', 'security' ); // это приходит из wp_localize_script() в hrm-jobs.php
//проверка возможности, чтобы обеспечить использование прав
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'У вас нет разрешения на доступ к этой странице.' ) );
}
$order = explode( ',', $_POST['order'] );
$counter = 0;
foreach ( $order as $item_id ) {
$post = array(
'ID' => (int) $item_id,
'menu_order' => $counter,
);
wp_update_post( $post );
$counter ++;
}
wp_send_json_success('ПОСТ СОХРАНЁН');
}
Мой AJAX вызов
jQuery(document).ready(function($) {
sortList = $( 'ul#custom-type-list' ); //хранить
var animation = $ ( '#loading-animation' );
var pageTitle = $ ( 'div h2');
sortList.sortable({
update: function ( event, ui) {
animation.show();
$.ajax({
url: ajaxurl, // ajaxurl определен WordPress и указывает на /wp-admin/admin-ajax.php
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data:{
action: 'save_sort', // Сообщите WordPress, как обрабатывать этот ajax запрос
order: sortList.sortable( 'toArray' ).toString(), // Передает ID элементов списка в формате 1,3,2
security: WP_JOB_LISTING.security
},
success: function( response ) {
animation.hide();
$('div.updated').remove();
if( true === response.success ) {
console.log(sortList.sortable( 'toArray' ));
pageTitle.after(
'<div id="messsage" class="updated"><p>' + WP_JOB_LISTING.success + '</p></div>'
);
} else {
$('div.error').remove();
pageTitle.after( '<div id="messsage" class="error"><p>' + WP_JOB_LISTING.failure + '</div>' );
}
},
error: function ( error ) {
$( 'div.error' ).remove();
animation.hide();
//pageTitle.after( '<div id="messsage" class="error"><p>' + WP_JOB_LISTING.failure + '</div>' );
}
});
}//обновление
}); //sortable
});//jquery
Я также новичок в jQuery AJAX, и всегда пробовал использовать $.ajax, но теперь я просто использую $.post для своих запросов, и они хорошо работают. Синтаксис проще и меньше риска сделать ошибку.
Очевидно, если я ошибаюсь в этом, пожалуйста, кто-то дайте мне знать об этом.
В $.post() вам нужно указать URL, переменные, которые будут переданы через POST в виде объекта, и функцию-обработчик (data, status). Вот и всё.
В PHP коде я просто выводил то, что хочу вернуть на свою страницу, и у меня были проблемы с кодировкой один или два раза, я решал проблемы с кодировкой в JS, а не в PHP.
Иногда я возвращаю числа из PHP echo, и использую оператор switch в JS, чтобы выполнить то, что хочу, в зависимости от возвращенного числа, это также решает некоторые проблемы.
Я знаю, что не решил вашу проблему, вместо этого я пытаюсь найти альтернативные способы, но дайте мне знать, если это помогает.
Всегда завершайте свои ajax действия wp_die:
add_action( 'wp_ajax_foobar', 'my_ajax_foobar_handler' );
function my_ajax_foobar_handler() {
// Создайте свой ответ и выведите его.
// Не забудьте остановить выполнение после этого.
wp_die();
}
_update_post_ter_count
не виден в фрагменте, который вы вставили, поэтому я не могу помочь с этим.
Проблема заключается в том, что WordPress пытается вызвать функцию _update_post_ter_count
, которая не существует. Эта ошибка, вероятно, возникает из-за хука, связанного с таксономией, который срабатывает, когда вы обновляете порядок постов.
Чтобы решить эту ошибку, вы можете проверить, есть ли в вашей теме или плагине опечатка или неопределенная функция. Также убедитесь, что любой код, связанный с таксономией или типом записи, правильно подключен, а функция _update_post_ter_count
либо исправлена, либо заменена на правильный обратный вызов.
Что касается AJAX
части, то ваша wp_send_json_success()
правильно структурирована, и процесс сохранения вроде бы работает нормально, поскольку изменения сохраняются. Проблема заключается в несоответствующих хуках или обратных вызовах внутри ядра WordPress или других плагинов, которые могут требовать внимания.
Ответ или решение
Проблема, с которой вы столкнулись, действительно связана с тем, что WordPress не может найти функцию _update_post_ter_count
. Это может происходить из-за того, что данная функция не определена или вы вызвали ее неправильно в стороннем плагине или теме. Прежде всего, стоит проверить код на наличие упоминаемой функции и убедиться, что она правильно подключена и доступна.
Ваш Ajax-запрос, судя по приведенному вами коду, работает корректно и изменения успешно сохраняются через функцию wp_update_post()
. Однако ошибка, которую вы видите, указывает на проблему в процессе, связанном с обновлением записей в базе данных, которая может происходить, например, при обновлении таксономии.
Решение проблемы:
-
Проверка функции
_update_post_ter_count
:- Убедитесь, что не используете функцию
_update_post_ter_count
в своем коде. Если к ней пытаются обратиться какие-то хуки (hooks), связанные с обновлением таксономий, то проверьте их на наличие ошибок. - Если эта функция действительно необходима, проверьте, корректно ли она подключена в вашем проекте или в стороннем плагине.
- Убедитесь, что не используете функцию
-
Добавление
wp_die()
:- В конце вашей функции
ccmanz_save_reorder()
разумно добавитьwp_die()
после вызоваwp_send_json_success()
. Это остановит выполнение и избавит от потенциальных проблем с экранированием.
wp_send_json_success('POST SAVED'); wp_die();
- В конце вашей функции
-
Убедитесь в правильности использования
wp_ajax
хуков:- Проверьте, что вы добавили действия для
wp_ajax_nopriv_save_sort
иwp_ajax_save_sort
правильно и что они оказываются доступны. Напоминаю, что если вы пытаетесь вызвать AJAX для незалогиненного пользователя, вам необходимо использоватьwp_ajax_nopriv_
.
- Проверьте, что вы добавили действия для
-
Использование
$.post
в jQuery:- Как упомянули другие участники обсуждения, использование
$.post
также может быть возможным вариантом, поскольку он предоставляет более простой способ отправки POST-запросов. Пример:
$.post(ajaxurl, { action: 'save_sort', order: sortList.sortable('toArray').toString(), security: WP_JOB_LISTING.security }, function(response) { // Обработка ответа }, 'json');
- Как упомянули другие участники обсуждения, использование
- Логирование ошибок:
- Посмотрите на логи ошибок вашего сервера. Это может дать более детальную информацию о том, что происходит во время выполнения запроса AJAX и может помочь уточнить причины ошибки, связанной с
_update_post_ter_count
.
- Посмотрите на логи ошибок вашего сервера. Это может дать более детальную информацию о том, что происходит во время выполнения запроса AJAX и может помочь уточнить причины ошибки, связанной с
Заключение:
Проблема, с которой вы столкнулись, на первый взгляд не связана непосредственно с вашим AJAX-запросом, а больше относится к конфликтам в коде, связанным с функциями обновления записей. Исправьте вызов функции _update_post_ter_count
, убедитесь в корректности использования хуков и, возможно, добавьте wp_die()
в конце вашей AJAX-функции для прекращения выполнения. Это должно помочь устранить вашу проблему.