{"id":229384,"date":"2022-10-31T09:55:00","date_gmt":"2022-10-31T06:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229384"},"modified":"2022-11-09T06:47:25","modified_gmt":"2022-11-09T03:47:25","slug":"viestin-tilan-saeilyttaeminen-wordpress-viestiae-paeivitettaeessae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/viestin-tilan-saeilyttaeminen-wordpress-viestiae-paeivitettaeessae\/","title":{"rendered":"Viestin tilan s\u00e4ilytt\u00e4minen WordPress-viesti\u00e4 p\u00e4ivitett\u00e4ess\u00e4"},"content":{"rendered":"\n<p>Sain juuri valmiiksi ominaisuuden projektille, joka k\u00e4ytt\u00e4\u00e4 yhdistelm\u00e4\u00e4 mukautettuja viestityyppej\u00e4, tietojen tuontia ja olemassa olevien viestien p\u00e4ivitt\u00e4mist\u00e4 k\u00e4ytt\u00e4j\u00e4n (tai k\u00e4ytt\u00e4j\u00e4joukon) poistamisen yhteydess\u00e4.<\/p>\n<p>Yksi ongelma kuitenkin on:<\/p>\n<p>Oletetaan, ett\u00e4 sinulla on t\u00e4ll\u00e4 hetkell\u00e4 julkaistu viesti (eli sen post_status-asetuksena on julkaista), mutta kun p\u00e4ivit\u00e4t viestin wp_update_post-sovelluksella, sen post_status-attribuutti on asetettu tulevaisuuteen.<\/p>\n<p>Toisin sanoen, aina kun p\u00e4ivit\u00e4t julkaisun ohjelmallisesti, viestin tilaksi asetetaan &quot;Scheduled&quot; (k\u00e4ytt\u00f6liittym\u00e4n mukaan) ja &quot;tulevaisuus&quot; (tietokantararakkeen mukaan).<\/p>\n<p>Mit\u00e4 siis antaa?<\/p>\n<h2>Viestin tila p\u00e4ivitett\u00e4ess\u00e4<\/h2>\n<p>Yleisesti ottaen en ole fani siit\u00e4, ett\u00e4 saa jotain toimimaan, saa selville, ett\u00e4 se toimii, ja siirry seuraavaan teht\u00e4v\u00e4\u00e4n, ellen ymm\u00e4rr\u00e4 tarkalleen, miksi se ei toiminut [odotusti] alun perin.<\/p>\n<p>T\u00e4m\u00e4 ei tarkoita sit\u00e4, etteik\u00f6 rajoitteet olisivat saaneet t\u00e4m\u00e4n tapahtumaan (ainakaan ty\u00f6aikana). Mutta jos on keskiy\u00f6, korjaan virheen, ja sitten en ole t\u00e4ysin varma, ymm\u00e4rr\u00e4nk\u00f6, miksi se ilmeisesti alun perin meni rikki. Voisin yht\u00e4 hyvin pysy\u00e4 hereill\u00e4 ja selvitt\u00e4\u00e4 sen oikein?<\/p>\n<p>Se on kuin ohjelmoijan versio <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\">uponneiden kustannusten biasista<\/a>.<\/p>\n<p>Joka tapauksessa, kuten edell\u00e4 on kuvattu, t\u00e4ss\u00e4 on ongelman ydin:<\/p>\n<ol>\n<li>Tietty viesti on olemassa WordPressiss\u00e4.<\/li>\n<li>Kun k\u00e4ytt\u00e4j\u00e4 poistetaan, j\u00e4rjestelm\u00e4 tarkistaa, onko tietyss\u00e4 viestiss\u00e4 tietty\u00e4 sis\u00e4lt\u00f6\u00e4, ja jos on, poistaa sen.<\/li>\n<li>Viesti p\u00e4ivitet\u00e4\u00e4n sitten WordPress API -toiminnolla.<\/li>\n<\/ol>\n<p>Kaikki toimii hyvin, paitsi ett\u00e4 siin\u00e4 on ongelma: Aina kun viesti\u00e4 p\u00e4ivitet\u00e4\u00e4n ohjelmallisesti, se merkitsee viestin tilaksi &quot;tulevaisuus&quot; tietokannassa ja asettaa lopulta viestin rivikohdan <strong>Kaikki viestit<\/strong> -n\u00e4kym\u00e4ss\u00e4 &quot;Ajoitettu&quot;.<\/p>\n<h3>Kaksi Ratkaisua<\/h3>\n<p>On kaksi tapaa korjata t\u00e4m\u00e4 ongelma:<\/p>\n<ol>\n<li>Korjaa ongelma suorittamalla nopea kysely suoraan tietokannasta.<\/li>\n<li>P\u00e4ivit\u00e4 viestin argumentit k\u00e4ytt\u00e4m\u00e4\u00e4n oikeaa aikaa GMT:ss\u00e4 (k\u00e4sittelen t\u00e4t\u00e4 lis\u00e4\u00e4 hetken kuluttua).<\/li>\n<\/ol>\n<p>Jos valitset ensimm\u00e4isen ratkaisun, varmista, ett\u00e4 k\u00e4yt\u00e4t valmistelutoimintoa ja suoritat kyselyn <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-00-direct-database-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sen j\u00e4lkeen, kun p\u00e4ivitystoiminto on palautettu<\/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>Jos valitset toisen ratkaisun, p\u00e4ivit\u00e4 post-objektin ominaisuudet nimenomaisesti ennen sen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-01-maintain-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e4litt\u00e4mist\u00e4 p\u00e4ivitystoimintoon<\/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>En ole sellainen, joka v\u00e4itt\u00e4\u00e4, ettei kummallekaan n\u00e4ist\u00e4 ratkaisuista olisi sijaa projektin parissa, mutta kysymys kuuluu:<\/p>\n<p>Miksi WordPress merkitsee postauksen ajoitetuksi tulevaisuutta varten, kun postaus asetettiin julkaistavaksi ennen p\u00e4ivitysprosessia?<\/p>\n<p>Ja jos et tunne muita argumentteja, jotka v\u00e4litet\u00e4\u00e4n WordPressille julkaisua p\u00e4ivitett\u00e4ess\u00e4, sen j\u00e4ljitt\u00e4minen kest\u00e4\u00e4 jonkin aikaa.<\/p>\n<h2>Ongelman ymm\u00e4rt\u00e4minen<\/h2>\n<p>Suoran tietokantakyselyn kirjoittamisen v\u00e4ltt\u00e4miseksi p\u00e4\u00e4t\u00e4n valita toisen ratkaisun, koska se on puhtaampi (vaikka se ei tee siit\u00e4 yht\u00e4\u00e4n v\u00e4hemm\u00e4n h\u00e4mment\u00e4v\u00e4\u00e4).<\/p>\n<p>Voit selvitt\u00e4\u00e4 t\u00e4m\u00e4n toiminnan syyn kysym\u00e4ll\u00e4 toiselta kehitt\u00e4j\u00e4lt\u00e4 tai tarkistamalla koodin. Koska ty\u00f6skentelin t\u00e4m\u00e4n parissa my\u00f6h\u00e4\u00e4n illalla, valitsin j\u00e4lkimm\u00e4isen.<\/p>\n<p>Debuggerin suorittaminen ja seurantakoodi post.php:n kautta.<\/p>\n<p>En aio puhua l\u00e4pi kaikista asettamistani keskeytyspisteist\u00e4 ja kelloista, joten yrit\u00e4n tehd\u00e4 t\u00e4m\u00e4n mahdollisimman ytimekk\u00e4\u00e4sti.<\/p>\n<p>Ensinn\u00e4kin, kun koodi suoritetaan <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_update_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_update_post-<\/a> funktion l\u00e4pi, se kohtaa <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-02-update-post-conditional-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4m\u00e4n koodilohkon<\/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>Huomaa, ett\u00e4 ehdollisen ehdon sis\u00e4ll\u00e4 emme ty\u00f6skentele liitteen kanssa ja ty\u00f6skentelemme julkaisun tilan &quot;julkaise&quot; kanssa. Joten aiomme ly\u00f6d\u00e4 ensimm\u00e4ist\u00e4 ehdollista ulomman ehdon sis\u00e4ll\u00e4 (hieman h\u00e4mment\u00e4v\u00e4\u00e4, eik\u00f6?).<\/p>\n<p>Nyt on muuttuja, $post_status, joka s\u00e4ilytt\u00e4\u00e4 julkaisun arvon, mutta sit\u00e4 ei ole liitetty mihink\u00e4\u00e4n tiettyyn nykyisen viestin ominaisuuteen. Jos jatkat koodin j\u00e4ljitt\u00e4mist\u00e4, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-03-apply-filters-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kohtaat seuraavan rivin<\/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>T\u00e4ss\u00e4 n\u00e4et, ett\u00e4 se toimii $postarr-muuttujan sis\u00e4lt\u00e4mien taulukkoavainten kanssa. T\u00e4t\u00e4 muuttujaa on k\u00e4ytetty aiemmin koodissa (katso se <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\">t\u00e4\u00e4lt\u00e4<\/a> Tracista). Ja jos katsot tarkasti, huomaat, ett\u00e4 se tarkistaa ensin, onko post_date_gmt-ominaisuus tyhj\u00e4 vai onko se kaikki nollattu.<\/p>\n<p>Ja koska se ei ole, se k\u00e4ytt\u00e4\u00e4 arvoa, jonka m\u00e4\u00e4ritimme ominaisuudelle, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-04-post-date-gmt-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kun kutsuimme funktiota alun perin<\/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>Odota.<\/p>\n<p>Miksi palata funktioon, kun koodi on jo ajettu t\u00e4m\u00e4n ohi? Se on virheenkorjauksen luonne. Joskus n\u00e4et muuttujia, etk\u00e4 ajattele niist\u00e4 mit\u00e4\u00e4n vain n\u00e4hd\u00e4ksesi, ett\u00e4 niit\u00e4 k\u00e4ytet\u00e4\u00e4n, asetetaan, manipuloidaan, yhdistet\u00e4\u00e4n tai mit\u00e4 tahansa muuta my\u00f6hemmin koodissa.<\/p>\n<p>Se on sen todellisuus.<\/p>\n<p>Mutta joka tapauksessa, t\u00e4st\u00e4 syyst\u00e4 ominaisuus s\u00e4ilytt\u00e4\u00e4 arvon, jonka toimitimme ennen p\u00e4ivitystoiminnon kutsumista. Yleens\u00e4 t\u00e4m\u00e4 on sama arvo kuin funktion k\u00e4ynnistyshetkell\u00e4, mutta joskus haluat esimerkiksi siirt\u00e4\u00e4 viestin roskakoriin.<\/p>\n<p>Ja t\u00e4m\u00e4 on syy k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_delete_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_delete_post -tiedostoa<\/a>. Mutta sill\u00e4 on varoituksensa, my\u00f6s varsinkin mukautettujen viestityyppien suhteen.<\/p>\n<p>Se menee kuitenkin toiseen postaukseen.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viestin tilan s\u00e4ilytt\u00e4minen WordPress-viesti\u00e4 p\u00e4ivitett\u00e4ess\u00e4 voi tuottaa odottamattomia tuloksia. T\u00e4st\u00e4 syyst\u00e4 ja kuinka hallita sit\u00e4 oikein.<\/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":[719,895,843,803,864],"tags":[1166],"class_list":["post-229384","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=229384"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229384\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223663"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}