PHP包含在AJAX操作中

时间:2017-08-05 作者:awiebe

我的主插件文件中有以下代码

<?php
include plugin_dir_path( __FILE__) . \'options.php\';
include plugin_dir_path( __FILE__ ) . \'config.php\';
include plugin_dir_path( __FILE__ ) . \'front/manage.php\';
add_action( \'admin_init\', \'restrict_admin\', 1 );

//prepare wordpress for ajax  this needs to be done early to avoid strange race conditions
add_action( \'wp_ajax_devices\', \'api_list_devices\' );
add_action( \'wp_ajax_profiles\', \'api_list_profiles\' );
add_action( \'wp_ajax_held_accounts\', \'api_list_held_accounts\' );
add_action( \'wp_ajax_set_profile\', \'api_set_profiles\' );

define(\'AJAX_NONCE_NAME\',"title_example");
//...
我想,既然添加了一个操作,那么管理员就可以使用ajax了。php知道它应该在以后的某个时候运行一些操作,我的include甚至没有执行,但我需要它们来验证数据库连接。我怎样才能告诉wordpress对wordpress中我无法控制的部分进行包含?我必须排队吗?所有排队的例子似乎都适用于前端?

2 个回复
SO网友:Ben HartLenn

“…我需要他们验证数据库连接。”

不完全确定这是您想要的,但在ajax功能中,您可以连接并使用数据库declare the global variable $wpdb.

下面是一个简单的示例:

function api_list_devices() {
    global $wpdb;

    $name = $_POST[\'name\']; // ajax call sends "name"

    // try to insert $name into "people" tables "name" column
    if($wpdb->insert(\'people\',array(
        \'name\'=>$name 
    ))===FALSE){
        echo "Error";
    }
    else {
        echo "Person \'".$name. "\' has been successfully added;
    }
}

SO网友:awiebe

我最后做了以下工作:

为我的每个ajax操作预加一个函数,加载一个满是defines的文件,因为php包含的数据库连接函数的作用域是它们发生的函数(但define值是全局的)

    如果有人读到这个操作时需要一个对象,请执行第一步,但使用global 关键字将加载的对象分配到全局命名空间,以便在完成依赖项加载功能时不会丢失,然后只需引用对象的全局实例。

    如果wordpress开发人员碰巧读到了这篇文章,那么在ajax出现之前应该有一个用于加载依赖项的钩子,您可以使用反射使其透明。

    指示插件开发人员检查referer nonce以防范恶意插件https://stackoverflow.com/questions/2211877/giving-php-included-files-parent-variable-scope

    像往常一样调用ajax操作处理程序。

结束