WordPress做ajax总是返回0,但在某些情况下应该返回1

时间:2018-12-05 13:46:10

标签: php jquery ajax wordpress

我已经在WordPress中为我的插件创建了一个AJAX函数。在插件构造中,我定义了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' ) );
    }
}

这是触发AJAX调用的jQuery函数:

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>*', '');
            });
        }
    });
});

在请求结束时,我通过AJAX刷新了WordPress主要内容,并希望在这里functions.php中的功能由于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');
}

但是我很快就看到了这会导致问题,因为init get也被AJAX请求调用了,但是我不希望这样。当通过按INIT或输入站点URL加载页面时,它应该仅打印F5。所以我加了一张支票:

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 :(得分:0)

您需要

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的原因