Wordpress ajax вызов, когда экземпляр класса, использующий API Google Sheets, не может аутентифицироваться - PullRequest
1 голос
/ 14 апреля 2020

Через плагин Wordpress у меня есть форма, которая собирает пользовательские значения и сравнивает их со значениями, хранящимися в Google Sheet.

Настройка: файл PHP для класса имеет конструкцию, которая подключается к клиенту Google и назначает переменную для используемых методов класса. Эти методы получают данные и сравнивают данные. Когда пользователь заполняет и отправляет форму, вызов AJAX отправляет значения в файл php, где инициируется новый экземпляр этого класса и значения формы сравниваются со значениями Google Sheet с помощью методов класса.

Проблема: все это работает, как и ожидалось, пока я не задействую Wordpress. Когда я устанавливаю ajax url на admin- ajax. php и подключаюсь с помощью wp_ajax_ {my_function} / wp_ajax_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

У меня нет проблем, когда я вызываю файл php непосредственно в URL моего AJAX вызова. , Это заставляет меня поверить, что именно так я и обращаюсь AJAX с помощью WordPress-хуков.

Мой класс выглядит так:

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 Sheets, были доступны для просмотра.

Любая помощь или понимание приветствуется. Спасибо.

1 Ответ

0 голосов
/ 15 апреля 2020

После сна и повторного взгляда на это решение казалось прямым решением.

Почему возникла проблема: AJAX выполняется через admin- ajax. php в каталоге wp-include. Моя конструкция класса относится к файлу учетных данных относительно расположения самого файла класса. Мне нужно было указать путь, который можно использовать из любого места в каталоге.

Чтобы решить эту проблему, я отредактировал параметр url в $ client-> setAuthConfig ('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 (), при указании путей в файлах подключаемых модулей.

Если есть какие-либо проблемы с моей реализацией или более эффективные способы ведения дел, я с нетерпением жду их услышать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...