WordPress, выполняющий ajax, всегда возвращает 0, но в некоторых случаях должен возвращать 1 - PullRequest
0 голосов
/ 05 декабря 2018

Я создал функцию AJAX в WordPress для своего плагина.В конструкции плагина я определяю обратный вызов AJAX:

public function __construct() {
    return $this->register();
}

/**
 * Register all new files in WooCommerce hooks
 */
public function register() {
    if ( is_user_logged_in() ) {
        add_action( 'wp_ajax_filter', array( $this, 'filter' ) );
    } else {
        add_action( 'wp_ajax_nopriv_filter', array( $this, 'filter' ) );
    }
}

Это функция jQuery, которая запускает вызов AJAX:

jQuery(document).ready(function () {
    jQuery(document).on('click', '.filter-menu li', function () {
        var filter_value = jQuery(this).find('.menu-data-inner');

            var data = {
                'action': 'filter',
                'filter': filter_value.attr('data-value'),
                'filter_status': 1
            };      

            var ajaxurl = "<?php echo admin_url( 'admin-ajax.php' ); ?>";

            jQuery.post(ajaxurl, data, function () {
                jQuery('#content-area').load(location.href + ' #content-area>*', '');
            });
        }
    });
});

В конце моего запросаЯ обновляю основной контент WordPress через AJAX и ожидаю, что моя функция в functions.php get пропущена из-за DOING_AJAX.


Это функция, которая вызывается по запросу AJAX:

/**
 * Filter
 */
public function filter() {
    require 'functions/filter.php';
    wp_die();
}

Это содержание запроса:

<?php error_log( $_POST['filter'] ); ?>

Итак, моя проблема в том, что я добавил эту функцию в свой functions.php:

add_action( 'init', 'do_something' );
function do_something() {
    error_log('INIT');
}

Но я очень быстро понял, что это вызывает проблему, потому что инициализация get также вызывается по запросу AJAX, но я этого не хочу.Он должен просто напечатать INIT, когда страница загружается, нажав F5 или введя URL сайта и нажав Enter.Поэтому я добавил проверку:

add_action( 'init', 'do_something' );
function do_something() {
    if ( ! wp_doing_ajax() ) {
        error_log('INIT')
    }
}

Но после повторного вызова AJAX журнал отладки тоже печатает INIT, но не должен.Поэтому я попытался изменить свою функцию, вызываемую во время AJAX, следующим образом:

<?php 
    error_log( $_POST['filter'] ); 

    define( 'DOING_AJAX', true ); ?>

Но это тоже не помогло.error_log все еще там.

Так в чем проблема?Что я тут не так делаю?Я имею в виду, я сделал это, как в DOCS, но кажется, что DOING_AJAX не работает для меня.

1 Ответ

0 голосов
/ 05 декабря 2018

вам нужно

add_action( 'wp_ajax_filter', array( $this, 'filter' ) );

за каждый раз, когда вы отправляете ajax-запрос, но это

add_action( 'wp_ajax_nopriv_filter', array( $this, 'filter' ) );

, когда вам нужен этот пользовательне вошли в систему, так что это изменится на:

public function register() {
    if ( is_user_logged_in() ) {
        add_action( 'wp_ajax_filter', array( $this, 'filter' ) );
    } else {
        add_action( 'wp_ajax_filter', array( $this, 'filter' ) );
        add_action( 'wp_ajax_nopriv_filter', array( $this, 'filter' ) );
    }
}

, поэтому вы получаете 0 за любой запрос, который я предполагаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...