来自插件的WordPress Ajax回调函数 - OOP

时间:2017-01-18 01:17:15

标签: php ajax wordpress oop

使用PluginBoilerplate编写插件。 我需要进行ajax调用。

我添加了主plugin.php文件,类来注册脚本和处理ajax调用。

if ( ! class_exists( 'PoorMansNameSpaceAJAX' ) ) {

class PoorMansNameSpaceAJAX{
    public static $instance = null;
    public $nonce = '';
    public $name = 'ajaxexample';
    public static function getInstance()
    {
        null === self::$instance AND self::$instance = new self;
        return self::$instance;
    }
    public function __construct(){
        # Could as well be: wp_enqueue_scripts or login_enqueue_scripts
        add_action( 'admin_enqueue_scripts', array( $this, 'scriptsEnqueue' ) );
        # Logged in users:
        add_action( 'wp_loaded', array( $this, 'scriptsRegister' ) );
        add_action( 'admin_enqueue_scripts', array( $this, 'scriptsLocalize' ) );
        add_action( 'admin_init', array( $this, 'ajaxRegister' ) );


    }
    public function scriptsRegister( $page ){
        $file = 'page-1.js';
        wp_register_script(
            $this->name ,
            WPBP_URLPATH . '/app/files/js/' . $file ,
            array('jquery')
        );
    }
    public function scriptsEnqueue( $page ){

        wp_enqueue_script( $this->name );
    }

    public function ajaxRegister() {
        add_action( "wp_ajax_{$this->name}_action",  array($this, 'ajaxexample'), '1' );
    }

    public function scriptsLocalize( $page ){
        wp_localize_script( $this->name, "{$this->name}Object", array(
            'ajaxurl'          => admin_url( 'admin-ajax.php' ),
            'action'           => "{$this->name}_action"
        ) );
    }

   public function ajaxexample(){
        ob_clean();

        echo json_encode( array(
            'success' => true
        ) );
        wp_die();   
    }
}
}

包含vendor / autoload.php后调用的类。

主要问题是虽然脚本已成功注册,排队和本地化,但ajax回调函数未执行操作。

ajax调用返回空响应。

( function( $, plugin ) {
           $(document).ready( function() {

            $('#moreroles').on('click', function(event) {
                event.preventDefault();
                /* Act on the event */
                var data = plugin;
                $.ajax({
                    url: plugin.ajax_url,
                    data: data,
                    beforeSend : function( d ) {
                        console.log( 'Before send', d );
                     }
                })
                .done( function( response, textStatus, jqXHR ) {
                    console.log( 'AJAX done', textStatus, jqXHR, jqXHR.getAllResponseHeaders() );
                } )
                .fail( function( jqXHR, textStatus, errorThrown ) {
                    console.log( 'AJAX failed', jqXHR.getAllResponseHeaders(), textStatus, errorThrown );
                } )
                .then( function( jqXHR, textStatus, errorThrown ) {
                    console.log( 'AJAX after finished', jqXHR, textStatus, errorThrown );
                } );

            });
    } );
} )( jQuery, ajaxexampleObject || {});

1 个答案:

答案 0 :(得分:0)

PluginBoilerplate缺少此类用法的正确处理流程。 This OOP WP Plugin Boilerplate做得更好,并为管理员和客户端提供加载器类。