WP_AJAX声明对前端造成混淆

时间:2019-06-22 作者:J.BizMai

我有点困惑。我想为前端声明一个wp-ajax函数。我遵循了文档this page 其中写道:

注2:前端和后端Ajax请求都使用admin Ajax。php so is_admin()在操作处理代码中总是返回true。当有选择地为前端和后端加载Ajax脚本处理程序,并使用is\\u admin()函数时,your wp_ajax_(action) and wp_ajax_nopriv_(action) hooks MUST be inside the is_admin() === true part.

绑定到wp\\u Ajax\\ux或wp\\u Ajax\\u nopriv\\ux操作的Ajax请求在wp Admin上下文中执行。请仔细检查您在代码中执行的操作,因为未经授权的用户或访问者将能够触发具有提升权限的请求,而这些请求可能未经授权。

但是如果我在前端,用一个is_admin() 检查,如何执行?我是说is_admin() 就是检查你是否在管理中,这样它就会返回false,这样里面的代码就不会在前端执行,不是吗?

if ( is_admin() ) { //<-- Executed on front-end page as well ?
    add_action( \'wp_ajax_my_frontend_action\', \'my_frontend_action\' );
    add_action( \'wp_ajax_nopriv_my_frontend_action\', \'my_frontend_action\' );
    add_action( \'wp_ajax_my_backend_action\', \'my_backend_action\' );
    // Add other back-end action hooks here
} else {
    // Add non-Ajax front-end action hooks here
}
有人能启发我吗?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

我的意思是is\\u admin()是检查您是否在管理中,因此它将返回false,这样内部的代码就不会在前端执行,不是吗?

使用此方法发送AJAX请求时,您将其发送到wp-admin/admin-ajax.php, 它位于管理中。这在您引用的文本中进行了解释:

前端和后端Ajax请求都使用管理Ajax。php so is\\u admin()在操作处理代码中始终返回true。

AJAX请求是从哪里发送的并不重要。当发出请求时,它是一个与加载您所在页面的原始前端请求完全不同的请求。这是对WordPress管理员的新请求。

需要记住的重要一点是,AJAX请求实际上只是在后台打开网页的JavaScript。因此,这与打开/wp-admin/admin-ajax是一样的。php在新选项卡中。如果你那样做了is_admin() 是真的,这就是为什么当您使用JavaScript发出请求时仍然是真的。

另一件要记住的事是add_action() 调用队列功能以仅针对当前请求运行。那些add_action() 每次加载页面时都会运行调用,为页面加载的其余部分做好准备。当您用代码加载前端页面时,它会排队my_frontend_action() 如果当前请求是AJAX请求,但不是,则运行,因此不会发生任何事情。对于稍后从该页面发出的AJAX请求,不会存储或记住任何内容。

当发出AJAX请求时,会再次检查此条件,但是add_action() 从不运行,因为is_admin() 是真的,所以什么都没有发生,因为add_action() 来自前端的请求没有被存储或记住,这次也不会触发。

相关推荐

WP_LOCALIZE_SCRIPT不能处理AJAX响应

当一个文件上传到我的页面时,我会调用ajax在数据库中添加一个条目。然后,我想使用wp\\u localize\\u script将一个字符串发送回客户端,但当我尝试访问它时,只会收到一个错误:“未捕获引用错误:pw\\u script\\u vars未定义”。我知道我可以用wp\\u die发回一些东西,但这是一个小问题,我认为这不是正确的方法。所以问题是为什么wp\\u localize\\u脚本不起作用?感谢您的帮助。剧本js公司:var ajaxurl = \"<?php echo admi