web-dev-qa-db-fra.com

WP AJAX ne fonctionne pas, revient toujours

J'ai vérifié toutes les discussions ici à ce sujet et fait un test de débogage qui a fonctionné. J'aimerais comprendre pourquoi mon propre code ne fonctionne pas car il présente la même fonctionnalité que celle décrite dans toutes les discussions possibles créées à propos de ce problème.

J'essaie d'envoyer une requête AJAX lorsque je clique sur une case et que je travaille avec MySQL.

Voici quelques détails pour comprendre la portée et ce qui a été fait:

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);
        }
    })
}

Ce script est inclus dans mon plugin via:

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

Dans ma classe principale (abstraite) de plugin (elle est instanciée et est appelée, je supprime donc cet exemple de code), mais j'ajoute les événements asynchrones affectés à admin_init:

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

Dans mes classes concrètes, j'implémente cette méthode comme:

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

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

Ce qui signifie fondamentalement:

Envoyez la demande AJAX à "ajaxurl" (ce qui retourne correctement: /wp-admin/admin-ajax.php), action: setAsyncCheckProduct est envoyé au serveur, sur le serveur, les assignAsyncEvents doivent être déjà fait et un wp_ajax_MY_ACTION_NAME attribué.

Pourquoi ai-je toujours un 0 en réponse?

Merci

UPDATEJe mets manuellement la sortie de débogage dans admin-ajax.php juste par souci de curiosité.

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' );

Ceci est la fonctionnalité principale avec mon var_dump ajouté. Mon appel AJAX GETS THeter et la sortie est indiquée correctement dans add_action dans mes fichiers de plug-in, étant donné que rien n'est renvoyé de mon action/il n'est pas appelé et que j'obtiens le paramètre die( '0' ); par défaut.

Bummer. Je ne sais pas quoi faire plus loin.

1
Boris Lapouga

Le problème est où vous placez le add_action de votre wp_ajax_ *

Essayez de le mettre au début de tout, et assurez-vous qu'il est chargé dans/wp-admin/route.

Essayez votre url: http: //xxx/wp-admin/admin-ajax.php? Action = your_action jusqu'à ce que vous obteniez un résultat différent de zéro.

3
Margareto

Placer cette réponse pour ceux qui essaient de résoudre le même problème.

C'est important où

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

réside.

Dans mon cas, le problème a finalement été résolu en déplaçant une ligne similaire vers le fichier de plugin principal, où toutes les classes concrètes sont incluses et initialisées. Bien sûr, la ligne devait être changée en cette forme:

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

1
yuga