{"id":230512,"date":"2022-12-08T13:27:00","date_gmt":"2022-12-08T10:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230512"},"modified":"2022-12-07T11:53:20","modified_gmt":"2022-12-07T08:53:20","slug":"un-trozo-para-trabajar-con-consultas-de-bases-de-datos-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/un-trozo-para-trabajar-con-consultas-de-bases-de-datos-en-wordpress\/","title":{"rendered":"Un trozo para trabajar con consultas de bases de datos en WordPress"},"content":{"rendered":"\n<p>Por mucho que sea un fan\u00e1tico de ciertas API de WordPress para consultar la base de datos, 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>y as\u00ed<\/li>\n<\/ul>\n<p>Tambi\u00e9n soy fan\u00e1tico de consultar directamente en la base de datos cuando sea necesario.<\/p>\n<p>Como notar\u00e1, hay una manera consistente en la que hago esto y dado que hay momentos en los que lo he estado haciendo con m\u00e1s frecuencia, \u00faltimamente, aqu\u00ed hay un formato b\u00e1sico para trabajar con consultas de bases de datos en WordPress.<\/p>\n<p>Sin embargo, si hago esto, generalmente hay cosas que tengo en cuenta:<\/p>\n<ol>\n<li>siempre aseg\u00farese de que la consulta est\u00e9 parametrizada (especialmente en el caso de la entrada del usuario),<\/li>\n<li>devolver la informaci\u00f3n en forma de matriz asociativa.<\/li>\n<\/ol>\n<p>El primer caso es por seguridad; el segundo es m\u00e1s o menos por conveniencia para simplificar la iteraci\u00f3n a trav\u00e9s de los datos a trav\u00e9s de las funciones de matriz de PHP.<\/p>\n<h2>Consultas de base de datos en WordPress<\/h2>\n<p>Primero, es importante entender dos conceptos:<\/p>\n<ol>\n<li>parametrizaci\u00f3n,<\/li>\n<li>matriz_columna<\/li>\n<\/ol>\n<p>Estos son el n\u00facleo de c\u00f3mo hago para escribir mis consultas y trabajar con los resultados de las mismas.<\/p>\n<h3>1 Parametrizaci\u00f3n<\/h3>\n<p>Puede leer m\u00e1s sobre esto en el Codex, pero la parametrizaci\u00f3n es una forma en que podemos escribir consultas que funcionan para evitar la inyecci\u00f3n 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\">De la p\u00e1gina del Codex<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Todos los datos en las consultas SQL deben tener escape SQL antes de que se ejecute la consulta SQL para evitar ataques de inyecci\u00f3n SQL. El <code>prepare<\/code>m\u00e9todo realiza esta funcionalidad para WordPress, que admite una sintaxis similar a <a href=\"https:\/\/php.net\/sprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf()<\/a> y <a href=\"https:\/\/php.net\/vsprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vsprintf()<\/a>.<\/p>\n<\/blockquote>\n<p>Es decir, el m\u00e9todo admite tokens como <strong>%s<\/strong>, <strong>%d<\/strong> y <strong>%f<\/strong> al pasar informaci\u00f3n a la consulta. Mostrar\u00e9 un ejemplo de esto m\u00e1s adelante en la publicaci\u00f3n.<\/p>\n<h3>2 Trabajar con columnas de matriz<\/h3>\n<p>Los resultados de tales consultas se pueden devolver de varias maneras diferentes. Es decir, como un objeto, una matriz indexada num\u00e9ricamente o una matriz asociativa. La mayor\u00eda de las veces, me gusta usar arreglos (y mostrar\u00e9 c\u00f3mo hacerlo en WordPress m\u00e1s adelante en esta publicaci\u00f3n).<\/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=\"Un trozo para trabajar con consultas de bases de datos en WordPress\" ><\/a><\/p>\n<p>Sin embargo, la raz\u00f3n es que puedo aprovechar <a href=\"https:\/\/php.net\/manual\/en\/function.array-column.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_column<\/a>. Del manual de PHP:<\/p>\n<blockquote>\n<p>array_column() devuelve los valores de una sola columna de la entrada, identificada por column_key. Opcionalmente, se puede proporcionar una clave_\u00edndice para indexar los valores en la matriz devuelta por los valores de la columna clave_\u00edndice de la matriz de entrada.<\/p>\n<\/blockquote>\n<p>Esto significa que si tiene una matriz y tiene un mont\u00f3n de resultados, cada uno de los cuales tiene la misma columna, puede simplificar f\u00e1cilmente la informaci\u00f3n pasando la matriz a un m\u00e9todo y luego pasando el nombre de la columna a un m\u00e9todo.<\/p>\n<p>\u00bfEl resultado? Una matriz indexada num\u00e9ricamente de los valores. Esto hace que sea mucho m\u00e1s f\u00e1cil iterar a trav\u00e9s de los datos a trav\u00e9s 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> o <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>Un trozo para consultar la base de datos<\/h2>\n<p>Con esa l\u00f3gica en su lugar, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-00-query-stub-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqu\u00ed est\u00e1 el c\u00f3digo auxiliar<\/a><\/strong> que normalmente uso cada vez que trabajo directamente con consultas de base de datos:<\/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>Y aqu\u00ed hay un ejemplo con un par de datos diferentes para que puedas ver <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-01-example-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3mo 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 la tabla <strong>wp_user_meta<\/strong> puede parecer una tonter\u00eda ya que get_user_meta es una funci\u00f3n de API v\u00e1lida, pero pens\u00e9 que ser\u00eda una consulta f\u00e1cil de entender dado lo que estoy tratando de explicar en el pasado.<\/p>\n<p>De todos modos, no puedo proporcionar la consulta ni puedo manejar el caso en que los resultados pueden regresar con varias columnas (en ese caso, tendr\u00e1 que trabajar con algo diferente a <strong>array_map<\/strong>, pero eso deber\u00eda ser bastante f\u00e1cil, \u00bfverdad? )<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hay una forma consistente en la que consulto la base de datos de WordPress. Dado que hay momentos en los que he estado haciendo esto con m\u00e1s frecuencia, \u00faltimamente, aqu\u00ed hay un formato b\u00e1sico para trabajar con consultas de bases de datos en 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":[892,716,840,861],"tags":[1172],"class_list":["post-230512","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230512"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230512\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/235713"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230512"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}