在模板中调用的类,AJAX未注册

时间:2017-09-05 作者:Mr Pablo

我有一个自定义插件,它由各种类组成,其中一个类在页面模板中被调用:

$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\\u ajax操作似乎受到了影响,但回调函数没有受到影响,我只得到0 作为AJAX响应。

现在请记住,这个类只在模板中实例化过。

我尝试将这些AJAX操作添加到我的主插件类和包含的类中的回调中,但理想情况下,我希望它在这个独立类中工作。

这可能是因为在我的模板中间添加了AJAX操作吗?

有办法解决这个问题吗?

1 个回复
SO网友:Jacob Peattie

您不能在模板中钩住AJAX,因为管理AJAX不会加载模板。请求发出时使用php。加载插件时,需要挂接AJAX。

由于钩子是在类构造函数中定义的(无论这是否是一个好主意another issue), 每当加载WordPress管理员时,都需要实例化类。你不能通过$chart = new MyCharts\\Chart() 直接在主插件文件中,或包含在其中的文件中。

结束

相关推荐

困惑AJAX通过页面模板提交表单

我想我已经看了太多的代码,在试图更好地理解WordPress和AJAX中的表单时把自己弄糊涂了。本周我开始学习如何为页面创建表单并通过AJAX提交表单。该页面是一个模板,我已经研究了两种处理方法。一种是通过重定向到PHP,例如:<form action=\"<?php echo get_template_directory_uri() . \"/validation.php\"; ?>\" id=\"contactForm\"> </form> 在阅读