web-dev-qa-db-ja.com

Ajax呼び出しでコールバック機能がアクティブにならない

私はすでに数日間これに苦労しているので、どんな助けでも大歓迎です。私がWPでAjaxを設定するのは初めてではないので、少なくともいくつか考えがあります。それは非常に標準的なフォームの検証とデータベースへの情報の入力に関するものです。 これはすべてプラグインの中です。

それで、何が動作しますか:フォーム送信が動作し、jqueryスクリプトがアクティブになり、入力情報をコールバックPHPファイルに転送します。

問題は、何らかの理由で、そのPHPファイルのフォームを処理する特定の機能がアクティブにならないことです。

だから、私は何がありますか?それはかなり標準的なようですので、私はそのようにフォームをスキップします。

1 - javascript/jquery

/plugins/alert-widget/submit_handler.js

jQuery(document).ready( function() {

jQuery("#alert_set_form").on("submit", function(e) {
    e.preventDefault();
    var info = jQuery("#alert_set_form").serialize();
    // Post to the server
    jQuery.ajax({       
        type:"POST",
        url:ajaxAlert.ajaxurl,
        data:info,
        dataType:'json',
        success: function(data){
             jQuery("#alert_set_form .stm-validation-message").html(data);
        }
    });
});
});

1 - フォームを構築し、検証/データ入力を処理することになっているメインのPHPプラグインファイル。

/plugins/alert-widget/alert_widget.php

add_action('wp_ajax_bda_alert', 'bda_alert_validation');
add_action('wp_ajax_nopriv_bda_alert', 'bda_alert_validation');

/* this commented out code was placed just to check if call hits the file, which it does

if( isset($_POST['model'])){
                $criteria = array(
                              'model' => $_POST['model'],
                              'body' => $_POST['body'],
                              'price' => $_POST['price'],
                              'mileage' => $_POST['mileage'],
                              'ca-year' => $_POST['ca-year'],
                              'fuel' => $_POST['fuel'],
                              'transmission' => $_POST['transmission']
                              );

            $criteria = base64_encode(serialize($criteria));
            $response = $criteria;
            wp_send_json( $response );
            wp_die();
        }
*/
    function bda_alert_validation(){
     //does validation and input 

            $response =array(
                'data'  => 'success',
                'supplemental' => array(
                    'message' => 'success',
                ),
            ) ;

            wp_send_json( $response );
            wp_die();       
    }



add_action('init', 'alert_form_init' );

function alert_form_init() {
wp_register_script( "alert_form_script", WP_PLUGIN_URL.'/alert-widget/submit_handler.js', array('jquery') );
wp_localize_script( 'alert_form_script', 'ajaxAlert', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));

wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'alert_form_script');

}
4
BernardA

フォームをajaxデータとしてシリアル化しているので、フォームにaction部分がない可能性があります。

<input type="hidden" name="action" value="bda_alert">

あなたのajaxリクエストには

/wp-admin/admin-ajax.php?action=bda_alert&...

それはwp_ajax_bda_alertまたはwp_ajax_nopriv_bda_alertアクションコールバックを呼び出すはずです。

6
birgire

上記のAJAXコールバックは、次のようにREST AP​​Iエンドポイントとして書き換えることができます。

function bda_alert_validation( $request ){
    // $info = $request['info'];
    $response = array(
        'data'  => 'success',
        'supplemental' => array(
            'message' => 'success'
        )
    ) ;
    return $response;      
}

add_action( 'rest_api_init', function () {
        register_rest_route( 'bernarda/v1', '/validatealert/', array(
                'methods' => 'POST',
                'callback' => 'bda_alert_validation'
        ) );
} );

これでexample.com/wp-json/benarda/v1/validatealert/にエンドポイントがあり、それに対してPOSTリクエストを実行できます

5
Tom J Nowell