Успешный ответ AJAX не работает, но изменения сохраняются.

Вопрос или проблема

Успешный ответ 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(). Однако ошибка, которую вы видите, указывает на проблему в процессе, связанном с обновлением записей в базе данных, которая может происходить, например, при обновлении таксономии.

Решение проблемы:

  1. Проверка функции _update_post_ter_count:

    • Убедитесь, что не используете функцию _update_post_ter_count в своем коде. Если к ней пытаются обратиться какие-то хуки (hooks), связанные с обновлением таксономий, то проверьте их на наличие ошибок.
    • Если эта функция действительно необходима, проверьте, корректно ли она подключена в вашем проекте или в стороннем плагине.
  2. Добавление wp_die():

    • В конце вашей функции ccmanz_save_reorder() разумно добавить wp_die() после вызова wp_send_json_success(). Это остановит выполнение и избавит от потенциальных проблем с экранированием.
    wp_send_json_success('POST SAVED');
    wp_die();
  3. Убедитесь в правильности использования wp_ajax хуков:

    • Проверьте, что вы добавили действия для wp_ajax_nopriv_save_sort и wp_ajax_save_sort правильно и что они оказываются доступны. Напоминаю, что если вы пытаетесь вызвать AJAX для незалогиненного пользователя, вам необходимо использовать wp_ajax_nopriv_.
  4. Использование $.post в jQuery:

    • Как упомянули другие участники обсуждения, использование $.post также может быть возможным вариантом, поскольку он предоставляет более простой способ отправки POST-запросов. Пример:
    $.post(ajaxurl, {
       action: 'save_sort',
       order: sortList.sortable('toArray').toString(),
       security: WP_JOB_LISTING.security
    }, function(response) {
       // Обработка ответа
    }, 'json');
  5. Логирование ошибок:
    • Посмотрите на логи ошибок вашего сервера. Это может дать более детальную информацию о том, что происходит во время выполнения запроса AJAX и может помочь уточнить причины ошибки, связанной с _update_post_ter_count.

Заключение:

Проблема, с которой вы столкнулись, на первый взгляд не связана непосредственно с вашим AJAX-запросом, а больше относится к конфликтам в коде, связанным с функциями обновления записей. Исправьте вызов функции _update_post_ter_count, убедитесь в корректности использования хуков и, возможно, добавьте wp_die() в конце вашей AJAX-функции для прекращения выполнения. Это должно помочь устранить вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...