{"id":230897,"date":"2022-12-08T13:42:00","date_gmt":"2022-12-08T10:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230897"},"modified":"2022-12-07T11:53:28","modified_gmt":"2022-12-07T08:53:28","slug":"um-esboco-para-trabalhar-com-consultas-de-banco-de-dados-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/um-esboco-para-trabalhar-com-consultas-de-banco-de-dados-no-wordpress\/","title":{"rendered":"Um esbo\u00e7o para trabalhar com consultas de banco de dados no WordPress"},"content":{"rendered":"\n<p>Por mais que eu seja f\u00e3 de certas APIs do WordPress para consultar o banco de dados, como:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query#Related\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a><\/strong> ,<\/li>\n<li>e assim por diante<\/li>\n<\/ul>\n<p>Tamb\u00e9m sou f\u00e3 de consultar diretamente o banco de dados quando necess\u00e1rio.<\/p>\n<p>Como voc\u00ea notar\u00e1, h\u00e1 uma maneira consistente de fazer isso e, como h\u00e1 momentos em que tenho feito isso com mais frequ\u00eancia, ultimamente, aqui est\u00e1 um formato b\u00e1sico para trabalhar com consultas de banco de dados no WordPress.<\/p>\n<p>Se eu fizer isso, no entanto, geralmente h\u00e1 coisas que eu mantenho em mente:<\/p>\n<ol>\n<li>sempre verifique se a consulta est\u00e1 parametrizada (especialmente no caso de entrada do usu\u00e1rio),<\/li>\n<li>retornam as informa\u00e7\u00f5es na forma de um array associativo.<\/li>\n<\/ol>\n<p>O primeiro caso \u00e9 para seguran\u00e7a; o segundo \u00e9 mais ou menos por conveni\u00eancia para tornar a itera\u00e7\u00e3o atrav\u00e9s dos dados mais simples por meio de fun\u00e7\u00f5es de array PHP.<\/p>\n<h2>Consultas de banco de dados no WordPress<\/h2>\n<p>Primeiro, \u00e9 importante entender dois conceitos:<\/p>\n<ol>\n<li>parametriza\u00e7\u00e3o,<\/li>\n<li>coluna_array<\/li>\n<\/ol>\n<p>Esses s\u00e3o o n\u00facleo de como escrevo minhas consultas e trabalho com os resultados delas.<\/p>\n<h3>1 Parametriza\u00e7\u00e3o<\/h3>\n<p>Voc\u00ea pode ler mais sobre isso no Codex, mas a parametriza\u00e7\u00e3o \u00e9 uma maneira de escrever consultas que funcionam para evitar inje\u00e7\u00e3o de SQL.<\/p>\n<p><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Protect_Queries_Against_SQL_Injection_Attacks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Na p\u00e1gina do Codex<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Todos os dados em consultas SQL devem ter escape de SQL antes que a consulta SQL seja executada para evitar ataques de inje\u00e7\u00e3o de SQL. O <code>prepare<\/code>m\u00e9todo executa essa funcionalidade para o WordPress, que suporta uma sintaxe semelhante a <a href=\"https:\/\/php.net\/sprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf()<\/a> e <a href=\"https:\/\/php.net\/vsprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vsprintf()<\/a>.<\/p>\n<\/blockquote>\n<p>Isso quer dizer que o m\u00e9todo suporta tokens como <strong>%s<\/strong>, <strong>%d<\/strong> e <strong>%f<\/strong> ao passar informa\u00e7\u00f5es para a consulta. Vou mostrar um exemplo disso mais tarde no post.<\/p>\n<h3>2 Trabalhando com colunas de matriz<\/h3>\n<p>Os resultados de tais consultas podem ser retornados de v\u00e1rias maneiras diferentes. Ou seja, como um objeto, uma matriz indexada numericamente ou uma matriz associativa. Na maioria das vezes, gosto de usar arrays (e mostrarei como fazer isso no WordPress mais adiante neste post).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162387-61e73d7998688.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162387-61e73d7998688.png\" alt=\"Um esbo\u00e7o para trabalhar com consultas de banco de dados no WordPress\" ><\/a><\/p>\n<p>A raz\u00e3o, por\u00e9m, \u00e9 para que eu possa tirar proveito de <a href=\"https:\/\/php.net\/manual\/en\/function.array-column.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_column<\/a>. Do manual do PHP:<\/p>\n<blockquote>\n<p>array_column() retorna os valores de uma \u00fanica coluna da entrada, identificada pela column_key. Opcionalmente, uma index_key pode ser fornecida para indexar os valores na matriz retornada pelos valores da coluna index_key da matriz de entrada.<\/p>\n<\/blockquote>\n<p>Isso significa que, se voc\u00ea tiver uma matriz e ela tiver v\u00e1rios resultados, cada um com a mesma coluna, voc\u00ea pode simplesmente simplesmente passar a informa\u00e7\u00e3o passando a matriz para um m\u00e9todo e, em seguida, passando o nome da coluna para um m\u00e9todo.<\/p>\n<p>O resultado? Uma matriz numericamente indexada dos valores. Isso torna muito mais f\u00e1cil iterar pelos dados por meio de <a href=\"https:\/\/php.net\/manual\/en\/function.array-map.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_map<\/a><strong>,<\/strong> usando <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.for.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">for<\/a><\/strong> ou usando <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.foreach.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">foreach<\/a><\/strong>.<\/p>\n<h2>Um esbo\u00e7o para consultar o banco de dados<\/h2>\n<p>Com essa l\u00f3gica em vigor, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-00-query-stub-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqui est\u00e1 o stub<\/a><\/strong> que normalmente uso sempre que estou trabalhando diretamente com consultas de banco de dados:<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        \",\n        $userId\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n  return;\n}\n$results = array_map($results, 'column_name');<\/code><\/pre>\n<p>E aqui est\u00e1 um exemplo com algumas informa\u00e7\u00f5es diferentes para que voc\u00ea possa ver <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-01-example-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como funciona<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT\n            user_id,\n            meta_value\n        FROM $wpdb-&gt;usermeta\n        WHERE meta_key LIKE %s\n        AND user_id = %d\n        \",\n        '%wc_authorize_net_cim_customer_profile_id%',\n        wp_get_current_user()-&gt;ID;\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n    return [];\n}\n$results = array_map($results, 'meta_value');<\/code><\/pre>\n<p>Consultar a tabela <strong>wp_user_meta<\/strong> pode parecer bobo, j\u00e1 que get_user_meta \u00e9 uma fun\u00e7\u00e3o de API v\u00e1lida, mas achei que seria uma consulta f\u00e1cil de entender, dado o que estou tentando explicar no passado.<\/p>\n<p>De qualquer forma, n\u00e3o posso fornecer a consulta nem posso lidar com o caso em que os resultados podem voltar com v\u00e1rias colunas (nesse caso, voc\u00ea ter\u00e1 que trabalhar com algo diferente de <strong>array_map<\/strong>, mas isso deve ser f\u00e1cil, certo? )<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1 uma maneira consistente de consultar o banco de dados do WordPress. Como h\u00e1 momentos em que tenho feito isso com mais frequ\u00eancia, ultimamente, aqui est\u00e1 um formato b\u00e1sico para trabalhar com consultas de banco de dados no WordPress.<\/p>\n","protected":false},"author":1,"featured_media":235713,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846,867],"tags":[1170],"class_list":["post-230897","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230897","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230897"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230897\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/235713"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}