{"id":230802,"date":"2022-12-14T16:29:00","date_gmt":"2022-12-14T13:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230802"},"modified":"2022-12-14T16:29:34","modified_gmt":"2022-12-14T13:29:34","slug":"widgets-de-wordpress-comenzando-con-los-estandares","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-comenzando-con-los-estandares\/","title":{"rendered":"Widgets de WordPress: comenzando con los est\u00e1ndares"},"content":{"rendered":"\n<p>El prop\u00f3sito de esta serie es comenzar a profundizar en el trabajo con la programaci\u00f3n orientada a objetos en el contexto de WordPress.<\/p>\n<p>Y dado que la API de widgets de WordPress es una de las API que utiliza pr\u00e1cticas orientadas a objetos, es un lugar l\u00f3gico para comenzar. Adem\u00e1s, nos brindar\u00e1 algunas t\u00e9cnicas fundamentales que podemos usar para aplicar en trabajos futuros a medida que veamos c\u00f3mo crear m\u00e1s proyectos orientados a objetos en WordPress en series futuras.<\/p>\n<p>Hasta ahora, hemos cubierto lo siguiente:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-un-enfoque-orientado-a-objetos\/\" title=\"Widgets de WordPress: un enfoque orientado a objetos\">Widgets de WordPress: un enfoque orientado a objetos<\/a>. La API de Widgets proporciona una s\u00f3lida prueba de fuego y un ejemplo de c\u00f3mo comenzar con la programaci\u00f3n orientada a objetos en WordPress.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-detecta-la-programacion-orientada-a-objetos\/\" title=\"Widgets de WordPress: c\u00f3mo detectar la programaci\u00f3n orientada a objetos\">Widgets de WordPress: c\u00f3mo detectar la programaci\u00f3n orientada a objetos<\/a>. El objetivo es armarlo con todo lo que necesita para detectar pr\u00e1cticas orientadas a objetos.<\/li>\n<\/ol>\n<p>Si no est\u00e1s al d\u00eda, ahora es un buen momento para hacerlo. Y si es as\u00ed, entonces recordar\u00e1 de la \u00faltima publicaci\u00f3n, terminamos con la siguiente nota:<\/p>\n<blockquote>\n<p>Es decir, revisaremos el\u00a0 modelo est\u00e1ndar de <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">widgets de WordPress<\/a><\/strong> y lo refactorizaremos en su estado actual para adoptar est\u00e1ndares de PHP m\u00e1s modernos.<\/p>\n<\/blockquote>\n<p>Para comenzar a actualizar WordPress Widget Boilerplate para seguir dichos est\u00e1ndares, debemos hacer algunas cosas:<\/p>\n<ol>\n<li>crear una rama a partir del modelo existente,<\/li>\n<li>instalar herramientas de calidad de c\u00f3digo,<\/li>\n<li>aseg\u00farese de que nuestro IDE est\u00e9 configurado correctamente,<\/li>\n<li>y comenzar a refactorizar el c\u00f3digo a dichos est\u00e1ndares.<\/li>\n<\/ol>\n<p>Y eso es lo que vamos a empezar a hacer con este post.<\/p>\n<h2>Comenzando con los est\u00e1ndares<\/h2>\n<p>Si ha sido miembro de este sitio durante alg\u00fan tiempo, entonces sabe que prefiero usar Visual Studio Code. Si no, tengo <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un conjunto completo de art\u00edculos<\/a><\/strong> dedicados a c\u00f3mo lo uso (y, por lo tanto, c\u00f3mo lo usaremos a lo largo de esta serie de publicaciones).<\/p>\n<p>Y si est\u00e1 interesado en la cobertura sobre est\u00e1ndares de codificaci\u00f3n, depuraci\u00f3n, IDE, entornos de desarrollo, etc., consulte <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">The Independent WordPress Developer<\/a><\/strong>.<\/p>\n<p>Sin embargo, supongo que si est\u00e1 leyendo esto, entonces ha le\u00eddo todo el material anterior o se siente c\u00f3modo leyendo todo el material anterior.<\/p>\n<p>Dicho esto, comencemos.<\/p>\n<h3>Descargando el Repositorio<\/h3>\n<p>Lo primero que querr\u00e1 hacer es clonar una copia del repositorio. Prefiero hacer esto a trav\u00e9s de la l\u00ednea de comandos.<\/p>\n<p>Adem\u00e1s, tambi\u00e9n creo que merece la pena hacerlo frente a <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/desarrollo-de-complementos-y-temas-contra-wordpress-trunk\/\" title=\"la \u00faltima versi\u00f3n de WordPress\">la \u00faltima versi\u00f3n de WordPress<\/a><\/strong>. Si no tiene una copia de la copia troncal de WordPress de Subversion, puede leer c\u00f3mo configurarla aqu\u00ed; sin embargo, esto es puramente opcional. Puede seguir el resto de este tutorial sin problemas con cualquier versi\u00f3n de WordPress que desee.<\/p>\n<p>Para hacerlo,<\/p>\n<ol>\n<li>Aseg\u00farese de estar en el directorio de <strong>complementos<\/strong> de su instalaci\u00f3n de WordPress<\/li>\n<li>Y luego ingrese los siguientes comandos en una copia de su terminal<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Esto crear\u00e1 un\u00a0 directorio <strong>WordPress-Widget-Boilerplate<\/strong> en su\u00a0 directorio de <strong>complementos<\/strong>. Puede navegar hasta \u00e9l simplemente escribiendo:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>Los resultados de la clonaci\u00f3n del repositorio deber\u00edan verse as\u00ed:<\/p>\n<p>A continuaci\u00f3n, debe asegurarse de cambiar a la\u00a0 rama de <strong>desarrollo<\/strong> que he creado. Es muy f\u00e1cil hacer esto. Pero antes de hacer eso, \u00bfpor qu\u00e9 no configurar el proyecto en Visual Studio?<\/p>\n<h3>Configuraci\u00f3n del c\u00f3digo de Visual Studio<\/h3>\n<p>Los pasos para configurar el proyecto en Visual Studio Code son sencillos:<\/p>\n<ol>\n<li>Arrastre el directorio de Boilerplate al IDE,<\/li>\n<li>Abra el terminal integrado,<\/li>\n<li>Intercambiar sucursales<\/li>\n<\/ol>\n<p>Tal como lo hice anteriormente, proporcionar\u00e9 un screencast sobre c\u00f3mo hacer todo esto. Arrastrar un directorio a Visual Studio Code deber\u00eda ser bastante f\u00e1cil, pero intercambiar ramas en la l\u00ednea de comando puede ser un poco diferente.<\/p>\n<p>Primero, configurando el proyecto en Visual Studio Code:<\/p>\n<\/p>\n<p>Observe aqu\u00ed que tambi\u00e9n abro el terminal integrado presionando el acceso directo CMD+P (estoy en macOS, por lo que su acceso directo puede ser diferente). Luego ingreso el comando para verificar la rama de <strong>desarrollo .<\/strong><\/p>\n<p>Una vez que haga esto, su repositorio local deber\u00eda cambiar a la rama de desarrollo. Puede confirmar que esa es la rama en la que est\u00e1 trabajando escribiendo:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>Y luego revisa el contenido de la terminal. En rigor, debe destacarse el <strong>desarrollo .<\/strong><\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e7262e24cf5.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-161604-61e7262e24cf5.png\" alt=\"Widgets de WordPress: comenzando con los est\u00e1ndares\"><\/a><\/p>\n<p>En este punto, vamos a introducir algunos archivos nuevos en el proyecto. Al final de este tutorial, puede formar un <strong>pull<\/strong> para obtener todo lo que voy a documentar aqu\u00ed. Pero debido a que el prop\u00f3sito de lo que estamos haciendo es doble, es importante asegurarse de que lo estamos haciendo en la secuencia adecuada porque el primer paso es algo que uso en cada proyecto para WordPress en este momento.<\/p>\n<p>Entonces, dicho esto, echemos un vistazo.<\/p>\n<h3>Compositor y calidad del c\u00f3digo<\/h3>\n<p>Lo primero que me gusta hacer es configurar una serie de herramientas para reforzar la calidad del c\u00f3digo. Esto se logra mediante una variedad de paquetes de Composer. \u00c9stos incluyen:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Una herramienta de calidad de c\u00f3digo PHP. No subestime la claridad y el grado en que este repositorio est\u00e1 lleno de informaci\u00f3n. Si alguna vez se queda atascado con alguna de las otras herramientas mencionadas aqu\u00ed, consulte primero la documentaci\u00f3n de este repositorio.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Reparador PHP CS<\/a>. Una herramienta para corregir autom\u00e1ticamente problemas de est\u00e1ndares de codificaci\u00f3n de PHP.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pelusa paralela de PHP<\/a><\/strong>. Esta herramienta verifica la sintaxis de los archivos PHP m\u00e1s r\u00e1pido que la verificaci\u00f3n en serie con una salida m\u00e1s elegante.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. Esta utilidad toma una base de c\u00f3digo fuente PHP dada y busca varios problemas potenciales dentro de esa fuente<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Analizador de PHP<\/a>. Un analizador es \u00fatil para <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el an\u00e1lisis est\u00e1tico<\/a>, la manipulaci\u00f3n de c\u00f3digo y, b\u00e1sicamente, cualquier otra aplicaci\u00f3n que trate con c\u00f3digo mediante programaci\u00f3n.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Administrador de proxy<\/a>. Esta biblioteca tiene como objetivo proporcionar una abstracci\u00f3n para generar varios tipos de clases de proxy.<\/li>\n<\/ul>\n<p>Quiero tener dos cosas claras:<\/p>\n<ol>\n<li>Las herramientas anteriores son lo m\u00ednimo que uso, y es probable que me vea usar herramientas adicionales en el futuro,<\/li>\n<li>las herramientas anteriores ayudar\u00e1n a hacer cumplir las reglas de calidad del c\u00f3digo antes de registrar el c\u00f3digo en un repositorio. Est\u00e1 destinado a complementar la configuraci\u00f3n en su IDE.<\/li>\n<\/ol>\n<p>Para configurar y ejecutar estas herramientas dentro del proyecto, necesitaremos crear un archivo <strong>composer.json que se vea<\/strong> <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a><\/strong> :<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>Recuerde, puede bajar esto manualmente al final de esta publicaci\u00f3n. Sin embargo, si desea seguir adelante, si\u00e9ntase libre de hacerlo manualmente. Nunca quisiera desanimarte de eso. \ud83d\ude42<\/p>\n<p>Una vez que haya creado el\u00a0 archivo <strong>composer.json<\/strong>, querr\u00e1 asegurarse de ejecutar el siguiente comando desde la terminal:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>Esto puede tomar algo de tiempo; sin embargo, una vez hecho esto, deber\u00eda aparecer el siguiente mensaje:<\/p>\n<blockquote>\n<p>\u00a1Cuidado! \u00a1GrumPHP est\u00e1 olfateando tus confirmaciones!<\/p>\n<\/blockquote>\n<p>Para darle una prueba, ingrese el siguiente comando en su terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Dependiendo de c\u00f3mo est\u00e9 trabajando con el proyecto, es posible que vea un resultado similar a este:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e72631d3f32.gif\" 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-161604-61e72631d3f32.gif\" alt=\"Widgets de WordPress: comenzando con los est\u00e1ndares\"><\/a><\/p>\n<p>Pero hay m\u00e1s trabajo por hacer. Es decir, necesitamos:<\/p>\n<ul>\n<li>actualizar nuestro\u00a0 archivo <strong>.gitignore<\/strong> ,<\/li>\n<li>introducir la configuraci\u00f3n para GrumPHP<\/li>\n<li>introducir la configuraci\u00f3n para PHPMD,<\/li>\n<li>introducir la configuraci\u00f3n para PHPCS,<\/li>\n<li>eventualmente, reestructurar la estructura de directorios del repetitivo.<\/li>\n<\/ul>\n<p>Todo hasta el paso final, vamos a tratar de hacerlo en esta publicaci\u00f3n.<\/p>\n<h3>Actualizaci\u00f3n del archivo Ignorar<\/h3>\n<p>Primero, no queremos comprometer el directorio del proveedor o el archivo de bloqueo del compositor. Estos se pueden generar cada vez que un usuario descarga el directorio. Pueden desincronizarse f\u00e1cilmente y agregan un tama\u00f1o enorme al directorio del proyecto.<\/p>\n<p>Con ese fin, su archivo <strong>gitignore<\/strong> deber\u00eda verse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a><\/strong> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\nvendor\/\ncomposer.lock<\/code><\/pre>\n<p>Esto le dice al complemento que ignore cualquier cosa excepto lo que est\u00e1 en la ra\u00edz del directorio del complemento (y algunos de los directorios eventuales que crearemos) junto con algunos archivos b\u00e1sicos que estamos acostumbrados a ver en las instalaciones de WordPress.<\/p>\n<p>Es probable que nunca veas algo de lo que ves, como <strong>wp-config.php<\/strong> o <strong>wp-content\/backups, en el contexto de un complemento, pero estas son directivas est\u00e1ndar de WordPress para ignorar que me gusta tener a mano.<\/strong><\/p>\n<p>Notar\u00e1 que tambi\u00e9n agregu\u00e9\u00a0 el <strong>proveedor\u00a0<\/strong> y el archivo de bloqueo del compositor al final del archivo.<\/p>\n<h3>Configurar GrumPHP<\/h3>\n<p>GrumPHP puede hacer mucho, y si pas\u00f3 tiempo examinando el repositorio antes de leer hasta aqu\u00ed, entonces probablemente lo sepa; sin embargo, lo mantendr\u00e9 lo m\u00e1s simple posible, para que proporcione las instrucciones que necesita para las herramientas que estamos usando <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">y nada m\u00e1s<\/a><\/strong>.<\/p>\n<pre><code>parameters:\n    git_dir: .git\n    bin_dir: vendor\/bin\n    process_timeout: 120\n    tasks:\n      securitychecker:\n      composer:\n      jsonlint:\n      xmllint:\n      yamllint:\n      phplint:\n        exclude:\n          - vendor\/\n      phpcs:\n        metadata:\n          priority: 200\n      phpcsfixer2:\n        allow_risky: true\n        config: '.php_cs.dist'\n        metadata:\n          priority: 300\n      phpparser:\n        visitors:\n          forbidden_function_calls:\n            blacklist:\n              - \"exit\"\n              - \"var_dump\"\n      phpversion:\n        project: '7.1'\n      phpmd:\n        exclude: ['vendor']\n        ruleset: ['phpmd.xml']<\/code><\/pre>\n<p>En resumen, esto dice que ejecute una variedad de controles para:<\/p>\n<ul>\n<li>seguridad,<\/li>\n<li>compositor,<\/li>\n<li>JSON,<\/li>\n<li>xml,<\/li>\n<li>Yaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>analizador PHP,<\/li>\n<li>PHPMD,<\/li>\n<li>y m\u00e1s.<\/li>\n<\/ul>\n<p>Una vez que hayamos terminado de configurar todo lo dem\u00e1s, me asegurar\u00e9 de mostrarte c\u00f3mo encaja todo esto. Pero antes, terminemos de configurar el resto de nuestras utilidades.<\/p>\n<h3>PHPCS<\/h3>\n<p>Esto utiliza dos archivos separados, un\u00a0 archivo <strong>dist<\/strong> y un\u00a0 archivo <strong>XML<\/strong>, cada uno de los cuales tiene prop\u00f3sitos diferentes, aunque muy \u00fatiles.<\/p>\n<p>El primer archivo, <strong>php_cs.dist<\/strong>, que ver\u00e1 en el repositorio al final de esta publicaci\u00f3n, proporciona un encabezado que se aplica a todos los archivos PHP de nuestro proyecto. Tambi\u00e9n aplica algunas reglas diferentes que mejoran la calidad del c\u00f3digo.<\/p>\n<p>Las reglas se explican por s\u00ed mismas, y puede ver lo que se aplicar\u00e1 simplemente mirando cada una de las reglas <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definidas<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\n$header = &lt;&lt;&lt;'EOF'\nThis file is part of the WordPress Widget Boilerplate\n(c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n\nThis source file is subject to the GPL license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixerConfig::create()\n  -&gt;setRiskyAllowed(true)\n  -&gt;setRules([\n    '@PHP56Migration' =&gt; true,\n    '@Symfony' =&gt; true,\n    '@Symfony:risky' =&gt; true,\n    'align_multiline_comment' =&gt; true,\n    'array_syntax' =&gt; ['syntax' =&gt; 'short'],\n    'blank_line_before_statement' =&gt; true,\n    'combine_consecutive_issets' =&gt; true,\n    'combine_consecutive_unsets' =&gt; true,\n    \/\/ one should use PHPUnit methods to set up expected exception instead of annotations\n    'general_phpdoc_annotation_remove' =&gt; ['annotations' =&gt; ['expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp']],\n    'header_comment' =&gt; ['header' =&gt; $header],\n    'heredoc_to_nowdoc' =&gt; true,\n    'list_syntax' =&gt; ['syntax' =&gt; 'long'],\n    'method_argument_space' =&gt; ['ensure_fully_multiline' =&gt; true],\n    'method_chaining_indentation' =&gt; false,\n    'no_extra_consecutive_blank_lines' =&gt; ['tokens' =&gt; ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block']],\n    'no_null_property_initialization' =&gt; true,\n    'no_short_echo_tag' =&gt; true,\n    'no_unneeded_curly_braces' =&gt; true,\n    'no_unneeded_final_method' =&gt; true,\n    'no_unreachable_default_argument_value' =&gt; true,\n    'no_useless_else' =&gt; true,\n    'no_useless_return' =&gt; true,\n    'ordered_class_elements' =&gt; true,\n    'ordered_imports' =&gt; true,\n    'php_unit_construct' =&gt; true,\n    'php_unit_test_class_requires_covers' =&gt; true,\n    'php_unit_dedicate_assert' =&gt; true,\n    'phpdoc_add_missing_param_annotation' =&gt; true,\n    'phpdoc_order' =&gt; true,\n    'phpdoc_types_order' =&gt; ['null_adjustment' =&gt; 'always_last'],\n    'semicolon_after_instruction' =&gt; true,\n    'single_line_comment_style' =&gt; true,\n    'visibility_required' =&gt; ['const', 'property', 'method'],\n    'yoda_style' =&gt; true,\n  ])\n  -&gt;setFinder(\n    PhpCsFixerFinder::create()\n      -&gt;exclude(__DIR__. '\/vendor\/*')\n      -&gt;in([\n        __DIR__. '\/src'\n      ])) ;<\/code><\/pre>\n<p>A continuaci\u00f3n, tambi\u00e9n querr\u00e1 crear el archivo XML para complementar el archivo anterior. Notar\u00e1 que en el archivo que estoy proporcionando, esto es lo que uso para mi trabajo en <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. Adem\u00e1s, tambi\u00e9n reconoce el\u00a0 directorio de <strong>pruebas<\/strong>.<\/p>\n<p>En este punto, no tenemos pruebas unitarias escritas, pero si opta por introducirlas en su widget, estar\u00e1 listo para manejarlas correctamente.<\/p>\n<pre><code>&lt;?xml version=\"1.0\"?&gt;\n&lt;ruleset name=\"Pressware\"&gt;\n    &lt;description&gt;Pressware, LLC Coding Standards&lt;\/description&gt;\n\n    &lt;!-- Scan all files in directory --&gt;\n    &lt;file&gt;.\/src&lt;\/file&gt;\n    &lt;file&gt;.\/tests&lt;\/file&gt;\n    &lt;exclude-pattern&gt;.\/tests\/phpunit\/*&lt;\/exclude-pattern&gt;\n    &lt;!-- Scan only PHP files --&gt;\n    &lt;arg name=\"extensions\" value=\"php\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show colors in console --&gt;\n    &lt;arg value=\"-colors\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show sniff codes in all reports --&gt;\n    &lt;arg value=\"ns\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Use PSR-2 as a base --&gt;\n    &lt;rule ref=\"PSR2\"&gt;&lt;\/rule&gt;\n    &lt;rule ref=\"Generic.Arrays.DisallowLongArraySyntax.Found\" &gt;&lt;\/rule&gt;\n\n    &lt;!-- Force 2 spaces indentation --&gt;\n    &lt;rule ref=\"Generic.WhiteSpace.ScopeIndent\"&gt;\n        &lt;properties&gt;\n            &lt;property name=\"indent\" value=\"4\"&gt;&lt;\/property&gt;\n            &lt;property name=\"tabIndent\" value=\"false\"&gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>Solo hay un peque\u00f1o conjunto de configuraci\u00f3n que especifico aqu\u00ed, pero hasta ahora he encontrado que es m\u00e1s que suficiente para mis necesidades. A medida que descubra m\u00e1s u opte por usar m\u00e1s, ciertamente actualizar\u00e9 el contenido en publicaciones futuras.<\/p>\n<h3>Configurar PHPMD<\/h3>\n<p>Y finalmente, necesitamos configurar PHP Mess Detector (o PHPMD). Afortunadamente, esto usa un archivo XML que usar\u00e1 conjuntos de reglas como se define en el paquete instalado por Composer. Todo lo que tenemos que hacer es hacer referencia a la regla en el archivo de configuraci\u00f3n.<\/p>\n<p>En segundo lugar, tambi\u00e9n proporcionaremos una peque\u00f1a exclusi\u00f3n para un\u00a0 nombre <strong>ShortVariable<\/strong> como ver\u00e1 en la <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">siguiente esencia<\/a><\/strong> :<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\n&lt;ruleset\n    name=\"VersionEyeModule rules\"\n    xmlns=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0\"\n    xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n    xsi:schemaLocation=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0 http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n    xsi:noNamespaceSchemaLocation=\"http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n&gt;\n    &lt;rule ref=\"rulesets\/cleancode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/codesize.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/controversial.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/design.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/unusedcode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/naming.xml\"&gt;\n        &lt;exclude name=\"ShortVariable\"&gt;&lt;\/exclude&gt;\n    &lt;\/rule&gt;\n\n    &lt;rule ref=\"rulesets\/naming.xml\/ShortVariable\"\n          since=\"0.2\"\n          message=\"Avoid variables with short names like {0}. Configured minimum length is {1}.\"\n          class=\"PHPMDRuleNamingShortVariable\"\n          externalInfoUrl=\"http:\/\/phpmd.org\/rules\/naming.html#shortvariable\"&gt;\n        &lt;priority&gt;3&lt;\/priority&gt;\n        &lt;properties&gt;\n            &lt;property name=\"minimum\" description=\"Minimum length for a variable, property or parameter name\" value=\"3\"&gt;&lt;\/property&gt;\n            &lt;property name=\"exceptions\" value=\"id,q,w,i,j,v,e,f,fp\" &gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>Y una vez que todo esto est\u00e9 en su lugar, deber\u00edamos poder ejecutar GrumPHP nuevamente, desde la l\u00ednea de comandos, y tener un conjunto de resultados ligeramente diferente.<\/p>\n<h3>Ejecutando GrumPHP de nuevo<\/h3>\n<p>Introduce lo siguiente en tu terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Y deber\u00edas ver algo como esto:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e726340729e.gif\" 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-161604-61e726340729e.gif\" alt=\"Widgets de WordPress: comenzando con los est\u00e1ndares\"><\/a><\/p>\n<p>Resultados diferentes a la primera vez, \u00bfeh? Esto se debe a que estamos violando algunas reglas y est\u00e1ndares que son una parte moderna de PHP y del desarrollo orientado a objetos.<\/p>\n<p>Y eso es lo que vamos a aclarar en el pr\u00f3ximo post.<\/p>\n<h2>Subiendo<\/h2>\n<p>Entonces, \u00bfde d\u00f3nde viene la naturaleza orientada a objetos de esto? Hasta este punto, hemos estado hablando sobre el uso de la API de Widgets como un modelo orientado a objetos para escribir c\u00f3digo orientado a objetos en WordPress.<\/p>\n<p>Algo de lo que hemos hecho hasta ahora ha sido exactamente eso (hablando sobre sus principios, viendo c\u00f3mo se presenta y m\u00e1s).<\/p>\n<p>Pero como mencion\u00e9 al comienzo de esta publicaci\u00f3n, colocar herramientas de calidad de c\u00f3digo primero nos brinda una base que podemos usar a medida que refactorizamos el modelo (lo que claramente debemos hacer dada la cantidad de rojo que muestra GrumPHP).<\/p>\n<p>Y ah\u00ed es donde comenzaremos en la pr\u00f3xima publicaci\u00f3n de esta serie.<\/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>Una de las mejores maneras de abordar la programaci\u00f3n orientada a objetos es comenzar con est\u00e1ndares y tener herramientas para aplicarlos.<\/p>\n","protected":false},"author":1,"featured_media":235870,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,861],"tags":[1172],"class_list":["post-230802","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230802","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=230802"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230802\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}