web-dev-qa-db-fra.com

Déboguer ce qui se passe dans une fonction appelée depuis AJAX

J'ai un lien sur ma page de publication (côté administrateur) qui appelle AJAX et jQuery pour exécuter une fonction dans ma page functions.php. Le lien est câblé et appelle jQuery mais je n'arrive pas à déboguer ce qui se passe dans ma fonction qui est appelée depuis jQuery. Je veux que le lien cliqué supprime les métadonnées personnalisées pour le message (il s'agit d'un type de message personnalisé), puis supprime un fichier.

Voici le code avec la fonction de suppression à la fin:

//Add AJAX functionality to post.php to delete files
add_action('admin_enqueue_scripts', 'my_admin_enqueue_scripts');
add_action('wp_ajax_delete_meta', 'delete_pdf_and_metadata');

//Add my custom JS to the header of admin
function my_admin_enqueue_scripts($hook) {
    global $current_screen;

    if ( 'post.php' != $hook )
        return;
    wp_register_script('my-scripts', get_template_directory_uri() . '/js/custom/my-scripts.js' );
    wp_enqueue_script('my-scripts');
    wp_localize_script('my-scripts', 'wp_ajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}

function delete_pdf_and_metadata() {

    global $post;

    //delete metadata
    $the_id = intval($_POST['the_id'] );
    $the_pdf = get_post_meta($post->ID, $the_id);

    delete_post_meta($post->ID, $the_id, $the_pdf['name']);

    //TODO Delete PDF 
}

Voici l'appel jQuery:

jQuery(document).ready(function($) {
    $('.delete_pdf').each(function(i,e) { //grab the class delete-pdf
        var id = $(this).attr('id').replace(/delete-/, '');
        var li = $(this).closest('li');

        $(this).click(function(){

            $.post(ajaxurl, { action: 'delete_meta', the_id: id }, function(data){

                return id;
                });
        });

    });

});

En utilisant FireBug, tout ce que je vois est pour une réponse égale à 0. Quel est le meilleur moyen de déboguer ce qui se passe dans ma fonction delete_pdf_and_metadata() appelée via jQuery?

Merci!

2
drpcken

Vous ne faites pas écho à quoi que ce soit, vous n'allez donc pas obtenir beaucoup d'une réponse AJAX. En réalité, tout ce que vous faites avec AJAX est de charger une page Web avec Javascript. Si la page n'imprime rien, vous ne voyez rien. Vous n'avez rien à retourner de AJAX, mais sinon, vous aurez du mal à déterminer si votre action a abouti.

Si vous avez besoin de récupérer des informations, même pour le débogage, il suffit de echo ou var_dump. Vous pourrez voir votre contenu echoed ou var_dumped avec FireBug. Sachez que si votre contenu AJAX est supposé ressembler à JSON, ce piratage le corrigera.

En outre, il semble que vous vous attendiez à ce qu'un identifiant revienne de votre appel AJAX. Vous devrez faire écho à cela dans la fonction delete_pdf_and_metadata ou créer un objet JSON et y répondre.

1
s_ha_dum

J'utilise ce qui suit pour attraper des choses que FireBug ne fait pas:

function print_log( $msg, $title = '' )
{
    $error_dir = '/Applications/MAMP/logs/my.log';
    // or
    // $error_dir = '/home/user/public_html/wp-content/mu-plugins/my.log';
    $date = date('d.m.Y h:i:s'); // not used in this function
    $msg = print_r($msg,true);
    $log = $title."  |  ".$msg."\n";
    error_log( $log, 3, $error_dir );
}

J'espère que cela t'aides...

1
brasofilo

La première chose à faire est simplement d’ajouter une echo/var_dump/var_export/print_r() autour de ce que vous voulez déboguer, puis de regarder votre Chrome DevTools, FireBug, etc. Console pour obtenir le résultat.

Si vous souhaitez l’imprimer directement à l’écran, placez-y une exit() et vous obtiendrez seulement cette partie.

1
kaiser

Si vous avez suffisamment d'expérience, écrivez un enregistreur de base de données. Cela pourrait être une classe simple avec une connexion à une base de données et des méthodes lecture/écriture/mise à jour

class DB_Logger
{

  // not needed if you use the WordPress Database    
  private $db_name = 'database';
  private $db_table = 'tablename';
  private $db_user = 'username';
  private $db_password = 'password';
  private $db_Host = 'localhost';

  // instance of WordPress' $wpdb
  private static $db = null;

  private static $connection = null;

  public function __construct(){
    if( null === self::$connection )
      $this->connect();
  }

  public function connect(){
    global $wpdb;

    if( null === $this->db )
      $this->db = $wpdb;

    [or connect to another, none WordPress database]
  }

  public function write( $msg = '' ){
    [write message to database]
  }

  public function read( $type = 'all' ){
    [read message)s) from database]
  }

  public function erase( $type = 'all' ){
    [delete message(s) from database]
  }
}

Incluez la classe dans votre fichier php et enregistrez les messages dans la base de données

include_once 'path/to/your/class/class-db_logger.php';

$logger = new DB_logger();

[some code]

$logger->write(
  '$var at line ' . __LINE__ . ' in file ' . __FILE__ . ': ' . var_export( $var, TRUE )
);

Avec un peu de PHP et un peu d'Ajax, vous pouvez maintenant demander périodiquement vos informations de débogage à la base de données et les afficher, par exemple, dans la barre d'administration, dans l'en-tête ou le pied de page.

FireBug est un excellent outil, mais les informations de débogage sont perdues lors du prochain rechargement de page. Parfois, il peut être utile de voir comment les choses changent en modifiant le code.

0
Ralf912