web-dev-qa-db-ja.com

ClassファイルでのAjaxの使用

現時点で私は動作するajaxを持っています(私は成功[200]応答を得ます)が、アクションに問題があることで応答がフックします。 JSONオブジェクトが戻ってこない、代わりに 私は0を取得しています /。

私はdie()を持っています。帰国後、問題はフックが機能していないことだと思っています。

Classコンストラクタ内で複数のメソッドを試したことがありますが、このアプローチが正しいかどうかはわかりません。以前作成したプラグインを使用してこれを実行しましたが、これは theme 内にあります。

Form.php

add_action('after_setup_theme')と共にfunctions.phpに含まれています)

public function __construct(){
 // Test #1
 add_action( 'wp_ajax_nopriv_process_reservation', array( &$this, 'process_reservation' ) );

 // Test #2 
 add_action( 'wp_ajax_process_reservation', &$this->process_reservation ); //with and without '&' before $this

 // Test #3 (this is incorrect)
 add_action( 'wp_ajax_nopriv_process_reservation', $this->process_reservation );


//If I wrap this with **add_action('init',function(){... *** then it does not load
 wp_enqueue_script('ajax_script',THEME_MODULES_URL.'/Reservations/form.js',array('jquery'),TRUE);
 wp_localize_script( 'ajax_script', 'myAjax', array(
      'ajaxurl'               => admin_url( 'admin-ajax.php' ), //don't change this
      'itemNonce'             => wp_create_nonce("ajax_nonce"), //don't change this
  ));
}

念のために、ここで必要なのは、現時点での私のコールバック関数のテストです。

private function process_reservation(){
    check_ajax_referer( 'process_reservation_nonce', 'nonce' );

    if( true )
        wp_send_json_success( 'ok' );
    else
        wp_send_json_error( array( 'error' => $custom_error ) );

}

XHRコンソールのフォームデータには、渡されたアクションとNounceの両方が表示されます。

action:process_reservation
ajax_nonce:6f155a1e17

何を期待するかを知るのに十分なAjaxをやったので、ここでのフックの問題、おそらく私が理解できないテーマの範囲を持つ何か、コミュニティからのどんな提案または助けが素晴らしいであろうかのいずれかであると確信しています!前もって感謝します

4
Xtremefaith

問題は、 私のfunctions.phpで、私はafter_setup_themeフックを使ってファイルをロードしていた reservations.php

add_action('after_setup_theme', 'init_cpts');

そしてロードされたファイルの中からinitフックを使ってクラスファイルを要求していました。 initafter_setup_themeの後にロードされるので、これは問題ないと思いました。

function load_classes(){
    require_once( PATH_TO_FILE .'/Class.php');
}
add_action('init','load_classes');

@brasofiloスレッドで言及されている問題は、この時点でinitが既にトリガーされているので、クラスファイル内で一度試みたアクションフックがもはや機能しないことでした。

これを修正するために、上に示したようにloaded_classes()を単純に削除し、代わりにファイル自体の中のrequired_onceafter_setup_themeがロードされている)を削除しました。それなら @brasofiloの回答は魅力的なのでうまくいったので+1彼の反応を確認してください。

4
Xtremefaith

私があなたのコードで見つけたエラー:

1つは@helgatheviking が指摘した :Ajaxコールバックはpublicではなくprivateメソッドである必要があります。

どのようにしてこのクラスを初期化するのかはわかりませんが、wp_enqueue_script_style(単数形)はwp_enqueue_scriptsフックの中にカプセル化する必要があります(WP_DEBUGは通知をダンプします)。

&から$thisを削除することができます、それはPHP 4です。実用的な例に従ってください:

class MyTheme
{
    public function __construct()
    {
        add_action( 'wp_footer', array( $this, 'aux_function' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'init_plugin' ) );
        add_action( 'wp_ajax_process_reservation', array( $this, 'process_reservation' ) ); 
        add_action( 'wp_ajax_nopriv_process_reservation', array( $this, 'process_reservation' ) );
    }

    public function aux_function()
    {
        echo '<h4><a href="#" id="wpse">TEST AJAX</a></h4>';
    }

    public function init_plugin()
    {
        wp_enqueue_script( 
            'ajax_script', 
            plugins_url( '/test.js',__FILE__ ), 
            array('jquery'), 
            TRUE 
        );
        wp_localize_script( 
            'ajax_script', 
            'myAjax', 
            array(
                'url'   => admin_url( 'admin-ajax.php' ),
                'nonce' => wp_create_nonce( "process_reservation_nonce" ),
            )
        );
    }

    public function process_reservation()
    {
        check_ajax_referer( 'process_reservation_nonce', 'nonce' );

        if( true )
            wp_send_json_success( 'Ajax here!' );
        else
            wp_send_json_error( array( 'error' => $custom_error ) );
    }
}
new MyTheme();

test.js

jQuery(document).ready(function($) 
{
    $('#wpse').click(function(e) 
    {
        e.preventDefault();
        var data = {
            action: 'process_reservation',
            nonce: myAjax.nonce
        };

        $.post( myAjax.url, data, function( response ) 
        {
            $('#wpse').html( response.data );
        });
    });
});
15
brasofilo

あなたのAjax呼び出しをチェックしてください

使用する場合は、必ずdataType: "json"を入力してください。


$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

または$.getJSON() function ...を使う.

これが問題を解決することを願っています。

0
Shahinul Islam