web-dev-qa-db-fra.com

AJAX réponse, modifier les balises

Est-il possible de personnaliser la réponse AJAX lors de l'utilisation de filtres tels que check_admin_referer et check_ajax_referer?

J'ai fait quelques ajustements (avec ces filtres) pour empêcher les utilisateurs de supprimer certains termes qui sont vraiment importants et NE DOIVENT PAS être supprimés. Mais il continue de me dire "erreur inconnue" qui est loin d'être claire.

Tout indice serait cool.

J'utilise pour l'instant wp_die ('Ce terme ne peut pas être supprimé') et je me demande comment injecter ce message dans la réponse AJAX.

1
JMau

Attendez WordPress 4.7 le 6 décembre. Il a cela presque intégré.

Si j'ai bien compris, vous voudrez alors empêcher la suppression de certains termes. J'ai déjà fait un extrait pour celui qui fonctionne avec WP 4.7

add_filter(
  'user_has_cap',
  function ( $allcaps, $caps, $args ) {
    if ( ! isset( $args[0] ) || 'delete_term' != $args[0] ) {
      // not the deletion process => ignore
      return $allcaps;
    }

    $term = get_term( $args[2] );

    // HERE YOU'LL LIKE TO PUT YOUR LOGIC INSTEAD OF THIS:
    if ( $term->count <= 0 ) {
      return $allcaps;
    }

    // for all other cases => reject deletion
    return [ ];
  },
  10,
  3
);

Pour plus de détails, lisez https://wp-includes.org/536/capabilities-taxonomies-terms/#Preventnon-empty_categories_from_deletion

2
LeMike

Une autre réponse ne concerne pas du tout AJAX/JAVASCRIPT.

Au lieu de cela, ajoutez ce code:

add_action( 'pre_delete_term', 'myfunc', 10,2  );
function myfunc($term, $taxonomy){
  //var_dump($term);   var_dump($taxonomy);
  if($taxonomy =='category' && $term==745 ){
     die('not allowed');
  }
}

p.s. remplacez 745 par l'ID de la catégorie souhaitée.

1
T.Todua

J'ai ceci dans un de mes plugins:

/**
 * Prevents deletion of term
 *
 * Applies filter "atf_locks_term_delete_cap" to allow other plugins to filter the capability.
 *
 * @uses Adv_Term_Fields_Locks::get_prevent_msg()
 *
 * @access public
 *
 * @since 0.1.0
 *
 * @param int    $term_id  Term ID.
 * @param string $taxonomy Taxonomy Name.
 *
 * @return mixed int    $term_id If current user can delete the term or term is not locked.
 *               wp_die()  On AJAX calls: If current user can't delete term or user is not detected.
 */
public function maybe_prevent_term_delete( $term_id, $taxonomy )
{
    // If no lock, return term ID
    if ( ! $lock = get_term_meta( $term_id, $this->meta_key, true ) ) {
        return $term_id;
    };

    $cap = apply_filters( "atf_locks_term_delete_cap", "manage_others_term_locks" );
    $user_can_delete = $this->_user_can( $cap, $term_id, $taxonomy, $lock );

    if ( ! $user_can_delete ) :
        if ( defined('DOING_AJAX') && DOING_AJAX ) {
            wp_die( -1 );
        } else {
            $_msg = $this->get_prevent_msg( $action = 'delete' );
            wp_die( $_msg, 403 );
        };
    endif;

    return $term_id;
}

et ça s'appelle comme ça:

add_action( 'pre_delete_term', array( $this, 'maybe_prevent_term_delete' ), 99, 2 );

Le pre_delete_filter est appelé avant la suppression de tout terme. Pour empêcher la suppression, vous pouvez vous accrocher à l'action de la même manière que dans la méthode de classe ci-dessus.

Le problème est que WP ne permet pas de personnaliser la réponse. Puisqu'il s'agit d'un appel ajax, il ne recherche qu'un "1", un "0" ou un "-1".

Consultez wp_ajax_delete_tag() dans /wp-admin/includes/ajax-actions.php pour voir de quoi je parle.

0
darrinb

Chaque appel AJAX utilise des fonctions de rappel pour traiter les données renvoyées. Utilisez simplement le callback .fail:

jQuery.post( ajaxurl,
            { //your data here },
            function( content ) {
               var myContent = JSON.parse(content);
               // success! do something with content
            } ).fail( fucntion( msg ) { alert( msg );
            });

Voici comment je passerais le message d'échec AJAX à l'interface utilisateur.

0
scott

Ceci est ma première réponse, espérons que cela aide.

Si je comprends bien votre question, vous vous demandez comment envoyer un message personnalisé au client (c'est-à-dire un navigateur) si check_ajax_referrer renvoie false.

En regardant la référence de code , vous verrez que la fonction déclenche une action appelée check_ajax_referer, juste avant d'arrêter l'exécution du code, si la valeur est false. Ce que nous allons faire, c'est utiliser cette action pour annuler le résultat d'un résultat faux nonce.

function fn_name($action, $result){

    //  check if $result, passed from core function, is false
    //  alternately you can check for action if only needed for a specific ajax request
    //   For example: 
    //       if($action == 'the_action_name' && false === $result)

    if ( false === $result ) {

        //  use built in send function to return json to client,
        //  wp_send_json has wp_die() built-in

        wp_send_json('This term cannot be deleted');
    }

    //  return to core function if true
    return $result;
}

add_action('check_ajax_referer', 'fn_name', 10, 2);

Je m'excuse si cette réponse est trop verbeuse, je voulais être aussi complète que possible.

0
stims

Chaque appel AJAX a une structure similaire:

jQuery.post(ajaxurl,  { 
            action: "something_namee", 
            parameter1: "blabla" ,
            parameter2: "blabla222" ,
            ........ 

du côté PHP, vous devez créer une action wp_ajax_, suivie exactement par something_namee:

add_action('wp_ajax_something_namee','myfunc123',1);
function myfunc123(){
    //var_dump($_POST);
    if(!EMPTY($_POST['parameter1']) && $_POST['parameter1']==53){
        die("this term id cant be deleted");
    }
}

p.s. il suffit de changer les paramètres 1 et 53 en appelant les paramètres réels (vous pouvez savoir quels paramètres sont passés de AJAX en décommentant le var_dump ci-dessus)

p.s.2. Cependant, je suggère de ne pas dépendre des appels AJAX! Parce que beaucoup de choses différentes peuvent être faites pour supprimer les catégories, la méthode ci-dessus ne vous aidera pas. Je vais poster une autre réponse, qui est recommandée.

0
T.Todua