调试从AJAX调用的函数内部发生了什么

时间:2012-12-09 作者:ItsPronounced

我在编辑后的页面(管理端)上有一个链接,可以调用AJAX和jQuery在我的functions.php 页链接已连接并调用jQuery,但我似乎无法调试从jQuery调用的函数内部发生的事情。我希望单击的链接删除帖子的自定义元数据(这是一种自定义帖子类型),然后删除一个文件。

下面是末尾带有删除功能的代码:

//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 
}
以下是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;
                });
        });

    });

});
使用FireBug时,我看到的是响应为0。调试函数内部发生的事情的最佳方法是什么delete_pdf_and_metadata() 通过jQuery调用?

谢谢

4 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

您没有回应任何内容,因此不会得到太多AJAX响应。实际上,使用AJAX所做的就是用Javascript加载网页。如果页面没有打印任何内容,则您将看不到任何内容。您不需要从AJAX返回任何内容,但如果不返回,您将很难确定您的操作是否成功。

如果您需要返回信息,即使是为了调试,只要echo it,或var_dump 信息技术您将能够看到echoed或var_dumped满足于FireBug。请注意,如果您的AJAX内容应该是类似JSON的内容,那么这种调试黑客会破坏它。

此外,看起来您希望AJAX调用返回一个ID。您需要在delete_pdf_and_metadata 函数,或者构建一个JSON对象并响应它。

SO网友:brasofilo

我使用以下方法来捕捉FireBug没有的东西:

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 );
}
希望这有帮助。。。

SO网友:kaiser

一件事是简单地添加echo/var_dump/var_export/print_r() 围绕要调试的内容,然后查看Chrome开发工具、FireBug等控制台的输出。

如果要直接在屏幕上打印,请使用exit() 你只能拿回这部分。

SO网友:Ralf912

如果您有足够的经验,请编写数据库记录器。这可能是一个具有数据库连接和一些读/写/更新方法的简单类

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]
  }
}
在php文件中包含该类,并将消息记录到数据库中

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 )
);
使用一点PHP和一点Ajax,您现在可以定期从数据库请求您的除错信息,并将其显示在管理栏、页眉或页脚中。

FireBug是一个很好的工具,但调试信息会随着下一页的重新加载而丢失。有时,通过更改代码来查看事物是如何变化的可能会有所帮助。

结束

相关推荐

ajax sends data to plugin

我试图通过jquery ajax将数据发送到我的插件类,以更新表中的一个字段,我得到以下错误致命错误:调用成员函数query()我的班级看起来像class MyClass{ function __construct(){ global $wpdb; $this->db = $wpdb; //add_filter(\'query_vars\', \'parameter_queryvars\' )