{"id":229624,"date":"2022-10-31T10:06:00","date_gmt":"2022-10-31T07:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229624"},"modified":"2022-11-09T08:45:00","modified_gmt":"2022-11-09T05:45:00","slug":"mantenere-lo-stato-di-un-post-durante-laggiornamento-di-un-post-di-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/mantenere-lo-stato-di-un-post-durante-laggiornamento-di-un-post-di-wordpress\/","title":{"rendered":"Mantenere lo stato di un post durante l&#8217;aggiornamento di un post di WordPress"},"content":{"rendered":"\n<p>Ho appena terminato una funzionalit\u00e0 per un progetto che utilizza una combinazione di tipi di post personalizzati, importazione di dati e aggiornamento di post esistenti quando si elimina un utente (o un insieme di utenti).<\/p>\n<p>C&#8217;\u00e8 un problema, per\u00f2:<\/p>\n<p>Supponiamo che tu abbia un post attualmente pubblicato (ovvero, &quot;post_status&quot; \u00e8 impostato su &quot;pubblica&quot;) ma, quando aggiorni il post tramite wp_update_post, il suo attributo post_status \u00e8 impostato su &quot;futuro&quot;.<\/p>\n<p>In altre parole, ogni volta che aggiorni un post a livello di codice, lo stato del post \u00e8 impostato su &quot;Programmato&quot; (secondo l&#8217;interfaccia utente) e &quot;futuro&quot; (secondo la colonna del database).<\/p>\n<p>Allora cosa d\u00e0?<\/p>\n<h2>Stato del post durante l&#8217;aggiornamento<\/h2>\n<p>In generale, non sono un fan di far funzionare qualcosa, scoprire che funziona e passare all&#8217;attivit\u00e0 successiva a meno che non capisca esattamente perch\u00e9 non ha funzionato [come previsto] in primo luogo.<\/p>\n<p>Questo non vuol dire che non ci siano momenti in cui i vincoli hanno causato ci\u00f2 (almeno durante l&#8217;orario di lavoro). Ma se \u00e8 mezzanotte, risolvo un bug e poi non sono del tutto sicuro di capire perch\u00e9 apparentemente era rotto in primo luogo, potrei anche stare sveglio e capirlo, giusto?<\/p>\n<p>\u00c8 come la versione del programmatore della <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sunk_cost#Loss_aversion_and_the_sunk_cost_fallacy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">distorsione dei costi irrecuperabili<\/a>.<\/p>\n<p>Ad ogni modo, come descritto sopra, ecco l&#8217;essenza del problema:<\/p>\n<ol>\n<li>Un determinato post esiste in WordPress.<\/li>\n<li>Quando un utente viene eliminato, il sistema controlla se esiste un determinato contenuto all&#8217;interno di un determinato post e, in tal caso, lo rimuove.<\/li>\n<li>Il post viene quindi aggiornato utilizzando una funzione API di WordPress.<\/li>\n<\/ol>\n<p>Tutto funziona alla grande tranne che c&#8217;\u00e8 un problema: ogni volta che il post viene aggiornato a livello di codice, contrassegna lo stato del post come &quot;futuro&quot; nel database, impostando infine l&#8217;elemento pubblicitario del post nella\u00a0 visualizzazione <strong>Tutti i post<\/strong> come &quot;Programmato&quot;.<\/p>\n<h3>Due soluzioni<\/h3>\n<p>Esistono due modi per risolvere questo problema:<\/p>\n<ol>\n<li>Eseguire una query rapida direttamente sul database per risolvere il problema.<\/li>\n<li>Aggiorna gli argomenti del post per utilizzare l&#8217;ora corretta in GMT (ne parler\u00f2 pi\u00f9 in un momento).<\/li>\n<\/ol>\n<p>Se si opta per la prima soluzione, assicurarsi di utilizzare la funzione di preparazione e assicurarsi di eseguire la query <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-00-direct-database-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dopo la restituzione della funzione di aggiornamento<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/\/ First, update the post using the available WordPress API.\nwp_update_post( $post );\n\n\/**\n * If the post status attribute of the post that was just updated\n * maintains the 'publish' post setatus, then manually update the \n * database column.\n *\/\nif ('publish' === $post-&gt;post_status) {\n\n    global $wpdb;\n    $wpdb-&gt;query(\n        $wpdb-&gt;prepare(\n            \"\n            UPDATE $wpdb-&gt;posts\n            SET post_status = '%s'\n            WHERE ID = %d\n            \",\n            'publish',\n            $post-&gt;ID) );\n}\n<\/code><\/pre>\n<p>Se opti per la seconda soluzione, aggiorna in modo esplicito le propriet\u00e0 dell&#8217;oggetto post prima di passarlo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-01-maintain-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alla funzione di aggiornamento<\/a>.<\/p>\n<pre><code>&lt;?php\n\n$event_post-&gt;post_date_gmt = gmdate( 'Y-m-d H:i:s', $event_post-&gt;post_date_gmt );\nwp_update_post( $event_post );\n<\/code><\/pre>\n<p>Non sono uno che dice che non c&#8217;\u00e8 posto per nessuna di queste soluzioni quando si lavora su un progetto, ma la domanda rimane:<\/p>\n<p>Perch\u00e9 WordPress contrassegna un post programmato per il futuro quando il post, prima di passare alla procedura di aggiornamento, era impostato per la pubblicazione?<\/p>\n<p>E se non hai familiarit\u00e0 con il resto degli argomenti che vengono passati a WordPress durante l&#8217;aggiornamento di un post, ci vorr\u00e0 del tempo per rintracciarlo.<\/p>\n<h2>Capire il problema<\/h2>\n<p>Per evitare di scrivere una query diretta sul database, scelgo di scegliere la seconda soluzione perch\u00e9 \u00e8 pi\u00f9 pulita (anche se non la rende meno confusa).<\/p>\n<p>Per capire perch\u00e9 si verifica questo comportamento, puoi chiedere a un altro sviluppatore o eseguire il debug del codice. Dato che ci stavo lavorando a tarda notte, ho optato per quest&#8217;ultimo.<\/p>\n<p>Eseguire il debugger e tracciare il codice tramite post.php.<\/p>\n<p>Non parler\u00f2 di tutti i breakpoint e gli orologi che ho impostato, quindi cercher\u00f2 di renderlo il pi\u00f9 conciso possibile.<\/p>\n<p>Innanzitutto, quando il codice viene eseguito tramite la funzione <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_update_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_update_post<\/a>, incontrer\u00e0 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-02-update-post-conditional-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo blocco di codice<\/a> :<\/p>\n<pre><code>&lt;?php\n\nif ('attachment' !== $post_type) {\n    if ('publish' == $post_status) {\n        $now = gmdate('Y-m-d H:i:59');\n        if (mysql2date('U', $post_date_gmt, false) &gt; mysql2date('U', $now, false)) {\n            $post_status = 'future';\n        }\n    } elseif ('future' == $post_status) {\n        $now = gmdate('Y-m-d H:i:59');\n        if (mysql2date('U', $post_date_gmt, false) &lt;= mysql2date('U', $now, false)) {\n            $post_status = 'publish';\n        }\n    }\n}\n<\/code><\/pre>\n<p>Nota che all&#8217;interno del condizionale, non stiamo lavorando con un allegato e stiamo lavorando con uno stato del post di &quot;pubblica&quot;. Quindi raggiungeremo il primo condizionale all&#8217;interno del condizionale esterno (un po&#8217; confuso non \u00e8 vero?).<\/p>\n<p>Ora c&#8217;\u00e8 una variabile, $post_status, che mantiene un valore di pubblicazione ma non \u00e8 assegnata a nessuna propriet\u00e0 particolare del post corrente. Se continui a tracciare il codice, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-03-apply-filters-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ti imbatterai nella riga successiva<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr) ), $postarr );\n<\/code><\/pre>\n<p>Qui vedrai che funziona con un insieme di chiavi di array che sono contenute nella variabile $postarr. Questa variabile \u00e8 usata in precedenza nel codice (vedi <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/4.7\/src\/wp-includes\/post.php#L3137\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qui<\/a> su Trac). E se guardi da vicino, vedrai che prima controlla se la propriet\u00e0 post_date_gmt \u00e8 vuota o se \u00e8 tutto azzerato.<\/p>\n<p>E poich\u00e9 non lo \u00e8, utilizzer\u00e0 il valore che abbiamo specificato nella propriet\u00e0 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-04-post-date-gmt-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">quando inizialmente abbiamo chiamato la funzione<\/a> :<\/p>\n<pre><code>&lt;?php\n\nif (empty( $postarr['post_date_gmt']) || '0000-00-00 00:00:00' == $postarr['post_date_gmt']) {\n        if (! in_array( $post_status, array( 'draft', 'pending', 'auto-draft') )) {\n            $post_date_gmt = get_gmt_from_date( $post_date );\n        } else {\n            $post_date_gmt = '0000-00-00 00:00:00';\n        }\n    } else {\n        $post_date_gmt = $postarr['post_date_gmt'];\n    }\n<\/code><\/pre>\n<p>Attesa.<\/p>\n<p>Perch\u00e9 tornare nella funzione quando il codice \u00e8 gi\u00e0 stato eseguito oltre? Questa \u00e8 la natura del debug. A volte vedi variabili e non pensi a niente solo per vedere che sono usate, impostate, manipolate, combinate o qualsiasi altra cosa pi\u00f9 avanti nel codice.<\/p>\n<p>Questa \u00e8 la realt\u00e0.<\/p>\n<p>Ma comunque, per questo motivo, la propriet\u00e0 manterr\u00e0 il valore che abbiamo fornito prima di chiamare la funzione di aggiornamento. Di solito, questo sar\u00e0 lo stesso valore di quando la funzione \u00e8 stata avviata, ma a volte potresti voler eliminare un post.<\/p>\n<p>E questo \u00e8 il motivo per usare <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_delete_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_delete_post<\/a>. Ma ha anche i suoi avvertimenti, specialmente sui tipi di post personalizzati.<\/p>\n<p>Questo entra in un altro post, per\u00f2.<\/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>Il mantenimento dello stato di un post durante l&#8217;aggiornamento di un post di WordPress pu\u00f2 avere risultati imprevisti. Ecco perch\u00e9 e come gestirlo correttamente.<\/p>\n","protected":false},"author":1,"featured_media":223663,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,804,720,844,865],"tags":[1168],"class_list":["post-229624","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","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\/229624","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=229624"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229624\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223663"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}