Php Wordpress ajax调用,其中依赖于Google Sheets API的类实例可以';不认证

Php Wordpress ajax调用,其中依赖于Google Sheets API的类实例可以';不认证,php,jquery,ajax,wordpress,api,Php,Jquery,Ajax,Wordpress,Api,通过Wordpress插件,我有了一个表单,可以收集用户值,并将其与Google表单中存储的值进行比较 设置: 类的PHP文件有一个连接到Google客户端的构造,并为类方法分配一个变量。这些方法获取数据并比较数据。当用户填写并提交表单时,AJAX调用将值发布到php文件中,在该文件中启动该类的新实例,并通过类方法将表单值与googlesheet值进行比较 问题: 在我加入Wordpress之前,这一切都能如期工作。当我将ajax url设置为admin-ajax.php并使用wp_ajax{m

通过Wordpress插件,我有了一个表单,可以收集用户值,并将其与Google表单中存储的值进行比较

设置: 类的PHP文件有一个连接到Google客户端的构造,并为类方法分配一个变量。这些方法获取数据并比较数据。当用户填写并提交表单时,AJAX调用将值发布到php文件中,在该文件中启动该类的新实例,并通过类方法将表单值与googlesheet值进行比较

问题: 在我加入Wordpress之前,这一切都能如期工作。当我将ajax url设置为admin-ajax.php并使用wp_ajax{my_function}/wp_ajax\u nopriv{my_function}进行连接时,它就不起作用了。经过一些挖掘,这就是我在Wordpress调试日志中发现的问题:

PHP Fatal error:  Uncaught InvalidArgumentException: file "google-api/credentials.json" does not exist in wordpress\wp-content\plugins\myplugin\google-api\php-client-2.4.0\src\Google\Client.php:904
Stack trace:
#0 wordpress\wp-content\plugins\myplugin\my-class.php(37): Google_Client->setAuthConfig('google-api/cred...')
#1 wordpress\wp-content\plugins\myplugin\my-class.php\my-php-file.php(25): MyObject->__construct()
#2wordpress\wp-content\plugins\myplugin\FileContainingMyAjaxHookFunction.php: require_once('my-class.php')
#3 C:\xampp\htdocs\wordpress\wp-includes\class-wp-hook.php(288): MyAddActionsObject->MyAjaxHookFunction('')
#4 wordpress\wp-includes\class-wp-hook.php(312): WP_Hook->apply_filters('', Array)
#5 wordpress\wp-includes\plugin.php(478): WP_Hook->do_action(Array)
#6 C in C:\xampp\htdocs\wordpress\wp-content\plugins\myplugin\google-api\php-client-2.4.0\src\Google\Client.php on line 904
当我在AJAX调用的url中直接调用php文件时,我没有任何问题。这让我相信这就是我通过Wordpress钩子处理AJAX的方式

我的班级是这样的:

require_once 'google-api/php-client-2.4.0/vendor/autoload.php';

class My_Object {
  protected static $googleService;    

  public function __construct() {
    $client = new \Google_Client();
    $client->setApplicationName ('My Name');
    $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
    $client->setAccessType('offline');
    $client->setAuthConfig('google-api/credentials.json');

    self::$googleService = new Google_Service_Sheets($client);
  }

  public static function get_sheet_data() {
    $service = self::$googleService;
  }

  public static function do_stuff() {...}
} 
Ajax:

$.ajax( {
        type: "POST",
        url: myAjax.ajaxurl,
        data: {
           action: 'MyAjaxHookFunction',
           myDataOne: myDataOne,
           myDataTwo: myDataTwo
        },

        success: function(results) {
            $("#MyId").append(results);
            jQuery( document.body ).trigger( 'post-load' );
        }
    });
MyAjaxHookFunction:

require_once plugin_dir_path( dirname( __FILE__ ) ) . 'my-php-file.php';
die();
注意:我尝试在MyAjaxHookFunction中添加类实例,但没有成功

我的php文件:

require_once ('my-class.php');
$data = new My_Object;
$data::dostuff();
注:我通过XAMPP在当地工作。Google PHP API包含在插件目录中。我使用PHP,因为我不希望存储在Google表单中的数据可见


感谢您的帮助或见解。谢谢。

睡了一觉,再看看这个,解决方案似乎很难实现

出现问题的原因:AJAX是通过wp include目录中的admin-AJAX.php执行的。我的类构造是指相对于类文件本身位置的凭据文件。我需要指定一个可以从目录中任何位置使用的路径

为了解决这个问题,我在类构造的$client->setAuthConfig('url')中编辑了url参数:

  require_once 'google-api/php-client-2.4.0/vendor/autoload.php';

  class My_Object {
    protected static $googleService;    

    public function __construct() {
      $client = new \Google_Client();
      $client->setApplicationName ('My Name');
      $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
      $client->setAccessType('offline');
      $client->setAuthConfig( plugin_dir_path(__FILE__) . 'google-api/credentials.json');

      self::$googleService = new Google_Service_Sheets($client);
    }

    public static function get_sheet_data() {
      $service = self::$googleService;
    }

    public static function do_stuff() {...}
  } 
现在,它的工作如预期

学习内容:在插件文件中指定路径时,始终使用Wordpress目录路径函数,如plugin_dir_path()


如果我的实现或更好的做事方式有任何问题,我期待着听到它们。

在睡了一觉后,再看看这个问题,解决方案似乎很难实现

出现问题的原因:AJAX是通过wp include目录中的admin-AJAX.php执行的。我的类构造是指相对于类文件本身位置的凭据文件。我需要指定一个可以从目录中任何位置使用的路径

为了解决这个问题,我在类构造的$client->setAuthConfig('url')中编辑了url参数:

  require_once 'google-api/php-client-2.4.0/vendor/autoload.php';

  class My_Object {
    protected static $googleService;    

    public function __construct() {
      $client = new \Google_Client();
      $client->setApplicationName ('My Name');
      $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
      $client->setAccessType('offline');
      $client->setAuthConfig( plugin_dir_path(__FILE__) . 'google-api/credentials.json');

      self::$googleService = new Google_Service_Sheets($client);
    }

    public static function get_sheet_data() {
      $service = self::$googleService;
    }

    public static function do_stuff() {...}
  } 
现在,它的工作如预期

学习内容:在插件文件中指定路径时,始终使用Wordpress目录路径函数,如plugin_dir_path()

如果我的实施或更好的做事方式有任何问题,我期待着听取他们的意见