我不确定这样做是否滥用了WordPress和Ajax,但是WP and Ajax Codex a以及Plugin Development with Ajax 似乎不是很有帮助。我创建了以下Ajax情况:
(function($){
$(document).ready(function(){
$(\'a\').click(function(e){
var el = $(this).prev(\'input[type="checkbox"]\');
if(el.is(\':checked\')){
el.prop(\'checked\',false);
}
$.ajax({
url : "<?php echo CORETHEME_ADMIN_TEMPLATE_HELPER_URL . \'UncheckPackageThemeHelper.php\'; ?>",
type : \'POST\',
data : { \'element_name\' : el.prop(\'name\') },
success: function(result){
console.log(result);
},
error: function(jqXHR, textStatus, errorThrown ){
console.log(jqXHR, textStatus, errorThrown);
}
});
e.preventDefault();
});
});
})(jQuery);
其中指出:
单击链接时,我们取消选中复选框并将该元素名称传递给类在看到unset_package
我的类中的方法
class CoreTheme_AdminPanel_Template_Helper_UncheckPackageThemeHelper{
private $_element_name = null;
public function __construct(){
if(isset($_POST["element_name"])){
$this->_element_name = $_POST["element_name"];
$this->unset_package();
}
}
public function unset_package(){
$option = get_option($this->_element_name);
if(isset($option)){
$option = \'\';
}
}
}
new CoreTheme_AdminPanel_Template_Helper_UncheckPackageThemeHelper();
一切正常,直到
get_option
- 我有500个错误。这意味着get\\u option()方法不存在-在此实例中。
I think 如果我取出
get_option
以及其他内容,并替换
unset_package
具有echo json_encode($this->_element_name);
一切正常,我得到了元素名称。
有人能解释一下为什么这不起作用,也许能告诉我WordPress的正确方法吗?至少可以说,文档非常混乱。
最合适的回答,由SO网友:Milo 整理而成
通过ajax请求直接加载php文件时(UncheckPackageThemeHelper.php
) 它是在WordPress的上下文之外加载的,因此没有可用的WordPress核心功能。
所有WordPress ajax请求都应通过admin-ajax.php
. 您可以使用函数打印URLadmin_url
:
admin_url( \'admin-ajax.php\' )
何时
admin-ajax.php
已加载,WordPress已引导,因此您现在可以访问核心功能。
最后一步是通过action
参数,并将该操作映射到执行该操作时要调用的函数:
add_action( \'wp_ajax_my_action\', \'my_action_callback\' );