Philip Walton
Philip Walton

Reputation: 30451

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.

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?

Upvotes: 21

Views: 16777

Answers (2)

zey_ser
zey_ser

Reputation: 165

Can't comment on @Poelinca Dorin's answer, so I'll just say it here:

If you want to know what is launching your query just use this:

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

instead of:

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

Upvotes: 5

Poelinca Dorin
Poelinca Dorin

Reputation: 9703

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, "//////////////////////////////////////////\n\n" . date("F j, Y, g:i:s a")."\n");
    foreach($wpdb->queries as $q) {
        fwrite($log_file, $q[0] . " - ($q[1] s)" . "\n\n");
    }
    fclose($log_file);
}

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

Hope this helps.

Upvotes: 57

Related Questions