我已经在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对我不起作用。
答案 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的原因