{"id":228831,"date":"2022-10-31T10:14:00","date_gmt":"2022-10-31T07:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228831"},"modified":"2022-11-09T04:26:14","modified_gmt":"2022-11-09T01:26:14","slug":"postituse-oleku-saeilitamine-wordpressi-postituse-vaerskendamisel","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/postituse-oleku-saeilitamine-wordpressi-postituse-vaerskendamisel\/","title":{"rendered":"Postituse oleku s\u00e4ilitamine WordPressi postituse v\u00e4rskendamisel"},"content":{"rendered":"\n<p>L\u00f5petasin just projekti funktsiooni, mis kasutab kasutaja (v\u00f5i kasutajate komplekti) kustutamisel kohandatud postitust\u00fc\u00fcpide, andmete importimise ja olemasolevate postituste v\u00e4rskendamise kombinatsiooni.<\/p>\n<p>Siiski on \u00fcks probleem:<\/p>\n<p>Oletagem, et teil on praegu avaldatud postitus (st selle &quot;post_status&quot; v\u00e4\u00e4rtuseks on seatud &quot;avaldamine&quot;), kuid kui v\u00e4rskendate postitust saidi wp_update_post kaudu, on selle atribuudi post_status v\u00e4\u00e4rtuseks &quot;tulevik&quot;.<\/p>\n<p>Kui v\u00e4rskendate postitust programmiliselt, m\u00e4\u00e4ratakse postituse olekuks &quot;Ajastatud&quot; (vastavalt kasutajaliidesele) ja &quot;tulevik&quot; (vastavalt andmebaasi veerule).<\/p>\n<p>Mis siis annab?<\/p>\n<h2>Postituse olek v\u00e4rskendamisel<\/h2>\n<p>\u00dcldiselt ma ei f\u00e4nna seda, et miski t\u00f6\u00f6le hakkaks, teada saada, et see toimib, ja liikuda edasi j\u00e4rgmise \u00fclesande juurde, v\u00e4lja arvatud juhul, kui ma m\u00f5istan t\u00e4pselt, miks see [oletatult] \u00fcldse ei toiminud.<\/p>\n<p>See ei t\u00e4henda, et piirangud ei oleks seda p\u00f5hjustanud (v\u00e4hemalt t\u00f6\u00f6ajal). Aga kui on kesk\u00f6\u00f6, parandan vea ja siis ma pole t\u00e4iesti kindel, et saan aru, miks see ilmselt katki l\u00e4ks, v\u00f5in sama h\u00e4sti \u00fcleval olla ja selle v\u00e4lja m\u00f5elda, eks?<\/p>\n<p>See on nagu programmeerija versioon <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\">p\u00f6\u00f6rdumiskulude kallutatusest<\/a>.<\/p>\n<p>Igatahes, nagu \u00fclalpool kirjeldatud, on probleemi p\u00f5hiolemus siin:<\/p>\n<ol>\n<li>Antud postitus on WordPressis olemas.<\/li>\n<li>Kui kasutaja kustutatakse, vaatab s\u00fcsteem, kas antud postituses on teatud sisu, ja kui jah, siis eemaldab selle.<\/li>\n<li>Seej\u00e4rel v\u00e4rskendatakse postitust WordPressi API funktsiooni abil.<\/li>\n<\/ol>\n<p><strong>K\u00f5ik t\u00f6\u00f6tab suurep\u00e4raselt, v\u00e4lja arvatud probleem: kui postitust programmiliselt v\u00e4rskendatakse, m\u00e4rgib see andmebaasis postituse olekuks \u201etulevik&quot;, m\u00e4\u00e4rates l\u00f5puks vaates K\u00f5ik postitused<\/strong> postituse rea\u00fcksuseks \u201eAjastatud&#8221;.<\/p>\n<h3>Kaks Lahendust<\/h3>\n<p>Selle probleemi lahendamiseks on kaks v\u00f5imalust.<\/p>\n<ol>\n<li>K\u00e4ivitage probleemi lahendamiseks kiirp\u00e4ring otse andmebaasi vastu.<\/li>\n<li>V\u00e4rskendage postituse argumente, et kasutada \u00f5iget aega GMT-s (r\u00e4\u00e4gin sellest l\u00e4hemalt hetke p\u00e4rast).<\/li>\n<\/ol>\n<p>Kui valite esimese lahenduse, kasutage kindlasti ettevalmistamise funktsiooni ja veenduge, et t\u00e4idaksite p\u00e4ringu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-00-direct-database-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e4rast v\u00e4rskendusfunktsiooni tagastamist<\/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>Kui valite teise lahenduse, v\u00e4rskendage enne selle <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-01-maintain-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e4rskendamisfunktsioonile<\/a> edastamist postitusobjekti atribuute .<\/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>Ma ei ole see, kes \u00fctleks, et projektiga t\u00f6\u00f6tades pole kummalegi neist lahendustest kohta, kuid k\u00fcsimus j\u00e4\u00e4b alles:<\/p>\n<p>Miks m\u00e4rgib WordPress postituse edaspidiseks, kui postitus oli enne v\u00e4rskendusprotseduuri l\u00e4bimist seatud avaldama?<\/p>\n<p>Ja kui te pole kursis \u00fclej\u00e4\u00e4nud argumentidega, mis postituse v\u00e4rskendamisel WordPressile edastatakse, kulub sellele j\u00e4lile j\u00f5udmiseks veidi aega.<\/p>\n<h2>Probleemi m\u00f5istmine<\/h2>\n<p>Otsese andmebaasip\u00e4ringu kirjutamise v\u00e4ltimiseks valin teise lahenduse, kuna see on puhtam (kuigi see ei muuda seda v\u00e4hem segaseks).<\/p>\n<p>Sellise k\u00e4itumise p\u00f5hjuste v\u00e4ljaselgitamiseks v\u00f5ite k\u00fcsida m\u00f5nelt teiselt arendajalt v\u00f5i koodi siluda. Arvestades, et t\u00f6\u00f6tasin selle kallal hilis\u00f5htul, valisin viimase.<\/p>\n<p>Siluri k\u00e4itamine ja j\u00e4lgimiskoodi otsimine l\u00e4bi post.php.<\/p>\n<p>Ma ei r\u00e4\u00e4gi k\u00f5igist seatud murdepunktidest ja kelladest, seega p\u00fc\u00fcan seda teha v\u00f5imalikult l\u00fchidalt.<\/p>\n<p>Esiteks, kui kood t\u00f6\u00f6tab l\u00e4bi funktsiooni <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_update_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_update_post<\/a>, puutub <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-02-update-post-conditional-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">see kokku j\u00e4rgmise koodiplokiga<\/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>Pange t\u00e4hele, et tingimuse piires ei t\u00f6\u00f6ta me manusega ja t\u00f6\u00f6tame postituse olekuga \u201eavalda&#8221;. Nii et me tabame esimest tingimuslauset v\u00e4lise tingimuslause sees (natuke segane, kas pole?).<\/p>\n<p>N\u00fc\u00fcd on muutuja $post_status, mis s\u00e4ilitab publitseerimise v\u00e4\u00e4rtuse, kuid seda ei ole m\u00e4\u00e4ratud praeguse postituse \u00fchelegi konkreetsele atribuudile. Kui j\u00e4tkate koodi j\u00e4lgimist, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-03-apply-filters-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ete j\u00e4rgmist rida<\/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>Siin n\u00e4ete, et see t\u00f6\u00f6tab massiiviv\u00f5tmete komplektiga, mis sisalduvad muutujas $postarr. Seda muutujat on koodis varem kasutatud (vaata seda <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\">siin<\/a> Tracis). Ja kui te vaatate t\u00e4helepanelikult, n\u00e4ete, et see kontrollib esmalt, kas atribuut post_date_gmt on t\u00fchi v\u00f5i on see k\u00f5ik nullitud.<\/p>\n<p>Ja kuna see pole nii, kasutab see v\u00e4\u00e4rtust, mille m\u00e4\u00e4rasime atribuudil, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-04-post-date-gmt-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kui funktsiooni algselt kutsusime<\/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>Oota.<\/p>\n<p>Miks minna tagasi funktsiooni juurde, kui kood on sellest juba m\u00f6\u00f6das? See on silumise olemus. M\u00f5nikord n\u00e4ete muutujaid ja ei m\u00f5tle neist midagi ainult selleks, et n\u00e4ha, kuidas neid hiljem koodis kasutatakse, seadistatakse, manipuleeritakse, kombineeritakse v\u00f5i mida iganes muud.<\/p>\n<p>See on selle tegelikkus.<\/p>\n<p>Kuid igal juhul s\u00e4ilitab atribuut selle v\u00e4\u00e4rtuse, mille andsime enne v\u00e4rskendusfunktsiooni kutsumist. Tavaliselt on see sama v\u00e4\u00e4rtus, mis funktsiooni k\u00e4ivitamisel, kuid v\u00f5ib juhtuda, et soovite postituse pr\u00fcgikasti visata.<\/p>\n<p>Ja see on p\u00f5hjus <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_delete_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_delete_post<\/a> kasutamiseks. Kuid sellel on ka oma hoiatused, eriti kohandatud postitust\u00fc\u00fcpide puhul.<\/p>\n<p>See l\u00e4heb aga teise postitusse.<\/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>Postituse oleku s\u00e4ilitamine WordPressi postituse v\u00e4rskendamisel v\u00f5ib anda ootamatuid tulemusi. Sellep\u00e4rast ja kuidas seda \u00f5igesti hallata.<\/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":[718,894,842,802,863],"tags":[1165],"class_list":["post-228831","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-opetused","category-php-4","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=228831"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228831\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/223663"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=228831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=228831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=228831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}