web-dev-qa-db-fra.com

Comment supprimer une action Ajax

Il y a un plugin qui charge des actions ajax comme ceci:

add_action( 'wp_ajax_nopriv_func_name', array( &$this, 'func_name' ) );
add_action( 'wp_ajax_get_func_name', array( &$this, 'func_name' ) );

Je veux les supprimer dans mon thème afin que je fasse:

remove_all_actions('wp_ajax_nopriv_func_name');
remove_all_actions('wp_ajax_get_func_name');

Mais ils sont toujours là. Je le fais définitivement après leur ajout. J'ai mis $ wp_filter dans le champ d'application et j'ai vu qu'ils étaient définitivement définis avant mon code et non définis après.

Cela ressemble à Wordpress quand vous ajoutez des actions ajax fonctionne un peu différemment. Je pense que l'action réelle est stockée ailleurs et je supprime simplement un alias car lorsque je regarde à l'intérieur du tableau $ wp_filter, le nom de la fonction ressemble à 4823746378642374682746func_name.

Je ne sais pas où il se réfère ni quelle est la procédure pour le supprimer.

Quelqu'un peut-il faire la lumière sur ce pour moi?

Modifier:

Je pense que les chiffres sont dus au fait que l’objet de classe est en train d’être passé, je suppose que c’est un hash de la classe.

Mettre à jour:

Cela semble être un bug/incohérence. J'ai fait le test suivant:

    add_action('wp_ajax_nopriv_ajax_test', array(&$this, 'ajax_test'));
    add_action('wp_ajax_ajax_test', array(&$this, 'ajax_test'));
    remove_all_actions('wp_ajax_nopriv_ajax_test');
    remove_all_actions('wp_ajax_ajax_test');

la fonction ajax_test est toujours accessible à partir de javascript même si elle a été supprimée immédiatement après son ajout.

Est-ce que quelqu'un sait où cela est stocké?

Mettre à jour:

J'ai trouvé le code responsable dans admin-ajax.php

do_action( 'wp_ajax_' . $_REQUEST['action'] );

La chose vraiment étrange que je ne peux pas comprendre, c'est que la demande ajax est renvoyée avant que le code ne soit touché. Il semble donc que ce code est juste pour faire des actions associées et ne pas renvoyer la requête ajax.

2
Guerrilla

Le problème principal que je rencontrais est que lorsqu'une requête ajax frappe, tous les hooks ne sont pas chargés.

J'ai utilisé ce code:

$return = array();
foreach( $GLOBALS['wp_actions'] as $action => $count )
{
    $return["message"] .= $action . ", ";
}
wp_send_json($return);

Cela m'a montré les crochets qui fonctionnaient auparavant et j'ai réussi à le faire fonctionner.

Je pense que supprimer les actions ajax sur "wp_loaded" est probablement préférable, car il semble que ce soit le dernier hook avant que l'admin ajax ne soit touché. Si vous supprimez "admin_init", vous manquez la vérification en haut du fichier, même si cela peut signifier que vous en manquez, il est peut-être préférable de le faire sur admin_init.

1
Guerrilla