web-dev-qa-db-ja.com

から呼び出された関数の内部で行われているデバッグ情報 AJAX

私は自分のfunctions.phpページ内で関数を実行するためにAJAXとjQueryを呼び出すリンクを私の投稿編集ページ(管理者側)に持っています。リンクは配線されていて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です。jQueryを介して呼び出されている関数delete_pdf_and_metadata()の内部で何が起こっているのかをデバッグするための最良の方法は何ですか?

ありがとうございます。

2
drpcken

何も反響していないので、AJAX応答の多くを得ることはないでしょう。 AJAXを使ってやっていることは、本当に、Javascriptを使ってWebページをロードすることだけです。ページに何も印刷されない場合は、何も表示されません。 AJAXから何も返す必要はありませんが、そうでなければ、あなたのアクションが成功したかどうかを判断するのに苦労します。

デバッグのためであっても情報を取り戻す必要がある場合は、それをecho、またはvar_dumpにしてください。 FireBugを使ってechoedまたはvar_dumpedのコンテンツを見ることができます。 AJAXコンテンツがJSONのようなものになっていると思われる場合は、このデバッグハックによって破損する可能性があります。

また、IDがAJAX呼び出しから戻ってくることを期待しているようにも見えます。それをdelete_pdf_and_metadata関数でエコーするか、JSONオブジェクトを構築してエコーする必要があります。

1
s_ha_dum

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

お役に立てれば...

1
brasofilo

1つのことは、デバッグしたいものにecho/var_dump/var_export/print_r()を追加してから、Chrome DevTools、FireBugなどを見て、出力を確認することです。Console.

画面に直接印刷したい場合はexit()を囲みます。これでonlyが返されます。

1
kaiser

十分な経験がある場合は、データベースロガーを作成してください。これはデータベース接続といくつかのread/write/updateメソッドを持つ単純なクラスかもしれません

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は素晴らしいツールですが、デバッグ情報は次のページのリロードで失われます。コードを変更して状況がどのように変化するかを確認すると便利なことがあります。

0
Ralf912