Is it possible to print a log of all database queries for a page request in WordPress?

I’m making a plugin that does a custom query on the WordPress database, and then I’m looping through the results listing each post title as a link to the actual post.

I’m using get_permalink($id) to obtain the URI of each post, but since I’m doing this outside of the loop, my suspicion is each of these requests is making a separate database query.

Read More

I’ve checked out the function code and tried to follow what’s going on in the actual WordPress core files, but what I’m really interested in is a general way to do this, so I can make sure I’m always writing the most optimized code in all of my plugins.

Is anyone aware of the best way to accomplish this?

Related posts

Leave a Reply

2 comments

  1. In wp-config.php add this line:

    define('SAVEQUERIES', true);
    

    In your theme functions.php file (or a plugin file for that matter) you can use this:

    add_action('shutdown', 'sql_logger');
    function sql_logger() {
        global $wpdb;
        $log_file = fopen(ABSPATH.'/sql_log.txt', 'a');
        fwrite($log_file, "//////////////////////////////////////////nn" . date("F j, Y, g:i:s a")."n");
        foreach($wpdb->queries as $q) {
            fwrite($log_file, $q[0] . " - ($q[1] s)" . "nn");
        }
        fclose($log_file);
    }
    

    Make sure ABSPATH.'/sql_log.txt' is writeble from php.

    Hope this helps.

  2. Can’t comment @Poelinca Dorin answer, so just stay it here.
    If you want to know what is launching your quire just add this

    fwrite($log_file, $q[0] . " - ($q[1] s)". " [Stack]: $q[2]" . "nn");

    instead

    fwrite($log_file, $q[0] . " - ($q[1] s)" . "nn");