{"id":231021,"date":"2022-12-06T16:08:00","date_gmt":"2022-12-06T13:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231021"},"modified":"2022-12-06T16:09:31","modified_gmt":"2022-12-06T13:09:31","slug":"sulla-scrittura-di-funzioni-wordpress-leggibili","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/sulla-scrittura-di-funzioni-wordpress-leggibili\/","title":{"rendered":"Sulla scrittura di funzioni WordPress leggibili"},"content":{"rendered":"\n<p>Una delle cose che trovo costantemente interessante (sia dal punto di vista della programmazione che dal punto di vista di WordPress), \u00e8 questa:<\/p>\n<p>Mi piace mantenere il codice separato in modo tale che il codice responsabile dell&#8217;interazione con WordPress sia relegato nel suo spazio dei nomi mentre il resto del nostro codice \u00e8 posizionato in modo appropriato altrove.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/una-guida-semplice-per-organizzare-classi-incentrate-su-wordpress\/\" title=\"Penso che questo sia ovvio\">Penso che questo sia ovvio<\/a><\/strong>, per\u00f2.<\/p>\n<p>Quando si tratta di scrivere codice, tuttavia, questo non significa che debba essere lasciato semplicemente al modo in cui scriviamo le nostre classi e poi le organizziamo. E le cose a un livello leggermente pi\u00f9 granulare?<\/p>\n<p>Cio\u00e8, e se dovessimo considerare i metodi come parte di un insieme pi\u00f9 ampio e assicurarci che anche loro stiano facendo bene il loro lavoro? Certo, persone come <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> hanno scritto di questo genere di cose per la maggior parte della loro carriera e le hanno predicate a persone come noi.<\/p>\n<p>Ma questi concetti sono qualcosa che inizi semplicemente a fare e poi li applichi per sempre. I paradigmi cambiano, oggi siamo migliori di ieri e potrebbero esserci diversi modi per ottenere lo stesso tipo di cose.<\/p>\n<p>Quindi, quando si tratta di creare funzioni WordPress leggibili per un dominio specifico, come potrebbe essere?<\/p>\n<h2>Funzioni WordPress leggibili<\/h2>\n<p>Per coloro che hanno familiarit\u00e0 con i principi <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> o qualsiasi cosa che parli di scrivere un buon codice, una delle cose di cui molte di quelle persone scrivono \u00e8 la lunghezza a cui dovrebbe essere un metodo.<\/p>\n<p>Tendo a prenderle come regole piuttosto che come leggi perch\u00e9 a volte i metodi non possono essere cos\u00ec brevi. Voglio dire, immagino che potrebbero, ma a un certo punto sembra una microgestione del codice, giusto?<\/p>\n<p>E fare qualcosa per il bene di fare \u00e8 una cosa, ma fare qualcosa per il bene di una programmazione significativa \u00e8 un&#8217;altra. Sceglier\u00f2 il pi\u00f9 tardi ogni volta.<\/p>\n<p>Ad ogni modo, ecco un esempio: diciamo che hai del codice che viene chiamato tramite Ajax e prima di procedere con l&#8217;operazione, devi sapere se esiste un tipo di post personalizzato.<\/p>\n<p>I passaggi per fare qualcosa del genere potrebbero essere i seguenti:<\/p>\n<ul>\n<li>avviare la chiamata Ajax,<\/li>\n<li>controlla la sicurezza nonce per verificare che sia una richiesta valida,<\/li>\n<li>verificare se i dati esistono,<\/li>\n<li>in tal caso, restituisci un messaggio di successo; in caso contrario, restituisce un messaggio di errore.<\/li>\n<\/ul>\n<p>Tutto questo pu\u00f2 essere fatto all&#8217;interno di un singolo messaggio, certo, ma assumiamo di volerlo scrivere in una serie di chiamate di facile lettura in cui il codice si auto-documenta, in una certa misura (questo non significa che io Sono contrario ai commenti \u2013 non lo sono affatto, ma ci\u00f2 non significa che vogliamo che il nostro codice non sia chiaro, vero?).<\/p>\n<p>Innanzitutto, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;Ajax chiama<\/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>Quindi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abbiamo una funzione<\/a><\/strong> lato server per verificare esplicitamente la sicurezza nonce (questo, ovviamente, presuppone che tu lo stia configurando correttamente sul 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>Successivamente, vogliamo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">verificare se i dati esistono:<\/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>Da qui, siamo quindi in grado di lavorare con l&#8217;oggetto risposta Ajax valutandone la propriet\u00e0 success e reagendo di conseguenza.<\/p>\n<h2>Fare un passo avanti<\/h2>\n<p>Facciamo un ulteriore passo avanti e diciamo che i prodotti esistono e vogliamo recuperare tutti i loro ID post. Fare questo con WP_Query \u00e8 abbastanza semplice ma diciamo, per i calci, vogliamo interfacciarci direttamente con il database.<\/p>\n<p>Nota che questo \u00e8 pi\u00f9 un esercizio per mostrare un modo per fare qualcosa piuttosto che discutere per l&#8217;utilizzo di <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> su <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. Questo \u00e8 il contenuto per un altro post.<\/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=\"Sulla scrittura di funzioni WordPress leggibili\"><\/a><\/p>\n<p>Ad ogni modo, quindi abbiamo determinato che i dati esistono. Quindi prendiamo un array di tutti gli ID post e lo restituiamo o un array vuoto. Forse questo sarebbe <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">simile a questo:<\/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 volta restituiti i valori, possiamo quindi operare su di essi come riteniamo opportuno.<\/p>\n<h2>Qual \u00e8 lo scopo di tutto questo?<\/h2>\n<p>In generale, \u00e8 per aiutarci a pensare al codice in modo tale da poterlo leggere il pi\u00f9 vicino possibile alla parola scritta. Cio\u00e8, siamo in grado di indicare un pezzo di codice come dire:<\/p>\n<blockquote>\n<p>Per prima cosa, vedremo se esiste qualcosa. In caso contrario, invieremo un errore; in caso contrario, prenderemo i dati e poi ci lavoreremo.<\/p>\n<\/blockquote>\n<p>Certo, sto parlando in termini meno concreti qui, ma \u00e8 perch\u00e9 non so necessariamente con cosa stai lavorando pi\u00f9 di quanto tu sappia del mio lavoro. Ma ti sei fatto un&#8217;idea, vero?<\/p>\n<p>E inoltre, se stai cercando di unit test del codice che \u00e8 disaccoppiato da WordPress, questo pu\u00f2 essere fatto attraverso l&#8217;uso di interfacce che deridono le funzioni o anche che eseguono query dirette sul database senza la necessit\u00e0 di utilizzare WordPress.<\/p>\n<p>Ma, come con alcuni dei punti sopra menzionati, questo \u00e8 argomento per un post diverso.<\/p>\n<p>Attualmente sto scrivendo un eBook (insieme a una variet\u00e0 di altri contenuti premium). Se sei interessato, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">controlla cosa ottieni<\/a>.<\/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>Cosa significa effettivamente scrivere funzioni WordPress leggibili? Non esiste una risposta giusta, perfetta e precisa, ma forse questo approccio aiuter\u00e0.<\/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":[865],"tags":[1168],"class_list":["post-231021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231021","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=231021"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}