{"id":230446,"date":"2022-12-06T16:10:00","date_gmt":"2022-12-06T13:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230446"},"modified":"2022-12-06T16:11:39","modified_gmt":"2022-12-06T13:11:39","slug":"sobre-escribir-funciones-legibles-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/sobre-escribir-funciones-legibles-de-wordpress\/","title":{"rendered":"Sobre escribir funciones legibles de WordPress"},"content":{"rendered":"\n<p>Una de las cosas que encuentro constantemente interesante (tanto desde el punto de vista de la programaci\u00f3n como desde el punto de vista de WordPress), es esto:<\/p>\n<p>Me gusta mantener el c\u00f3digo separado, de modo que el c\u00f3digo responsable de interactuar con WordPress se relegue a su espacio de nombres, mientras que el resto de nuestro c\u00f3digo tiene un espacio de nombres apropiado en otro lugar.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/una-guia-simple-para-organizar-clases-centradas-en-wordpress\/\" title=\"Creo que esto es obvio\">Creo que esto es obvio<\/a><\/strong>, sin embargo.<\/p>\n<p>Sin embargo, cuando se trata de escribir c\u00f3digo, esto no significa que deba dejarse simplemente en c\u00f3mo escribimos nuestras clases y luego las organizamos. \u00bfQu\u00e9 pasa con las cosas a un nivel un poco m\u00e1s granular?<\/p>\n<p>Es decir, \u00bfqu\u00e9 pasar\u00eda si consider\u00e1ramos los m\u00e9todos como parte de un todo m\u00e1s amplio y nos asegur\u00e1ramos de que tambi\u00e9n est\u00e1n haciendo bien su trabajo? Claro, gente como <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> ha estado escribiendo sobre este tipo de cosas durante la mayor parte de su carrera y predic\u00e1ndolo a personas como nosotros.<\/p>\n<p>Pero estos conceptos son algo que simplemente comienzas a hacer y luego los aplicas para siempre. Los paradigmas cambian, somos mejores hoy que ayer, y puede haber m\u00faltiples formas de lograr el mismo tipo de cosas.<\/p>\n<p>Entonces, cuando se trata de crear funciones legibles de WordPress para un dominio espec\u00edfico, \u00bfc\u00f3mo ser\u00eda eso?<\/p>\n<h2>Funciones legibles de WordPress<\/h2>\n<p>Para aquellos que est\u00e1n familiarizados con los principios <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> o cualquier cosa que hable sobre escribir un buen c\u00f3digo, una de las cosas sobre las que muchas de esas personas escriben es la longitud que debe tener un m\u00e9todo.<\/p>\n<p>Tiendo a tomarlos como reglas en lugar de leyes porque, a veces, los m\u00e9todos no pueden ser tan breves. Quiero decir, supongo que podr\u00edan, pero en alg\u00fan momento se siente como una microgesti\u00f3n del c\u00f3digo, \u00bfverdad?<\/p>\n<p>Y hacer algo por el hecho de hacerlo es una cosa, pero hacer algo por el bien de la programaci\u00f3n significativa es otra. Elegir\u00e9 lo \u00faltimo cada vez.<\/p>\n<p>De todos modos, aqu\u00ed hay un ejemplo: digamos que tiene un c\u00f3digo que se llama a trav\u00e9s de Ajax y antes de continuar con la operaci\u00f3n, necesita saber si existe un tipo de publicaci\u00f3n personalizada.<\/p>\n<p>Los pasos para hacer algo como esto podr\u00edan ser los siguientes:<\/p>\n<ul>\n<li>iniciar la llamada Ajax,<\/li>\n<li>verifique el nonce de seguridad para verificar que sea una solicitud v\u00e1lida,<\/li>\n<li>verifique si existen datos,<\/li>\n<li>si lo hace, devuelva un mensaje de \u00e9xito; si no, devuelve un mensaje de error.<\/li>\n<\/ul>\n<p>Todo esto se puede hacer dentro de un solo mensaje, claro, pero supongamos que queremos escribir esto en una serie de llamadas que son f\u00e1ciles de leer donde el c\u00f3digo se autodocumenta, hasta cierto punto (esto no significa que yo Estoy en contra de los comentarios, no lo estoy en absoluto, pero eso no significa que queramos que nuestro c\u00f3digo no sea claro, \u00bfo s\u00ed?).<\/p>\n<p>Primero, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la llamada Ajax<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Luego <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tenemos una funci\u00f3n<\/a><\/strong> en el lado del servidor para verificar expl\u00edcitamente el nonce de seguridad (esto, por supuesto, asume que lo est\u00e1 configurando correctamente en el front-end):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>Despu\u00e9s de eso, queremos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comprobar si existen datos:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>Desde aqu\u00ed, podemos trabajar con el objeto de respuesta de Ajax evaluando su propiedad de \u00e9xito y reaccionando en consecuencia.<\/p>\n<h2>Yendo un paso m\u00e1s all\u00e1<\/h2>\n<p>Sin embargo, llevemos esto un paso m\u00e1s all\u00e1 y digamos que los productos existen y queremos recuperar todos sus ID de publicaci\u00f3n. Hacer esto con WP_Query es bastante f\u00e1cil pero digamos, por diversi\u00f3n, queremos interactuar directamente con la base de datos.<\/p>\n<p>Tenga en cuenta que esto es m\u00e1s un ejercicio para mostrar una forma de hacer algo en lugar de argumentar a favor del uso de <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> sobre <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. Eso es contenido para otra publicaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.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-162675-61e7429944302.png\" alt=\"Sobre escribir funciones legibles de WordPress\"><\/a><\/p>\n<p>De todos modos, hemos determinado que los datos existen. Entonces, tomemos una matriz de todas las ID de publicaci\u00f3n y devolv\u00e1mosla o una matriz vac\u00eda. Tal vez esto ser\u00eda <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">algo como esto:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>Una vez que se devuelven los valores, podemos operar con ellos como mejor nos parezca.<\/p>\n<h2>\u00bfCu\u00e1l es el prop\u00f3sito de todo esto?<\/h2>\n<p>En t\u00e9rminos generales, es para ayudarnos a pensar en el c\u00f3digo de tal manera que podamos leerlo casi tan cerca como sea posible de la palabra escrita. Es decir, podemos se\u00f1alar un fragmento de c\u00f3digo como, por ejemplo:<\/p>\n<blockquote>\n<p>Primero, veremos si algo existe. Si no, enviaremos un error; de lo contrario, tomaremos los datos y luego trabajaremos en ellos.<\/p>\n<\/blockquote>\n<p>De acuerdo, estoy hablando en t\u00e9rminos menos concretos aqu\u00ed, pero eso es porque no necesariamente s\u00e9 con qu\u00e9 est\u00e1s trabajando m\u00e1s de lo que sabes sobre mi trabajo. Pero entiendes la idea, \u00bfverdad?<\/p>\n<p>Y adem\u00e1s, si est\u00e1 buscando un c\u00f3digo de prueba de unidad que est\u00e9 desacoplado de WordPress, esto se puede hacer mediante el uso de interfaces que simulan las funciones o incluso que ejecutan consultas directas en la base de datos sin necesidad de usar WordPress.<\/p>\n<p>Pero, al igual que con algunos de los puntos mencionados anteriormente, ese es un tema para otra publicaci\u00f3n.<\/p>\n<p>Actualmente estoy escribiendo un libro electr\u00f3nico (junto con una variedad de otro contenido premium). Si est\u00e1s interesado, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">echa un vistazo a lo que obtienes<\/a>.<\/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>\u00bfQu\u00e9 significa realmente escribir funciones legibles de WordPress? No existe una respuesta correcta \u00fanica, perfecta y precisa, pero tal vez este enfoque ayude.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[861],"tags":[1172],"class_list":["post-230446","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230446","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=230446"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230446\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}