我正在开发一个WordPress插件并尝试在其中使用wp_ajax
。
这是我的代码:
function register_role_category_access() {
wp_enqueue_script( 'role_category_access', plugin_dir_url( __FILE__ ) . 'js/category-restrict.js', array( 'jquery' ), '1.0.0', true );
wp_localize_script( 'role_category_access', 'category_access_ajax_url', array(
'url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'role_access_nonce' )
) );
}
add_action( 'admin_enqueue_scripts', array( $this, 'register_role_category_access' ) );
function update_role_category_access() {
$user_role = isset( $_POST[ 'user_role' ] ) ? $_POST[ 'user_role' ] : 'Not defined';
$selected_cats = isset( $_POST[ 'selected_cats' ] ) ? $_POST[ 'selected_cats' ] : 'None selected';
echo "Chosen role: " . $user_role . ' and categories are ' . $selected_cats;
die();
}
add_action( 'wp_ajax_category_access', array( $this, 'update_role_category_access' ) );
由于上述操作只能在管理员面板上完成,因此我没有使用wp_ajax_nopriv_*
挂钩。
JavaScript文件内容(category-restrict.js
):
function updateAccess( obj ) {
var selectedCatIds = "";
var accessBox = jQuery( obj ).closest( '.access-box' );
var roleSlug = jQuery( accessBox ).find(".hidden_role").attr("value");
var catList = jQuery( obj ).closest( '.access-box' ).find( '.category-list' );
jQuery( catList ).children().each( function() {
if( jQuery(this).is(":checked") ) {
selectedCatIds += jQuery(this).val() + ",";
}
});
var idLen = selectedCatIds.length;
if( idLen > 0 ) {
selectedCatIds = selectedCatIds.substring(0, idLen - 1);
}
jQuery.ajax({
type: 'POST',
url: category_access_ajax_url, //wp_localize_script: 844
data: {
action: 'category_access', //wp_ajax_category_access: 71
user_role: roleSlug,
selected_cats: selectedCatIds,
},
success: function( result ) {
alert( result );
}
});
}
但是当我调用脚本时,我在控制台中收到以下错误:
http://album.multibaselocal.com/wp-admin/[object%20Object]
404(不是 实测值)
我调查了this,但由于我对WordPress的了解仍然有限,因此无法理解我做了什么错误。
答案 0 :(得分:2)
AJAX通话中的url
参数错误。 category_access_ajax_url
是一个包含url
和nonce
的JS对象,因此您的代码应该是这样的:
jQuery.ajax({
type: 'POST',
url: category_access_ajax_url.url, // access the url property inside category_access_ajax_url
data: {
action: 'category_access',
user_role: roleSlug,
selected_cats: selectedCatIds,
},
success: function( result ) {
alert( result );
}
});
我建议将category_access_ajax_url
重命名为category_access_ajax
以避免混淆。
更新:您真的不需要category_access_ajax_url.url
,因为WordPress defines a global variable called ajaxurl
in the admin area可以用于此目的。