У меня есть настраиваемый плагин, состоящий из разных классов, причем один класс вызывается в шаблоне страницы:
$chart = new MyCharts\Chart(); $csv = get_field( 'csv' ); // URI to .csv file $chart->init( $csv );
Класс MyChart:
use League\Csv\Reader; class Chart { private $id; protected $reader; protected $columns; protected $rows; protected $results; public function __construct() { add_action( 'wp_ajax_get_chart_data', [ $this, 'get_chart_data' ] ); add_action( 'wp_ajax_nopriv_get_chart_data', [ $this, 'get_chart_data' ] ); add_action( 'wp_footer', [ $this, 'load_chart_scripts' ] ); } public function load_chart_scripts() { wp_enqueue_script( 'google_chart', 'https://www.gstatic.com/charts/loader.js' ); wp_enqueue_script( 'bar_chart', plugins_url( '/js/bar-chart.js', __FILE__ ), 'jquery' ); } public function init( $csv ) { $this->print_chart_container(); $this->parse_csv( $csv ); } private function print_chart_container() { echo '<div id="chart_div" style="width: 100%; height: 100%;"></div>'; } private function parse_csv( $csv ) { $parse_csv_url = parse_url( $csv ); try { $this->reader = Reader::createFromPath( ltrim( $parse_csv_url['path'], '/' ) ); $this->rows = $this->reader->fetchAssoc(); $this->columns = $this->reader->fetchOne( 0 ); // fetch first row as column names } catch ( \Exception $e ) { echo $e->getMessage(); } } public function get_chart_data() { $result = new \stdClass(); // dummy data for testing $result->columns = 'test'; $result->rows = 'test'; $this->results[] = $result; return wp_send_json( $this->results ); } }
Теперь кажется, что действия wp_ajax ударяются, но функция обратного вызова нет, и я просто получаю 0
как ответ AJAX.
Теперь помните, что этот класс только каждый экземпляр в шаблоне.
Я попытался добавить эти действия AJAX в свой основной класс плагина и обратный вызов в включенном классе, но в идеале я хочу, чтобы он работал в этом автономном классе.
Возможно, это связано с добавлением действий AJAX в середине моего шаблона?
Есть ли способ обойти это?
Вы не можете подключиться к AJAX в шаблоне, потому что шаблон не будет загружен admin-ajax.php, когда будет выполнен запрос. Вам нужно подключиться к AJAX при загрузке плагина.
Поскольку ваши крючки определены в конструкторе класса (независимо от того, является ли это хорошей идеей, другая проблема ), вам нужно создать экземпляр своего класса всякий раз, когда загружается администратор WordPress. Вы не могли этого, поместив $chart = new MyCharts\Chart()
прямо в ваш основной файл плагина или файл, который был включен в него.