我试图在wordpress插件中设置一个依赖的选取列表。在插件中,我有一个javascript,使用以下方法
$(\'#am_organisation\').change(function(){
var val = $(this).val();
$.ajax({
type: \'POST\',
url: \'/wp-content/plugins/harriecrm/admin/get-contacts.php\',
data:\'organisation_id=\'+val,
success: function(data){
$("#am_contact").html(data);
//$("#loader").hide();
},
error: function(xhr, status, error) {
alert(xhr.responseText);
}
});
});
the
get-contacts.php 文件看起来像
<?php
global $wpdb;
global $xx;
if(isset($_POST[\'organisation_id\'])){
$id = $_POST[\'organisation_id\'];
$listitems = $wpdb->prefix . \'am_contacts\';
$result = $wpdb->get_results ( "SELECT * FROM $listitems" );
//foreach ( $result as $print ) {
// echo \'<option value="Maak een keuze">Maak een keuzesss-\' . $id . \'</option>\';
//}
//if($wpdb->query($sql)){
// $resp->uf_error = $wpdb->print_error();
// alert($resp);
//};
// $result = $wpdb->get_results ($strsql);
//foreach ($result as $value) {
// echo \' <option value=\'.$value->id.\' \'.$selected.\'>\'.$value->am_firstname. ", ".$value->am_firstname. \'</option> \';
echo \'<option value="Maak een keuze">Maak een keuzesss-\' . $id . \'</option>\';
//}
}
?>
我试了很多。我知道URL很好,并且正在调用该页面。除了回音线,我已经对所有内容进行了注释,我看到pulldoen正在使用回音线进行更新。
但我想使用$wpdb方法从数据库中获取行。但当我取消注释行$result=$wpdb->;get\\u结果(“SELECT*FROM$listitems”);它不再工作了。我收到一条空的错误消息。警报(xhr.responseText);正在调用,但为空。如果我将$wpdb行注释掉,那么is再次起作用。
我真的不知道我错过了什么。除了这里的示例之外,我使用的$wpdb非常多,工作起来很有魅力。
有什么想法吗?BR马泽尔
SO网友:Tom J Nowell
wpdb调用失败的原因是没有wpdb。使用独立PHP文件的方法不正确,因此没有WordPress API。WordPress从不加载。这不是WordPress中AJAX的实现方式。
解决方案是正确执行AJAX调用并注册REST API端点。
E、 g.在插件或主题中functions.php
, 注册终结点:
add_action( \'rest_api_init\', function () {
register_rest_route( \'harriecrm/v1\', \'/contacts/\', array(
\'methods\' => \'GET\',
\'callback\' => \'get_contacts\'
) );
} );
function get_contacts( $request ) {
$id = $request[\'organisation_id\'];
.... your code goes here
return "result";
}
然后向
yoursite.com/wp-json/harriecrm/v1/contacts
并将其从
POST
到a
GET
:
$.ajax({
type: \'GET\',
url: \'/wp-json/harriecrm/v1/contacts\',
这为您提供了几个优势:
您可以展开register_rest_route
打电话告诉WP需要一个组织ID,它采用什么格式,它将为您进行所有验证和清理当您停用插件时,端点会消失,它只出现在激活了插件的站点上,关闭了插件中的一个主要安全漏洞。如果您需要修改或添加,现在可以将代码放在插件代码库中的任何位置,WordPress API(包括wpdb)现在会在代码运行时加载,您可以注册POST
DELETE
以及您可以选择的其他路线register_rest_route
为您处理身份验证您可以在该系统中使用诸如Postman之类的工具,如果您重做插件,您可以harriecrm/v2
这样一来,旧代码就不会出现问题,还有许多其他优点。使用您直接请求的独立PHP文件是非常糟糕的做法,您的问题突出了一个主要问题。