{"id":231374,"date":"2022-12-14T16:56:00","date_gmt":"2022-12-14T13:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231374"},"modified":"2022-12-14T16:58:26","modified_gmt":"2022-12-14T13:58:26","slug":"widget-wordpress-a-partire-dagli-standard","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-a-partire-dagli-standard\/","title":{"rendered":"Widget WordPress: a partire dagli standard"},"content":{"rendered":"\n<p>Lo scopo di questa serie \u00e8 iniziare a fare un tuffo pi\u00f9 profondo nel lavorare con la programmazione orientata agli oggetti nel contesto di WordPress.<\/p>\n<p>E poich\u00e9 l&#8217;API dei widget di WordPress \u00e8 una delle API che utilizza pratiche orientate agli oggetti, \u00e8 un punto di partenza logico. Inoltre, ci fornir\u00e0 alcune tecniche di base che possiamo utilizzare per applicare al lavoro futuro mentre vediamo come costruire pi\u00f9 progetti orientati agli oggetti su WordPress nelle serie future.<\/p>\n<p>Finora, abbiamo trattato quanto segue:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-un-approccio-orientato-agli-oggetti\/\" title=\"Widget WordPress: un approccio orientato agli oggetti\">Widget WordPress: un approccio orientato agli oggetti<\/a>. L&#8217;API Widgets fornisce una solida cartina di tornasole ed un esempio di come iniziare con la programmazione orientata agli oggetti in WordPress.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-rileva-la-programmazione-orientata-agli-oggetti\/\" title=\"Widget WordPress: come rilevare la programmazione orientata agli oggetti\">Widget WordPress: come rilevare la programmazione orientata agli oggetti<\/a>. L&#8217;obiettivo \u00e8 fornirti tutto ci\u00f2 di cui hai bisogno per rilevare le pratiche orientate agli oggetti.<\/li>\n<\/ol>\n<p>Se non sei preso, ora \u00e8 un ottimo momento per farlo. E se l&#8217;hai fatto, ricorderai dall&#8217;ultimo post, abbiamo concluso con la seguente nota:<\/p>\n<blockquote>\n<p>Cio\u00e8, rivisiteremo il <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> e lo refactoring nel suo stato attuale per adottare standard PHP pi\u00f9 moderni.<\/p>\n<\/blockquote>\n<p>Per iniziare ad aggiornare il WordPress Widget Boilerplate per seguire detti standard, dobbiamo fare alcune cose:<\/p>\n<ol>\n<li>creare un ramo dal boilerplate esistente,<\/li>\n<li>installare strumenti di qualit\u00e0 del codice,<\/li>\n<li>assicurati che il nostro IDE sia impostato correttamente,<\/li>\n<li>e iniziare il refactoring del codice in base a detti standard.<\/li>\n<\/ol>\n<p>Ed \u00e8 quello che inizieremo a fare con questo post.<\/p>\n<h2>A cominciare dagli standard<\/h2>\n<p>Se sei un membro di questo sito da tempo, allora sai che preferisco usare Visual Studio Code. In caso contrario, ho <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un&#8217;intera serie di articoli<\/a><\/strong> dedicati a come lo uso (e quindi a come lo utilizzeremo in questa serie di post).<\/p>\n<p>E se sei interessato alla copertura relativa a standard di codifica, debugging, IDE, ambienti di sviluppo e cos\u00ec via, dai un&#8217;occhiata a <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>Tuttavia, presumo che se stai leggendo questo, allora hai letto il materiale sopra o ti senti a tuo agio nell&#8217;esaminare tutto il materiale sopra.<\/p>\n<p>Detto questo, iniziamo.<\/p>\n<h3>Download del repository<\/h3>\n<p>La prima cosa che vorrai fare \u00e8 clonare una copia del repository. Preferisco farlo tramite la riga di comando.<\/p>\n<p>Inoltre, penso che valga la pena farlo anche contro <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/sviluppo-di-plugin-e-temi-contro-il-tronco-di-wordpress\/\" title=\"l&#039;ultima versione di WordPress\">l&#8217;ultima versione di WordPress<\/a><\/strong>. Se non hai una copia della copia trunk di Subversion di WordPress, puoi leggere come configurarla qui; tuttavia, questo \u00e8 puramente facoltativo. Puoi seguire il resto di questo tutorial perfettamente con qualsiasi versione di WordPress che desideri.<\/p>\n<p>Fare cos\u00ec,<\/p>\n<ol>\n<li>Assicurati di essere nella directory dei <strong>plugin<\/strong> della tua installazione di WordPress<\/li>\n<li>E quindi inserisci i seguenti comandi in una copia del tuo terminale<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Questo creer\u00e0 una\u00a0 directory <strong>WordPress-Widget-Boilerplate<\/strong> nella directory\u00a0 dei <strong>plugin<\/strong>. Puoi accedervi digitando semplicemente:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>I risultati della clonazione del repository dovrebbero assomigliare a questo:<\/p>\n<p>Successivamente, devi assicurarti di passare al\u00a0 ramo di <strong>sviluppo<\/strong> che ho creato. \u00c8 davvero facile farlo. Ma prima di farlo, perch\u00e9 non impostare il progetto in Visual Studio?<\/p>\n<h3>Configurazione del codice di Visual Studio<\/h3>\n<p>I passaggi per impostare il progetto in Visual Studio Code sono semplici:<\/p>\n<ol>\n<li>Trascina la directory per il Boilerplate nell&#8217;IDE,<\/li>\n<li>Aprire il terminale integrato,<\/li>\n<li>Scambia rami<\/li>\n<\/ol>\n<p>Proprio come ho fatto sopra, fornir\u00f2 uno screencast su come fare tutto questo. Il trascinamento di una directory in Visual Studio Code dovrebbe essere abbastanza semplice, ma lo scambio di rami sulla riga di comando pu\u00f2 essere leggermente diverso.<\/p>\n<p>Innanzitutto, configurando il progetto in Visual Studio Code:<\/p>\n<\/p>\n<p>Nota qui che apro anche il terminale integrato premendo il collegamento CMD + P (sono su macOS, quindi il collegamento potrebbe essere diverso). Quindi inserisco il comando per controllare il ramo di <strong>sviluppo .<\/strong><\/p>\n<p>Dopo averlo fatto, il tuo repository locale dovrebbe passare al ramo di sviluppo. Puoi confermare che \u00e8 la filiale di cui stai lavorando digitando:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>E poi rivedere il contenuto del terminale. A rigor di termini, lo <strong>sviluppo<\/strong> dovrebbe essere evidenziato.<\/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=\"Widget WordPress: a partire dagli standard\"><\/a><\/p>\n<p>A questo punto introdurremo alcuni nuovi file nel progetto. Alla fine di questo tutorial, puoi formare un <strong>pull<\/strong> per ottenere tutto ci\u00f2 che sto per documentare qui. Ma poich\u00e9 lo scopo di ci\u00f2 che stiamo facendo \u00e8 duplice, \u00e8 importante assicurarsi di farlo nella sequenza corretta perch\u00e9 il primo passaggio \u00e8 qualcosa che uso in ogni singolo progetto per WordPress a questo punto.<\/p>\n<p>Quindi, detto questo, diamo un&#8217;occhiata.<\/p>\n<h3>Compositore e qualit\u00e0 del codice<\/h3>\n<p>La prima cosa che mi piace fare \u00e8 impostare una serie di strumenti per rafforzare la qualit\u00e0 del codice. Ci\u00f2 \u00e8 possibile grazie a una variet\u00e0 di pacchetti Composer. Questi includono:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Uno strumento di qualit\u00e0 del codice PHP. Non sottovalutare il chiarimento e il grado in cui questo repository \u00e8 pieno di informazioni. Se rimani bloccato con uno qualsiasi degli altri strumenti qui menzionati, consulta prima la documentazione in questo repository.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Riparatore PHP CS<\/a>. Uno strumento per risolvere automaticamente i problemi relativi agli standard di codifica PHP.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Parallel Lint<\/a><\/strong>. Questo strumento controlla la sintassi dei file PHP pi\u00f9 velocemente del controllo seriale con un output pi\u00f9 elaborato.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. Questa utility prende una data base di codice sorgente PHP e cerca diversi potenziali problemi all&#8217;interno di quella sorgente<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Analizzatore PHP<\/a>. Un parser \u00e8 utile per <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;analisi statica<\/a>, la manipolazione del codice e, sostanzialmente, qualsiasi altra applicazione che si occupa di codice a livello di codice.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Gestore proxy<\/a>. Questa libreria mira a fornire un&#8217;astrazione per la generazione di vari tipi di classi proxy.<\/li>\n<\/ul>\n<p>Voglio essere chiaro su due cose:<\/p>\n<ol>\n<li>Gli strumenti di cui sopra sono il minimo indispensabile che utilizzo e probabilmente mi vedrai utilizzare strumenti aggiuntivi in \u200b\u200bfuturo,<\/li>\n<li>gli strumenti di cui sopra aiuteranno a far rispettare le regole di qualit\u00e0 del codice prima di archiviare il codice in un repository. Ha lo scopo di completare l&#8217;impostazione nel tuo IDE.<\/li>\n<\/ol>\n<p>Per configurare e far funzionare questi strumenti all&#8217;interno del progetto, dovremo creare un\u00a0 file <strong>composer.json<\/strong> che assomigli <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Ricorda, puoi tirarlo gi\u00f9 manualmente alla fine di questo post. Se, tuttavia, desideri continuare, sentiti libero di farlo manualmente. Non vorrei mai scoraggiarti da questo. \ud83d\ude42<\/p>\n<p>Dopo aver creato il\u00a0 file <strong>composer.json<\/strong>, assicurati di eseguire il seguente comando dal terminale:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>Questo potrebbe richiedere del tempo; tuttavia, una volta terminato, dovresti essere presentato con il seguente messaggio:<\/p>\n<blockquote>\n<p>Attento! GrumPHP sta annusando i tuoi impegni!<\/p>\n<\/blockquote>\n<p>Per provarlo, inserisci il seguente comando nel tuo terminale:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>A seconda di come stai lavorando con il progetto, potresti vedere un output simile a questo:<\/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=\"Widget WordPress: a partire dagli standard\"><\/a><\/p>\n<p>Ma c&#8217;\u00e8 pi\u00f9 lavoro da fare. Vale a dire, dobbiamo:<\/p>\n<ul>\n<li>aggiorna il nostro\u00a0 file <strong>.gitignore<\/strong> ,<\/li>\n<li>introdurre la configurazione per GrumPHP<\/li>\n<li>introdurre la configurazione per PHPMD,<\/li>\n<li>introdurre la configurazione per PHPCS,<\/li>\n<li>eventualmente, ristrutturare la struttura della directory di boilerplate.<\/li>\n<\/ul>\n<p>Tutto fino al passaggio finale, mireremo a fare in questo post.<\/p>\n<h3>Aggiornamento del file Ignora<\/h3>\n<p>Innanzitutto, non vogliamo eseguire il commit della directory del fornitore o del file di blocco del compositore. Questi possono essere generati ogni volta che un utente scarica la directory. Possono facilmente perdere la sincronizzazione e aggiungere enormi dimensioni alla directory del progetto.<\/p>\n<p>A tal fine, il tuo file <strong>gitignore<\/strong> dovrebbe assomigliare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Questo dice al plugin di ignorare qualsiasi cosa tranne ci\u00f2 che \u00e8 nella radice della directory del plugin (e alcune delle eventuali directory che creeremo) insieme ad alcuni file di base che siamo abituati a vedere nelle installazioni di WordPress.<\/p>\n<p>Alcuni di ci\u00f2 che vedi, come <strong>wp-config.php<\/strong> o <strong>wp-content\/backups<\/strong> che probabilmente non vedrai mai nel contesto di un plugin, ma queste sono direttive standard di WordPress ignore che mi piace tenere a portata di mano.<\/p>\n<p>Noterai che ho anche aggiunto\u00a0 il <strong>fornitore\u00a0<\/strong> e il file di blocco del compositore nella parte inferiore del file.<\/p>\n<h3>Configura GrumPHP<\/h3>\n<p>GrumPHP pu\u00f2 fare molto e se hai passato del tempo a esaminare il repository prima di leggere fino a qui, probabilmente lo saprai; tuttavia, lo manterr\u00f2 il pi\u00f9 snello possibile, quindi fornisce le istruzioni necessarie per gli strumenti che stiamo utilizzando <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e nient&#8217;altro<\/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>In breve, questo dice di eseguire una serie di controlli per:<\/p>\n<ul>\n<li>sicurezza,<\/li>\n<li>compositore,<\/li>\n<li>JSON,<\/li>\n<li>XML,<\/li>\n<li>Yaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>Analizzatore PHP,<\/li>\n<li>PHPMD,<\/li>\n<li>e altro ancora.<\/li>\n<\/ul>\n<p>Una volta completata la configurazione di tutto il resto, sar\u00f2 sicuro di mostrarti come tutto questo si adatta insieme. Ma prima, finiamo di configurare il resto delle nostre utilit\u00e0.<\/p>\n<h3>PHPCS<\/h3>\n<p>Questo utilizza due file separati, un\u00a0 file <strong>dist<\/strong> e un\u00a0 file <strong>XML<\/strong>, ognuno dei quali ha scopi diversi, anche se molto utili.<\/p>\n<p>Il primo file, <strong>php_cs.dist<\/strong> che vedrai nel repository alla fine di questo post, fornisce un&#8217;intestazione che viene applicata a tutti i file PHP nel nostro progetto. Inoltre, applica alcune regole diverse che migliorano la qualit\u00e0 del codice.<\/p>\n<p>Le regole sono autoesplicative e puoi vedere cosa applicher\u00e0 semplicemente esaminando ciascuna delle regole <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definite<\/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>Successivamente, vorrai anche creare il file XML per completare il file sopra. Noterai che nel file che sto fornendo, questo \u00e8 ci\u00f2 che uso per il mio lavoro in <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. Inoltre, riconosce anche la\u00a0 directory dei <strong>test<\/strong>.<\/p>\n<p>A questo punto, non abbiamo alcun test unitario scritto, ma se scegli di introdurli nel tuo widget, questo sar\u00e0 pronto per gestirli correttamente.<\/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>C&#8217;\u00e8 solo un piccolo set di configurazione che specifico qui, ma finora l&#8217;ho trovato pi\u00f9 che sufficiente per le mie esigenze. Man mano che scopro di pi\u00f9 o scelgo di usarne di pi\u00f9, aggiorner\u00f2 sicuramente il contenuto nei post futuri.<\/p>\n<h3>Configura PHPMD<\/h3>\n<p>Infine, dobbiamo configurare PHP Mess Detector (o PHPMD). Fortunatamente, questo utilizza un file XML che utilizzer\u00e0 i set di regole come definito nel pacchetto installato da Composer. Tutto quello che dobbiamo fare \u00e8 fare riferimento alla regola nel file di configurazione.<\/p>\n<p>In secondo luogo, forniremo anche una piccola esclusione per un\u00a0 nome <strong>ShortVariable<\/strong> come vedrai nel <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seguente succo<\/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>E una volta che tutti questi sono a posto, dovremmo essere in grado di eseguire di nuovo GrumPHP, dalla riga di comando, e avere una serie di risultati leggermente diversa.<\/p>\n<h3>Esecuzione di GrumPHP di nuovo<\/h3>\n<p>Inserisci quanto segue nel tuo terminale:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>E dovresti vedere qualcosa del genere:<\/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=\"Widget WordPress: a partire dagli standard\"><\/a><\/p>\n<p>Risultati diversi rispetto alla prima volta, eh? Questo perch\u00e9 stiamo violando alcune regole e standard che sono una parte moderna di PHP e dello sviluppo orientato agli oggetti.<\/p>\n<p>Ed \u00e8 quello che andremo a ripulire nel prossimo post.<\/p>\n<h2>In arrivo<\/h2>\n<p>Quindi da dove viene la natura orientata agli oggetti di questo? Fino a questo punto, abbiamo parlato dell&#8217;utilizzo dell&#8217;API Widgets come modello orientato agli oggetti per la scrittura di codice orientato agli oggetti in WordPress.<\/p>\n<p>Parte di ci\u00f2 che abbiamo fatto finora \u00e8 stato esattamente questo (parlando dei suoi principi, vedendo come \u00e8 strutturato e altro).<\/p>\n<p>Ma come ho detto all&#8217;inizio di questo post, la creazione di strumenti per la qualit\u00e0 del codice ci fornisce innanzitutto una base che possiamo utilizzare durante il refactoring del boilerplate (cosa che dobbiamo chiaramente fare data la quantit\u00e0 di rosso mostrata da GrumPHP).<\/p>\n<p>Ed \u00e8 qui che inizieremo nel prossimo post di questa serie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno dei modi migliori per affrontare la programmazione orientata agli oggetti \u00e8 iniziare con gli standard e disporre di strumenti per applicarli.<\/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":[896,720,865],"tags":[1168],"class_list":["post-231374","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231374"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231374\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}