web-dev-qa-db-ja.com

WP AJAX 動作していない、常に戻ります

私はこれに関してスレッドをここでチェックし、うまくいったデバッグテストをしました、私がそれ自身がこの問題について作成されたすべての可能なスレッドで説明された同じ機能を提示するのでうまくいかない理由を理解したいです。

チェックボックスをクリックするとAJAXリクエストを送信しようとしていますが、MySQLでいくつかの作業を行います。

ここでは、範囲と何が行われたのかを理解するための詳細がいくつかあります。

var $ = jQuery;
$(function() {
    $('table.table').on('click', '[name="term-id"]', function() {
        var t = $(this),
            id = t.val(),
            checked = t.is(':checked');

        checkCategory(id, checked);
    });
});

function checkCategory(id, checked) {
    $.ajax({
        url: ajaxurl,
        type: 'POST',
        dataType: 'json',
        data: {action: 'setAsyncCheckProduct', id: id, checked: checked},
        success: function(response) {
            alert(response);
        },
        error: function(errorThrown) {
            alert(errorThrown);
        }
    })
}

このスクリプトは私のプラグインに含まれています:

wp_enqueue_script('settings-manager', $this->pluginUrl . '/assets/js/SettingsManager.js');

私のメイン(抽象)プラグインクラス(インスタンス化されて呼び出されているので、このコードサンプルは省略しています)では、admin_initに割り当てられた非同期イベントを追加します。

add_action('admin_init', [$this, 'assignAsyncEvents']);

私の具象クラスでは、このメソッドを次のように実装しています。

public function setAsyncCheckProduct()
{
    var_dump($_REQUEST);
    echo 123123123;
    wp_die();
}

public function assignAsyncEvents()
{
    add_action('wp_ajax_setAsyncCheckProduct', [$this, 'setAsyncCheckProduct']);
}

これは基本的には

"ajaxurl"(正しい値:/wp-admin/admin-ajax.phpを返す)にアクション_ setAsyncCheckProductが送信された場合は、AJAX要求をサーバーに送信し、assignAsyncEventsを送信します。既に行われ、wp_ajax_MY_ACTION_NAMEが割り当てられています。

それでも応答で0が返されるのはなぜですか?

ありがとう

UPDATE私は好奇心のために手動でadmin-ajax.phpにデバッグ出力を入れています。

if ( is_user_logged_in() ) {
    /**
     * Fires authenticated AJAX actions for logged-in users.
     *
     * The dynamic portion of the hook name, `$_REQUEST['action']`,
     * refers to the name of the AJAX action callback being fired.
     *
     * @since 2.1.0
     */
    do_action( 'wp_ajax_' . $_REQUEST['action'] );
    var_dump('wp_ajax_' . $_REQUEST['action']);
} else {
    /**
     * Fires non-authenticated AJAX actions for logged-out users.
     *
     * The dynamic portion of the hook name, `$_REQUEST['action']`,
     * refers to the name of the AJAX action callback being fired.
     *
     * @since 2.8.0
     */
    do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
}
// Default status
die( '0' );

これが私のvar_dumpが追加されたコア機能です。私のAJAXはGETS THEREを呼び出し、出力は私のプラグインファイルのadd_actionで定義された正しいアクション名です。私のアクションからは何も返されないと思います/呼び出されていないのでデフォルトのdie( '0' );になります。

残念です。さらに何をすべきかわからない。

1
Boris Lapouga

問題は、wp_ajax_ *のadd_actionを配置する場所です

すべての最初に配置して、/ wp-admin /ルートに確実にロードされるようにしてください。

URLを試してください: http://xxx/wp-admin/admin-ajax.php?action = your_action ゼロ以外の値が表示されるまで。

3
Margareto

同じ問題を解決しようとしている人々のためにこの答えを置くこと。

それはどこで重要です

add_action('wp_ajax_setAsyncCheckProduct', [$this, 'setAsyncCheckProduct']);

住む。

私の場合、問題はようやく同様の行をメインのプラグインファイルに移動することで解決されました。そこでは、すべての具象クラスが含まれ初期化されています。もちろん、行はこの形式に変更されなければなりませんでした:

add_action('wp_ajax_setAsyncCheckProduct', ['ClassName', 'setAsyncCheckProduct']);

1
yuga