{"id":231315,"date":"2022-12-27T12:15:00","date_gmt":"2022-12-27T09:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231315"},"modified":"2022-12-25T22:34:54","modified_gmt":"2022-12-25T19:34:54","slug":"consultas-de-bases-de-datos-para-actualizar-datos-rapidamente-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/consultas-de-bases-de-datos-para-actualizar-datos-rapidamente-parte-1\/","title":{"rendered":"Consultas de bases de datos para actualizar datos r\u00e1pidamente, parte 1"},"content":{"rendered":"\n<p>Esta no es la primera vez que menciono esto, pero uno de los desaf\u00edos que surgen al hablar sobre escribir consultas directas a la base de datos para actualizar la informaci\u00f3n en la base de datos de WordPress es que te dejas abierto a algo como:<\/p>\n<blockquote>\n<p>S\u00ed, pero hay una API para hacer algo as\u00ed.<\/p>\n<\/blockquote>\n<p>Y, en muchos casos, as\u00ed es. Yo tambi\u00e9n soy un gran fan de usarlos. Pero hay ocasiones en las que las consultas de base de datos parametrizadas directas pueden ser una opci\u00f3n m\u00e1s \u00f3ptima.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159831-61e6fe995df5b.jpg\" 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-159831-61e6fe995df5b.jpg\" alt=\"Consultas de bases de datos para actualizar datos r\u00e1pidamente, parte 1\" ><\/a><\/p>\n<p>No, no es una base de datos, pero \u00bfno ser\u00eda incre\u00edble si se vieran as\u00ed? Foto de Tobias Fischer en Unsplash<\/p>\n<p>Esto, por supuesto, depende del entorno en el que est\u00e9 trabajando y de los requisitos de su proyecto.<\/p>\n<p>Entonces, esta es otra publicaci\u00f3n m\u00e1s que ser\u00e1 una ilustraci\u00f3n de c\u00f3mo usar <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> para actualizar r\u00e1pidamente la informaci\u00f3n basada en metadatos (sin usar algo como <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> o <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a> para manejarlo).<\/p>\n<h2>Consultas de bases de datos para actualizar datos r\u00e1pidamente, parte 1<\/h2>\n<p>Voy a dividir esto en dos partes porque la funci\u00f3n inicial que les voy a mostrar est\u00e1 haciendo m\u00e1s de una cosa.<\/p>\n<p>No soy fan\u00e1tico de eso.<\/p>\n<p>En segundo lugar, tambi\u00e9n es una oportunidad para redise\u00f1ar funciones para que se comporten de una manera m\u00e1s orientada a objetos (que es algo de lo que <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">soy fan\u00e1tico<\/a> y de lo <a href=\"https:\/\/tommcfarlin.com\/object-oriented-programming-using-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que siempre estoy feliz de promover<\/a> ).<\/p>\n<p>Por ahora, sin embargo, perm\u00edtanme exponer el problema en cuesti\u00f3n<\/p>\n<ol>\n<li>Estoy importando un poco de informaci\u00f3n de una API de terceros.<\/li>\n<li>La informaci\u00f3n se asigna a la tabla wp_posts, as\u00ed como a la tabla wp_postmeta.<\/li>\n<li>Hay ciertos metadatos que son criterios para dictar el estado de una publicaci\u00f3n. O, m\u00e1s directamente, si hay una pieza de metadatos, entonces una publicaci\u00f3n debe tener su estado de publicaci\u00f3n configurado como borrador para que no aparezca en la consulta principal.<\/li>\n<\/ol>\n<p>Para abordar esto, deben suceder dos cosas:<\/p>\n<ol>\n<li>Necesitamos los ID de las publicaciones,<\/li>\n<li>Y necesitamos cambiar el estado de las publicaciones.<\/li>\n<\/ol>\n<p>Antes de configurar las consultas y el resto del c\u00f3digo, digamos que la clave meta que estamos usando se llama creativamente <strong>acme-status<\/strong>. Y con eso, comencemos.<\/p>\n<h3>1 Tome las ID de publicaci\u00f3n con la clave meta asociada<\/h3>\n<p>Primero, crearemos una funci\u00f3n llamada <strong>setInactivePosts.<\/strong> Esto es m\u00e1s gen\u00e9rico de lo que ser\u00eda si estuvieras trabajando en un dominio espec\u00edfico, pero entiendes el punto.<\/p>\n<p>Luego, configuraremos una consulta que <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-00-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperar\u00e1 todas las ID de publicaci\u00f3n que tienen esa clave meta espec\u00edfica<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n  \/\/ More to come...\n<\/code><\/pre>\n<p>Aqu\u00ed, tenemos una serie de resultados. Pero antes de hacer nada, debemos asegurarnos de tener datos sobre los cuales operar.<\/p>\n<h3>2 \u00bfSalir temprano?<\/h3>\n<p>Sin embargo, antes de continuar con la actualizaci\u00f3n de la informaci\u00f3n, debemos verificar si hay alg\u00fan resultado. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-01-return-early-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00bfY si no los hay?<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ If there aren't any results, there's nothing to do.\nif (0 === count($results)) {\n    return;\n}\n\n\/\/ More to come...<\/code><\/pre>\n<p>Entonces podemos escabullirnos.<\/p>\n<h3>3 Actualizar el estado de la publicaci\u00f3n<\/h3>\n<p>Pero si hay resultados, debemos iterarlos y actualizar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-02-update-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">su estado de publicaci\u00f3n<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\nforeach ($results as $result) {\n    $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            UPDATE $wpdb-&gt;posts\n            SET post_status = %s\n            WHERE ID = %d\n            \",\n            'draft',\n            (int) ($result-&gt;post_id)) );\n}<\/code><\/pre>\n<p>Entonces, \u00bfc\u00f3mo se ve todo junto?<\/p>\n<h3>4 todos juntos<\/h3>\n<p>Cuando juntamos esta funci\u00f3n m\u00e1s grande de lo necesario, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-03-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esto es lo que ves<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n    \/\/ If there aren't any results, there's nothing to do.\n    if (0 === count($results)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    foreach ($results as $result) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($result-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Pero en la pr\u00f3xima publicaci\u00f3n, reorganizaremos esto un poco para hacerlo m\u00e1s orientado a objetos.<\/p>\n<h3>Una nota para los administradores de bases de datos<\/h3>\n<p>Para aquellos de ustedes que est\u00e1n bien versados \u200b\u200b\u200b\u200ben SQL-fu, entonces saben que esto probablemente se puede abordar en una sola consulta; sin embargo, el prop\u00f3sito de esta publicaci\u00f3n y la publicaci\u00f3n posterior es doble:<\/p>\n<ol>\n<li>Para mostrar c\u00f3mo usar $wpdb para lograr algo r\u00e1pidamente,<\/li>\n<li>Mostrar c\u00f3mo dividir un m\u00e9todo procedimental para hacer algo en un m\u00e9todo orientado a objetos para hacer algo.<\/li>\n<\/ol>\n<p>Dicho esto, gracias por todas las consultas. \ud83d\udc4d\ud83c\udffb<\/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>Esta es otra publicaci\u00f3n m\u00e1s que ser\u00e1 una ilustraci\u00f3n de c\u00f3mo usar $wpdb para actualizar r\u00e1pidamente la informaci\u00f3n mediante consultas directas a la base de datos.<\/p>\n","protected":false},"author":1,"featured_media":237054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,831,914,840,861],"tags":[1172],"class_list":["post-231315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-otro","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231315","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=231315"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/237054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}