{"id":230468,"date":"2022-11-23T15:32:00","date_gmt":"2022-11-23T12:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230468"},"modified":"2022-11-09T22:31:28","modified_gmt":"2022-11-09T19:31:28","slug":"lavorare-con-classi-modelli-e-parziali-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/lavorare-con-classi-modelli-e-parziali-in-wordpress\/","title":{"rendered":"Lavorare con classi, modelli e parziali in WordPress"},"content":{"rendered":"\n<p>Quando mi sono seduto per iniziare questo post, avevo programmato di scrivere qualcosa di molto pi\u00f9 coinvolto che io condivider\u00f2. Inizialmente, volevo esaminare una di queste due cose:<\/p>\n<ul>\n<li>La guida completa alla creazione di un ambiente di sviluppo,<\/li>\n<li>Integrazione degli strumenti di qualit\u00e0 del codice in PhpStorm<\/li>\n<\/ul>\n<p>Il primo sarebbe concentrarsi su una variet\u00e0 di altre cose di cui ho parlato, collegarle tutte insieme e avere un riferimento definitivo. Ma questo \u00e8 qualcosa che voglio dedicare del tempo a mettere insieme per assicurarmi che sia fatto bene.<\/p>\n<p>Il secondo \u00e8 quello che ritengo importante, ma sono in una fase un po&#8217; di transizione con alcuni dei miei strumenti. Fino a quando non sar\u00e0 fatto, preferirei non scriverne.<\/p>\n<p>Anche ancora, c&#8217;\u00e8 sempre qualcosa da coprire, giusto? Quindi oggi ho optato per qualcosa di pi\u00f9 semplice: abbattere l&#8217;uso di classi, modelli e parziali nei plugin di WordPress usando un semplice esempio.<\/p>\n<h2>Classi, modelli e parziali in WordPress<\/h2>\n<p>Per questo particolare argomento, una domanda immediata che potrebbe venire in mente \u00e8 semplice: perch\u00e9 preoccuparsi di parlarne?<\/p>\n<p>Perch\u00e9 \u00e8 il 2018 e stiamo ancora vedendo un mix grossolano di PHP, CSS, markup e JavaScript in un unico file. Questo non \u00e8 per bussare ad altre tecnologie che lo fanno per impostazione predefinita (come React). Sto parlando specificamente dei plugin di WordPress e della scrittura di codice gestibile in modo tale che sia facile [ovviamente] mantenere, scrivere e leggere.<\/p>\n<h3>Un esempio pratico<\/h3>\n<p>Diciamo che stai lavorando su una pagina di sottomenu per qualcosa che apparir\u00e0 in un menu personalizzato. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-00-addmenupage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Registra la tua pagina<\/a> utilizzando l&#8217;API di WordPress:<\/p>\n<pre><code>&lt;?php\n\npublic function addMenuPage()\n{\n    add_menu_page(\n      'Acme Menu',\n      'Acme Menu',\n      'manage_options',\n      'acme-custom-menu',\n      array($this, 'display'),\n      'dashicons-dashboard',\n      30\n    );\n\n    add_submenu_page(\n      'acme-custom-menu',\n      'Acme Menu',\n      'Acme Menu',\n      'Acme Menu',\n      'acme-custom-menu',\n      array($this, 'display')\n    );\n}\n<\/code><\/pre>\n<p>Ma quando si imposta una funzione di richiamata per visualizzare la pagina, <strong>non si<\/strong> utilizza la funzione per mescolare insieme tutte le varie lingue. Invece, lo usi per <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-01-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">includere un file.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function display()\n{\n    include_once $this-&gt;pluginPath. 'views\/acme-settings.php';\n}\n<\/code><\/pre>\n<p>Nota che nel file sopra, faccio riferimento a una propriet\u00e0 <strong>$this-&gt;pluginPath<\/strong>. Questo \u00e8 impostato nel costruttore della classe in modo che io possa accedere facilmente alla radice del plugin.<\/p>\n<p>Ad ogni modo, come potrebbe essere questo file?<\/p>\n<h3>Un modello e un parziale<\/h3>\n<p>In questo caso, presumo che il tuo modello sia ci\u00f2 che fornir\u00e0 informazioni all&#8217;utente e richieder\u00e0 il loro input. Il parziale sar\u00e0 responsabile della visualizzazione di un messaggio di successo, errore o avviso all&#8217;utente.<\/p>\n<h4>Un modello<\/h4>\n<p>Per semplificare, manterr\u00f2 sia il modello che il parziale il pi\u00f9 snelli possibile. In questo caso, supponiamo di eseguire il rendering di una pagina, chiedere all&#8217;utente di salvare un valore e, se il valore viene salvato correttamente (e quindi esiste nella tabella <strong>wp_options<\/strong> ), visualizzeremo il messaggio di successo.<\/p>\n<p>Questo significa:<\/p>\n<ul>\n<li>il modello visualizzer\u00e0 il titolo della pagina, le informazioni, l&#8217;input e il pulsante di salvataggio,<\/li>\n<li>il parziale visualizzer\u00e0 il messaggio di successo quando necessario.<\/li>\n<\/ul>\n<p>Dai un&#8217;occhiata al codice per <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-02-acme-settings-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il modello qui sotto:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the settings page for the plugin.\n *\/\n?&gt;\n&lt;div class=\"wrap\"&gt;\n    &lt;h1 class=\"wp-heading-inline\"&gt;&lt;?php echo get_admin_page_title(); ?&gt;&lt;\/h1&gt;\n    &lt;?php if ($this-&gt;showSuccessMessage()) { ?&gt;\n      &lt;?php include_once 'partials\/settings-saved.php'; ?&gt;\n    ?&gt;\n    &lt;div id=\"acme-settings-schedule\"&gt;\n        &lt;form id=\"acme-form\" method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n            &lt;!-- This is where your settings go. --&gt;\n            &lt;p&gt;\n                &lt;?php\n                submit_button(\n                    'Save',\n                    'primary',\n                    'acme-save-settings',\n                    false\n                );\n                wp_nonce_field(\n                    'acme-save',\n                    'acme-save-nonce'\n                );\n                ?&gt;\n            &lt;\/p&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Nota che, s\u00ec, ha un input, un pulsante di salvataggio e un nonce che sono tutti importanti (ma oltre lo scopo di questo post) per salvare le informazioni.<\/p>\n<p>Ma nota anche che ha una funzione di supporto che utilizzo per verificare la presenza di informazioni salvate con successo. Questa funzione risiede nella stessa classe responsabile del rendering del modello.<\/p>\n<h4>Parziale<\/h4>\n<p>Sembra qualcosa del <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-03-showsuccessmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">genere:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function showSuccessMessage()\n{\n  return (false !== get_option('acme_custom_setting'));\n}\n<\/code><\/pre>\n<p>E il parziale risultante \u00e8 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-04-settings-saved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">molto semplice:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the success message if the option has been properly saved.\n *\/\n?&gt;\n\n&lt;div class=\"notice-success notice is-dismissible\"&gt;\n    &lt;p&gt;Your settings have been successfully saved.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Naturalmente, l&#8217;implementazione della funzione pu\u00f2 variare. Lo scopo non \u00e8 tanto quello di mostrare come implementare la funzione, ma come sfruttare una funzione per controllare le informazioni per visualizzare un parziale.<\/p>\n<h2>C&#8217;\u00e8 di pi\u00f9 (ma non qui)<\/h2>\n<p>Forse questo \u00e8 qualcosa che dovrebbe essere inserito all&#8217;inizio dell&#8217;articolo.<\/p>\n<p>Ad essere onesti, penso che sia una di quelle cose in cui alcuni potrebbero trovare pi\u00f9 utile vederlo dall&#8217;inizio (ma poi mancano il contesto del codice) e altri lo trovano pi\u00f9 utile alla fine perch\u00e9 possono vedere come si adatta tutto insieme.<\/p>\n<p>In ogni caso, spero che alla fine fornisca chiarezza su come tutto questo si incastri.<\/p>\n<p>Inoltre, c&#8217;\u00e8 molto spazio in posti per cose da personalizzare come:<\/p>\n<ul>\n<li>verificando che l&#8217;utente abbia il permesso di salvare,<\/li>\n<li>verificando il valore nonce,<\/li>\n<li>sanificazione e validazione dei dati,<\/li>\n<li>determinare cosa costituisce successo, avvisi ed errori.<\/li>\n<\/ul>\n<p>Ma se devo coprire tutto quanto sopra, stiamo guardando un post straordinariamente lungo o una lunga serie di post. Non \u00e8 qualcosa a cui sono contrario, ma \u00e8 anche qualcosa che ora non vale lo sforzo a questo punto.<\/p>\n<p>Non esitare mai a offrire un feedback. Ma nel frattempo, spero che tutto questo ti aiuti a darti una base su cui costruire quando lavori al tuo prossimo progetto.<\/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>In questo post, analizzo l&#8217;uso di classi, modelli e parziali nei plugin di WordPress usando un semplice esempio.<\/p>\n","protected":false},"author":1,"featured_media":164763,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[804,720,844,865],"tags":[1168],"class_list":["post-230468","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-6","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230468","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=230468"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230468\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164763"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}