{"id":228530,"date":"2022-10-22T18:46:00","date_gmt":"2022-10-22T15:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228530"},"modified":"2022-11-09T02:52:48","modified_gmt":"2022-11-08T23:52:48","slug":"refactorizacion-de-complementos-de-wordpress-un-pequeno-ejemplo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/refactorizacion-de-complementos-de-wordpress-un-pequeno-ejemplo\/","title":{"rendered":"Refactorizaci\u00f3n de complementos de WordPress: un peque\u00f1o ejemplo"},"content":{"rendered":"\n<p>Una de las formas en que surgen los complementos de WordPress es que, al menos en mi caso, comienzan como una colecci\u00f3n de funciones utilizadas para ayudar con un prop\u00f3sito particular para un proyecto determinado. A partir de ah\u00ed, piensas &quot;Oye, tal vez a alguien m\u00e1s le resulte \u00fatil&quot;.<\/p>\n<p>Al menos esa ha sido mi experiencia la mayor\u00eda de las veces.<\/p>\n<p>Pero la cuesti\u00f3n es que antes de publicarlo para que otras personas lo prueben, desea pasar por el proceso de limpieza del c\u00f3digo. Tampoco estoy hablando de refactorizar los complementos de WordPress, al menos no todav\u00eda.<\/p>\n<p>Estoy hablando de tomar el c\u00f3digo, convertirlo en algo que funcione como un complemento de WordPress y luego posiblemente refactorizar el c\u00f3digo.<\/p>\n<h2>Refactorizaci\u00f3n de complementos de WordPress<\/h2>\n<p>Pasar por todo el proceso de refactorizaci\u00f3n de los complementos de WordPress, por no hablar de un solo complemento de WordPress, puede ser arduo, pero compartir c\u00f3mo refactorizar una parte de un complemento es algo factible.<\/p>\n<p>As\u00ed que usar\u00e9 un ejemplo de c\u00f3mo estaba usando algo recientemente (con el c\u00f3digo resumido un poco para no molestarme en ser espec\u00edfico sobre un proyecto determinado).<\/p>\n<p>Trazar la salida ideal de opciones.<\/p>\n<p>Sin embargo, antes de hacerlo, creo que es importante compartir que mi proceso puede diferir, o probablemente, diferir del suyo (ya que muchos de nosotros tenemos procesos diferentes).<\/p>\n<ol>\n<li>Dise\u00f1e el componente (s\u00ed, ni siquiera el complemento completo) en un cuaderno,<\/li>\n<li>Cree una lista de verificaci\u00f3n de los casos de uso en los que deber\u00eda pasar y cu\u00e1ndo deber\u00eda fallar,<\/li>\n<li>Escriba qu\u00e9 datos se necesitan, c\u00f3mo se necesitan y cu\u00e1ndo se deben ignorar<\/li>\n<li>Convierta todo lo anterior en c\u00f3digo.<\/li>\n<\/ol>\n<p>Por supuesto, no lo convierto todo literalmente en c\u00f3digo, pero entiendes la idea. Quiz\u00e1s la forma m\u00e1s sucinta de decirlo sea as\u00ed:<\/p>\n<ul>\n<li>Comience con un m\u00e9todo largo que sirva para el caso de uso ideal. Luego refactorice ese c\u00f3digo para que las funciones sean m\u00e1s peque\u00f1as y tengan en cuenta los casos en los que el resultado fallar\u00eda.<\/li>\n<\/ul>\n<p>Dicho esto, as\u00ed es como se ver\u00eda el c\u00f3digo.<\/p>\n<h3>1 Escritura para el caso de uso ideal<\/h3>\n<p>En este ejemplo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el caso de uso ideal<\/a> es cuando el usuario carga las opciones, las opciones est\u00e1n presentes y luego necesita realizar una acci\u00f3n si las opciones tienen ciertos valores.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Esta parte deber\u00eda ser f\u00e1cil de leer, pero no tiene en cuenta nada excepto la ruta ideal a trav\u00e9s del c\u00f3digo.<\/p>\n<h3>2 Ponte un poco a la defensiva<\/h3>\n<p>A continuaci\u00f3n, me gusta asegurarme de que las opciones est\u00e9n configuradas antes de intentar leerlas. En algunos casos, es posible que desee mostrar un aviso, generar una excepci\u00f3n o registrar informaci\u00f3n.<\/p>\n<p>En este ejemplo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">solo voy a regresar<\/a> ya que es f\u00e1cil de leer y se puede ajustar m\u00e1s f\u00e1cilmente para su uso.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Entonces eso maneja las opciones, pero \u00bfqu\u00e9 pasa con el caso cuando las opciones est\u00e1n configuradas pero no tienen los valores que esperamos? Esto significa que tambi\u00e9n debemos verificar que lo hagan. Y, si no, ign\u00f3ralos, regresa, registra un error, lanza una excepci\u00f3n, etc.<\/p>\n<p>Ya sabes: Lo mismo que arriba. Excepto que, en este caso, no tomar\u00e9 ninguna acci\u00f3n a menos que el c\u00f3digo tenga la informaci\u00f3n ideal.<\/p>\n<h3>3 Poni\u00e9ndose un poco largo<\/h3>\n<p>En este punto, el m\u00e9todo se est\u00e1 volviendo un poco largo y cada vez m\u00e1s dif\u00edcil de leer. Claro, si es un programador experimentado, puede argumentar que &quot;Esto es c\u00f3digo, no es ingl\u00e9s&quot;, pero \u00bfpor qu\u00e9 no intentar que sea un poco m\u00e1s f\u00e1cil de seguir?<\/p>\n<p>Adem\u00e1s, hace que sea un poco m\u00e1s f\u00e1cil de probar. Pero eso est\u00e1 m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n. Tome la evaluaci\u00f3n de opciones como el primer ejemplo del c\u00f3digo.<\/p>\n<ol>\n<li>Esto es algo que puede incluirse en su funci\u00f3n que no solo a\u00edsla esta verificaci\u00f3n, sino que tambi\u00e9n facilita un poco la llamada resultante.<\/li>\n<li>Luego, tome el segundo bloque de c\u00f3digo que verifica los valores de opci\u00f3n ideales. Esto tambi\u00e9n se puede abstraer por las mismas razones anteriores.<\/li>\n<li>Y finalmente, configure una funci\u00f3n para asegurarse de que los valores esperados est\u00e9n establecidos para cada uno de los <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valores que se especifican<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>As\u00ed que ahora tiene dos m\u00e9todos m\u00e1s peque\u00f1os que encapsulan la misma verificaci\u00f3n que estaba haciendo.<\/p>\n<h3>4 La funci\u00f3n final<\/h3>\n<p>En este punto, la funci\u00f3n final es mucho m\u00e1s f\u00e1cil de leer, ya que tiene dos funciones auxiliares que encapsulan sus responsabilidades, mientras que <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta vuelve a evaluar la ruta ideal a<\/a> trav\u00e9s del c\u00f3digo:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Baste decir que cuando se trata de refactorizar complementos de WordPress, este es solo un ejemplo de c\u00f3mo hacer solo un segmento. Pero es un comienzo, \u00bfverdad?<\/p>\n<h2>Complementos completos?<\/h2>\n<p>\u00bfYo se, verdad? Refactorizar complementos de WordPress no es una broma. Pero si comienza con funciones peque\u00f1as como esta y trabaja gradualmente en el c\u00f3digo base, se vuelve m\u00e1s f\u00e1cil.<\/p>\n<p>Y si dedica tiempo a planificar el proyecto desde el principio, puede ahorrar mucho tiempo al volver atr\u00e1s y refactorizar este tipo de cosas.<\/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>La refactorizaci\u00f3n de complementos de WordPress es un trabajo. Pero si comienza con funciones peque\u00f1as y trabaja gradualmente en el c\u00f3digo base, se vuelve m\u00e1s f\u00e1cil.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,810,716,747,914,861],"tags":[1172],"class_list":["post-228530","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-fuente-abierta","category-otro","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228530","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=228530"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228530\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}