{"id":231332,"date":"2022-12-27T12:05:00","date_gmt":"2022-12-27T09:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231332"},"modified":"2022-12-27T12:19:54","modified_gmt":"2022-12-27T09:19:54","slug":"consultas-de-base-de-datos-para-actualizar-datos-rapidamente-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/consultas-de-base-de-datos-para-actualizar-datos-rapidamente-parte-2\/","title":{"rendered":"Consultas de base de datos para actualizar datos r\u00e1pidamente, parte 2"},"content":{"rendered":"\n<p>Esta es la segunda y \u00faltima parte de una serie sobre, como sugiere el t\u00edtulo, consultas directas a bases de datos. Espec\u00edficamente, se trata de cambiar los estados de las publicaciones (pero es relevante para m\u00e1s que eso).<\/p>\n<p>Foto de Ross Findon en Unsplash<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/es\/consultas-de-bases-de-datos-para-actualizar-datos-rapidamente-parte-1\/\" title=\"De la publicaci\u00f3n anterior:\">De la publicaci\u00f3n anterior:<\/a><\/p>\n<blockquote>\n<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 basada en metadatos.<\/p>\n<\/blockquote>\n<p>Y el c\u00f3digo provisto en esa publicaci\u00f3n funciona, pero si est\u00e1 buscando hacerlo m\u00e1s orientado a objetos, entonces se puede hacer m\u00e1s trabajo.<\/p>\n<p>Sin embargo, antes de saltar a la publicaci\u00f3n real, es importante tener en cuenta que cuando se trata de programaci\u00f3n orientada a objetos, hay mucho trabajo que se puede dedicar al dise\u00f1o de la clase y la creaci\u00f3n de niveles de abstracci\u00f3n.<\/p>\n<p>En alg\u00fan momento, tiene que trazar la l\u00ednea proverbial entre cu\u00e1ndo va a usar interfaces, qu\u00e9 tan granulares van a ser sus clases en t\u00e9rminos de lo que est\u00e1n abstrayendo, y cosas por el estilo.<\/p>\n<p>Y el prop\u00f3sito de esta publicaci\u00f3n es ayudar a proporcionar un mejor dise\u00f1o orientado a objetos, pero no es un ejercicio, es hacer que esto sea lo m\u00e1s \u00f3ptimo posible. Hablo de temas como este en <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">otra serie de publicaciones<\/a>.<\/p>\n<p>Pero tenga eso en cuenta cuando lea el c\u00f3digo en el resto de la publicaci\u00f3n.<\/p>\n<h2>Consultas de base de datos para actualizar datos r\u00e1pidamente, parte 2<\/h2>\n<p>Dado donde lo dejamos, tenemos una sola funci\u00f3n que hace lo siguiente:<\/p>\n<ol>\n<li>recuperar todas las publicaciones asociadas con una clave meta espec\u00edfica,<\/li>\n<li>determinar si necesitamos salir temprano,<\/li>\n<li>actualizar el estado de publicaci\u00f3n de cualquier publicaci\u00f3n existente.<\/li>\n<\/ol>\n<p>Lo primero que debe tener en cuenta es que una sola funci\u00f3n es demasiado, por lo que debe dividirse en varias otras funciones. Y dado que est\u00e1 orientado a objetos, debemos asegurarnos de que lo que sea que est\u00e9 haciendo una funci\u00f3n no se base necesariamente en pasos anteriores; de eso se trata precisamente la programaci\u00f3n procedimental.<\/p>\n<p>En su lugar, aprovecharemos esta oportunidad para configurar funciones, de modo que operen con cualquier dato que se les pase, independientemente de c\u00f3mo llegaron all\u00ed.<\/p>\n<p>Finalmente, depende de usted, como desarrollador, determinar si desea tener una sola clase para hacer esto, m\u00e1s de una clase o tener un conjunto de clases relacionadas que heredan de una clase principal.<\/p>\n<p>Nuevamente, se trata de qu\u00e9 tan abstracto desea hacer el c\u00f3digo.<\/p>\n<p>Por ahora, sin embargo, sigamos adelante con la separaci\u00f3n.<\/p>\n<h3>1 Tome las ID de publicaci\u00f3n con la clave meta asociada<\/h3>\n<p>Al igual que en la primera publicaci\u00f3n, queremos asegurarnos de que estamos recuperando los ID de publicaci\u00f3n que est\u00e1n relacionados con una clave meta espec\u00edfica.<\/p>\n<p>En aras de hacer que esta funci\u00f3n sea lo m\u00e1s flexible posible, la configuraremos para:<\/p>\n<ul>\n<li>aceptar la clave meta como una cadena,<\/li>\n<li>devolver una matriz<\/li>\n<\/ul>\n<p>La funci\u00f3n entonces se ver\u00e1 algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\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            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>En la primera publicaci\u00f3n, dividimos esto en tres pasos (que tambi\u00e9n se describen arriba). Aqu\u00ed, sin embargo, podemos combinar el segundo y el tercer paso en una sola funci\u00f3n.<\/p>\n<h3>2 Actualizar el estado de la publicaci\u00f3n<\/h3>\n<p>Como mencion\u00e9, el \u00fanico aspecto de la programaci\u00f3n orientada a objetos es asegurarse de que las funciones que estamos usando sean independientes de c\u00f3mo se generaron los datos que est\u00e1n recibiendo.<\/p>\n<p>En su lugar, tienen un solo algoritmo para ejecutar para centrarse en los datos que se pasan a la funci\u00f3n. En este caso, queremos tomar el conjunto de resultados, que son ID de publicaci\u00f3n, y actualizar su estado de publicaci\u00f3n para que est\u00e9 configurado como <strong>borrador<\/strong>.<\/p>\n<p>Esto significa que la funci\u00f3n aceptar\u00e1 una matriz pero no devolver\u00e1 nada. Potencialmente, podr\u00eda hacer que realice un seguimiento de muchas publicaciones que actualiz\u00f3 (o si actualiz\u00f3 algo), pero estoy enfocado en refactorizar el c\u00f3digo que ya tenemos.<\/p>\n<p>As\u00ed que eso es lo que vamos a hacer. Y lo primero es asegurarse de que haya datos reales con los que trabajar. Y si es as\u00ed, itere a trav\u00e9s de la lista de ID de publicaci\u00f3n y <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cambie su estado de publicaci\u00f3n:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\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) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Puede ver que no es muy diferente del trabajo que se realiz\u00f3 en la primera publicaci\u00f3n, pero ahora plantea algunas preguntas.<\/p>\n<h3>3 Consideraciones orientadas a objetos<\/h3>\n<p>Cuando se trabaja con c\u00f3digo como este:<\/p>\n<ul>\n<li>\u00bfPertenece todo a la misma clase oa clases separadas?<\/li>\n<li>\u00bfDeber\u00eda haber una clase base y, de ser as\u00ed, por qu\u00e9 o por qu\u00e9 no?<\/li>\n<li>\u00bfDeber\u00eda invocarse una sola funci\u00f3n p\u00fablica que llame a estos m\u00e9todos (y marcarlos como privados)?<\/li>\n<li>\u00bfDeber\u00edamos dejar las funciones p\u00fablicas?<\/li>\n<\/ul>\n<p>Para esta publicaci\u00f3n, voy a hacer lo siguiente:<\/p>\n<ul>\n<li><strong>Exponga cada funci\u00f3n como un m\u00e9todo p\u00fablico<\/strong>. Esto es para que si se devuelven datos del primer m\u00e9todo, potencialmente podr\u00eda hacer algo m\u00e1s con ellos.<\/li>\n<li><strong>Mant\u00e9ngalo contenido en una sola clase<\/strong>. De esta manera, podemos instanciar una sola clase y luego usarla para hacer cualquier trabajo que necesitemos hacer. Si hubiera otros m\u00e9todos, usar\u00edamos esos mismos m\u00e9todos.<\/li>\n<li><strong>Comience con la interfaz<\/strong>. No me voy a molestar en escribir una interfaz con el \u00fanico prop\u00f3sito de mostrar una interfaz (supongo que es bastante f\u00e1cil de deducir dadas las funciones que tenemos ahora), pero voy a tomar la clase y mostrar c\u00f3mo podemos invocar el funciona &quot;de afuera hacia adentro&quot;.<\/li>\n<\/ul>\n<p>As\u00ed que voy a empezar con <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el \u00faltimo punto<\/a> y trabajar hacia atr\u00e1s. Aqu\u00ed hay una forma en que puede trabajar con el c\u00f3digo:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>Y luego, as\u00ed es como se ve <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toda la clase :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\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                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\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) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>En t\u00e9rminos generales, servir\u00e1 para los mismos prop\u00f3sitos que el primero, pero de una manera m\u00e1s orientada a objetos.<\/p>\n<h2>ese no es el camino<\/h2>\n<p>Como he intentado reiterar varias veces a trav\u00e9s de esta publicaci\u00f3n, esta no es la forma definitiva de hacer este trabajo. En cambio, es una forma en que se puede hacer el trabajo.<\/p>\n<p>Puede redise\u00f1ar, refactorizar o reutilizar esto como mejor le parezca. Sin embargo, el prop\u00f3sito es mostrar c\u00f3mo desacoplar la l\u00f3gica que normalmente vemos como procedimental en algo que sea un poco menos dependiente de s\u00ed mismo y deje espacio para trabajo adicional.<\/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>Uso de principios orientados a objetos para mejorar el dise\u00f1o de clases para escribir consultas de bases de datos para actualizar r\u00e1pidamente los datos.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,831,914,840],"tags":[1172],"class_list":["post-231332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-otro","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231332","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=231332"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231332\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}