現時点で私は動作するajaxを持っています(私は成功[200]応答を得ます)が、アクションに問題があることで応答がフックします。 JSONオブジェクトが戻ってこない、代わりに 私は0を取得しています /。
私はdie()を持っています。帰国後、問題はフックが機能していないことだと思っています。
Classコンストラクタ内で複数のメソッドを試したことがありますが、このアプローチが正しいかどうかはわかりません。以前作成したプラグインを使用してこれを実行しましたが、これは theme 内にあります。
(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をやったので、ここでのフックの問題、おそらく私が理解できないテーマの範囲を持つ何か、コミュニティからのどんな提案または助けが素晴らしいであろうかのいずれかであると確信しています!前もって感謝します
問題は、 私のfunctions.phpで、私はafter_setup_theme
フックを使ってファイルをロードしていた ( reservations.php )
add_action('after_setup_theme', 'init_cpts');
そしてロードされたファイルの中からinit
フックを使ってクラスファイルを要求していました。 init
はafter_setup_theme
の後にロードされるので、これは問題ないと思いました。
function load_classes(){
require_once( PATH_TO_FILE .'/Class.php');
}
add_action('init','load_classes');
@brasofiloスレッドで言及されている問題は、この時点でinit
が既にトリガーされているので、クラスファイル内で一度試みたアクションフックがもはや機能しないことでした。
これを修正するために、上に示したようにloaded_classes()を単純に削除し、代わりにファイル自体の中のrequired_once
(after_setup_theme
がロードされている)を削除しました。それなら @brasofiloの回答は魅力的なのでうまくいったので+1彼の反応を確認してください。
私があなたのコードで見つけたエラー:
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 );
});
});
});
あなたのAjax呼び出しをチェックしてください
使用する場合は、必ずdataType: "json"を入力してください。
$.ajax({
dataType: "json",
url: url,
data: data,
success: success
});
または$.getJSON()
function ...を使う.
これが問題を解決することを願っています。