Depurar Consultas SQL no WordPress

Depurar Consultas SQL no WordPress

O WordPress já conta com uma ferramenta para debugar o código, o ‘WP-DEBUG’.

Muitos programadores ainda não conhecem o recurso de debugar consultas SQL no WordPress, que pode ser muito útil para quem cria plugins e temas personalizados. A ferramenta ‘SAVEQUERIES’ salva todas as queries sql executadas durante as consultas no banco de dados, retornando uma matriz de consulta na página visualizada. Além disso a ‘SAVEQUERIES’ mostra o comando sql executado em cada carregamento da página.

Para habilitar a ‘SAVEQUERIES’ adicione código abaixo depois da tag de abertura do php no arquivo ‘wp-config.php’:

<?php
//recomendamos os iniciantes em PHP que insiram este código depois da tag de abertura
define('SAVEQUERIES', true);

Depois de habilitar o ‘SAVEQUERIES’, é necessário exibir a matriz contendo as cláusulas sql em execução na página.

Use este código para mostrar a matriz de consulta na página:

<?php
if ( current_user_can('administrator')) {
        global $wpdb;
        print_r($wpdb->queries);
    }
?>

Lembrando que no exemplo acima, o ‘SAVEQUERIES’ só vai exibir as queries de consulta sql se o usuário que estiver acessando o WordPress tiver permissão de administrador. Assim a visualização dos comandos sql não será mostrada para um usuário visitante ou outro usuário que não tenha permissão de administrador.

Porém se por algum motivo você quiser exibir queries para usuários que não seja o admin, mude o parâmetro informado na função “current_user_can” na linha 1.

Veja um exemplo de código onde vamos exibir queries para editores:

<?php
if ( current_user_can('editor')) {
        global $wpdb;
        print_r($wpdb->queries);
    }
?>

Os outros dados que podemos passar para a função “current_user_can”, são os valores “contributor” e “subscriber”.

Resultado produzido pelo ‘SAVEQUERIES’

Array ( [0] => Array ( [0] => SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes' [1] => 0.0010900497436523 [2] => require, require_once, require_once, require_once, wp_not_installed, is_blog_installed, wp_load_alloptions ) [1] => Array ( [0] => SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = 'category' AND t.slug = 'videos-blog' LIMIT 1 [1] => 0.00041294097900391 [2] => require, require_once, require_once, require_once, include, get_category_by_slug, get_term_by ) [2] => Array ( [0] => SELECT * FROM wp_users WHERE user_login = 'admin' [1] => 0.00021600723266602 [2] => require, require_once, require_once, require_once, WP->init, wp_get_current_user, get_currentuserinfo, wp_validate_auth_cookie, get_userdatabylogin, get_user_by ) [3] => Array ( [0] => SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (1) [1] => 0.00028896331787109 [2] => require, require_once, require_once, require_once, WP->init, wp_get_current_user, get_currentuserinfo, wp_validate_auth_cookie, get_userdatabylogin, get_user_by, _fill_user, get_user_metavalues, update_meta_cache ) [4] => Array ( [0] => SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1 [1] => 0.00038504600524902 [2] => require, wp, WP->main, WP->parse_request, WP_Rewrite->wp_rewrite_rules, get_option ) [5] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.004755973815918 [2] => require, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts ) [6] => Array ( [0] => SELECT FOUND_ROWS() [1] => 0.00017595291137695 [2] => require, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts ) [7] => Array ( [0] => SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') AND tr.object_id IN (1460, 1439, 1437, 1433, 1431, 1427, 1424, 1422, 1419, 1417) ORDER BY t.name ASC [1] => 0.0044698715209961 [2] => require, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, update_post_caches, update_object_term_cache, wp_get_object_terms ) [8] => Array ( [0] => SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1460,1439,1437,1433,1431,1427,1424,1422,1419,1417) [1] => 0.00036811828613281 [2] => require, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, update_post_caches, update_postmeta_cache, update_meta_cache ) [9] => Array ( [0] => SELECT * FROM wp_users WHERE ID = 2 LIMIT 1 [1] => 0.00032401084899902 [2] => require, require_once, include, the_post, WP_Query->the_post, setup_postdata, get_userdata ) [10] => Array ( [0] => SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (2) [1] => 0.00023102760314941 [2] => require, require_once, include, the_post, WP_Query->the_post, setup_postdata, get_userdata, _fill_user, get_user_metavalues, update_meta_cache ) )

Veja o mesmo resultado no screenshot:

Matriz contendo o comando sql executado pelo WordPress
Matriz contendo o comando sql executado pelo WordPress

Lembre-se de usar essa funcionalidade do WordPress apenas em ambiente de desenvolvimento. Usar o ‘SAVEQUERIES’ em servidor de produção pode causar transtornos com administradores de site sem conhecimento em programação.