{"id":228721,"date":"2022-10-31T10:13:00","date_gmt":"2022-10-31T07:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228721"},"modified":"2022-11-09T04:00:48","modified_gmt":"2022-11-09T01:00:48","slug":"uppraetthaalla-en-inlaeggsstatus-naer-du-uppdaterar-ett-wordpress-inlaegg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/uppraetthaalla-en-inlaeggsstatus-naer-du-uppdaterar-ett-wordpress-inlaegg\/","title":{"rendered":"Uppr\u00e4tth\u00e5lla en inl\u00e4ggsstatus n\u00e4r du uppdaterar ett WordPress-inl\u00e4gg"},"content":{"rendered":"\n<p>Jag har precis avslutat en funktion f\u00f6r ett projekt som anv\u00e4nder en kombination av anpassade inl\u00e4ggstyper, dataimport och uppdatering av befintliga inl\u00e4gg n\u00e4r en anv\u00e4ndare (eller upps\u00e4ttning anv\u00e4ndare) tas bort.<\/p>\n<p>Det finns dock ett problem:<\/p>\n<p>S\u00e4g att du har ett inl\u00e4gg som f\u00f6r n\u00e4rvarande \u00e4r publicerat (det vill s\u00e4ga att &#8217;post_status&#8217; \u00e4r inst\u00e4llt p\u00e5 &#8217;publish&#8217;), men n\u00e4r du uppdaterar inl\u00e4gget via wp_update_post \u00e4r dess post_status-attribut inst\u00e4llt p\u00e5 &#8217;future&#8217;.<\/p>\n<p>Med andra ord, n\u00e4r du programmatiskt uppdaterar ett inl\u00e4gg, st\u00e4lls inl\u00e4ggets status in p\u00e5 &quot;Schemalagt&quot; (enligt anv\u00e4ndargr\u00e4nssnittet) och &quot;framtid&quot; (enligt databaskolumnen).<\/p>\n<p>S\u00e5 vad ger?<\/p>\n<h2>Poststatus vid uppdatering<\/h2>\n<p>Generellt sett \u00e4r jag inte ett fan av att f\u00e5 n\u00e5got att fungera, ta reda p\u00e5 att det g\u00f6r det och g\u00e5 vidare till n\u00e4sta uppgift om jag inte f\u00f6rst\u00e5r exakt varf\u00f6r det inte fungerade [som f\u00f6rv\u00e4ntat] i f\u00f6rsta hand.<\/p>\n<p>Detta \u00e4r inte att s\u00e4ga att det inte finns tillf\u00e4llen d\u00e5 begr\u00e4nsningar har orsakat detta att h\u00e4nda (\u00e5tminstone under arbetstid). Men om det \u00e4r midnatt s\u00e5 fixar jag en bugg, och d\u00e5 \u00e4r jag inte helt s\u00e4ker p\u00e5 att jag f\u00f6rst\u00e5r varf\u00f6r den tydligen gick s\u00f6nder fr\u00e5n b\u00f6rjan, jag kan lika g\u00e4rna stanna uppe och lista ut det eller hur?<\/p>\n<p>Det \u00e4r som programmerarens version av <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\">sunk cost bias<\/a>.<\/p>\n<p>Hur som helst, som beskrivits ovan, h\u00e4r \u00e4r k\u00e4rnan i problemet:<\/p>\n<ol>\n<li>Ett givet inl\u00e4gg finns i WordPress.<\/li>\n<li>N\u00e4r en anv\u00e4ndare raderas ser systemet efter om visst inneh\u00e5ll finns i ett givet inl\u00e4gg och tar i s\u00e5 fall bort det.<\/li>\n<li>Inl\u00e4gget uppdateras sedan med hj\u00e4lp av en WordPress API-funktion.<\/li>\n<\/ol>\n<p>Allt fungerar utm\u00e4rkt f\u00f6rutom att det finns ett problem: N\u00e4rhelst inl\u00e4gget uppdateras programmatiskt markerar det inl\u00e4ggets status som &quot;framtid&quot; i databasen och st\u00e4ller slutligen in postens rad i\u00a0 vyn <strong>Alla inl\u00e4gg<\/strong> som &quot;Schemalagt&quot;.<\/p>\n<h3>Tv\u00e5 l\u00f6sningar<\/h3>\n<p>Det finns tv\u00e5 s\u00e4tt att l\u00f6sa det h\u00e4r problemet:<\/p>\n<ol>\n<li>K\u00f6r en snabbfr\u00e5ga direkt mot databasen f\u00f6r att \u00e5tg\u00e4rda problemet.<\/li>\n<li>Uppdatera inl\u00e4ggets argument f\u00f6r att anv\u00e4nda r\u00e4tt tid i GMT (jag kommer att t\u00e4cka detta mer om ett \u00f6gonblick).<\/li>\n<\/ol>\n<p>Om du v\u00e4ljer den f\u00f6rsta l\u00f6sningen, se till att du anv\u00e4nder f\u00f6rberedelsefunktionen och se till att du k\u00f6r fr\u00e5gan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-00-direct-database-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">efter att uppdateringsfunktionen har returnerats<\/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>Om du v\u00e4ljer den andra l\u00f6sningen, uppdatera d\u00e5 uttryckligen egenskaperna f\u00f6r postobjektet innan du skickar det <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-01-maintain-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">till uppdateringsfunktionen<\/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>Jag \u00e4r inte en som s\u00e4ger att det inte finns plats f\u00f6r n\u00e5gon av dessa l\u00f6sningar n\u00e4r du arbetar med ett projekt, men fr\u00e5gan kvarst\u00e5r:<\/p>\n<p>Varf\u00f6r markerar WordPress ett inl\u00e4gg som \u00e4r schemalagt f\u00f6r framtiden n\u00e4r inl\u00e4gget, innan det gick igenom uppdateringsproceduren, var inst\u00e4llt p\u00e5 att publiceras?<\/p>\n<p>Och om du inte \u00e4r bekant med resten av argumenten som skickas till WordPress n\u00e4r du uppdaterar ett inl\u00e4gg, kommer det att ta lite tid att sp\u00e5ra det.<\/p>\n<h2>F\u00f6rst\u00e5 problemet<\/h2>\n<p>F\u00f6r att undvika att skriva en direkt databasfr\u00e5ga v\u00e4ljer jag att g\u00e5 med den andra l\u00f6sningen eftersom den \u00e4r renare (\u00e4ven om det inte g\u00f6r det mindre f\u00f6rvirrande).<\/p>\n<p>F\u00f6r att ta reda p\u00e5 varf\u00f6r detta beteende h\u00e4nder kan du fr\u00e5ga en annan utvecklare eller fels\u00f6ka koden. Med tanke p\u00e5 att jag jobbade med detta sent p\u00e5 kv\u00e4llen valde jag det senare.<\/p>\n<p>K\u00f6r fels\u00f6karen och sp\u00e5rningskoden via post.php.<\/p>\n<p>Jag t\u00e4nker inte prata igenom alla brytpunkter och klockor som jag st\u00e4llt in, s\u00e5 jag ska f\u00f6rs\u00f6ka g\u00f6ra detta s\u00e5 kortfattat som m\u00f6jligt.<\/p>\n<p>F\u00f6rst, n\u00e4r koden k\u00f6rs genom funktionen <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_update_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_update_post<\/a> kommer den att st\u00f6ta p\u00e5 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-02-update-post-conditional-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">detta kodblock<\/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>Observera att inom villkoret arbetar vi inte med en bilaga och vi arbetar med inl\u00e4ggsstatusen &quot;publicera&quot;. S\u00e5 vi kommer att tr\u00e4ffa den f\u00f6rsta villkorliga inom den yttre villkorliga (lite f\u00f6rvirrande \u00e4r det inte?).<\/p>\n<p>Nu finns det en variabel, $post_status, som bibeh\u00e5ller v\u00e4rdet publicera men den \u00e4r inte tilldelad n\u00e5gon speciell egenskap f\u00f6r det aktuella inl\u00e4gget. Om du forts\u00e4tter att sp\u00e5ra koden kommer <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-03-apply-filters-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">du att st\u00f6ta p\u00e5 n\u00e4sta rad<\/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>H\u00e4r kommer du att se att det fungerar med en upps\u00e4ttning arraynycklar som finns i variabeln $postarr. Denna variabel anv\u00e4nds tidigare i koden (se den <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\">h\u00e4r<\/a> p\u00e5 Trac). Och om du tittar noga kommer du att se att den f\u00f6rst kontrollerar om post_date_gmt-egenskapen \u00e4r tom eller om den nollst\u00e4lls.<\/p>\n<p>Och eftersom det inte \u00e4r det kommer det att anv\u00e4nda v\u00e4rdet som vi angav p\u00e5 egenskapen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3de0a26bbddc867f88a82def270a483b#file-04-post-date-gmt-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4r vi f\u00f6rst anropade funktionen<\/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>V\u00e4nta.<\/p>\n<p>Varf\u00f6r g\u00e5 tillbaka till funktionen n\u00e4r koden redan har k\u00f6rts f\u00f6rbi detta? Det \u00e4r fels\u00f6kningens natur. Ibland ser du variabler och t\u00e4nker inte p\u00e5 dem bara f\u00f6r att se att de anv\u00e4nds, st\u00e4lls in, manipuleras, kombineras eller vad som helst senare i koden.<\/p>\n<p>Det \u00e4r verkligheten.<\/p>\n<p>Men hur som helst, p\u00e5 grund av det kommer fastigheten att beh\u00e5lla v\u00e4rdet som vi angav innan uppdateringsfunktionen anropades. Vanligtvis kommer detta att vara samma v\u00e4rde som n\u00e4r funktionen startade, men det kan finnas tillf\u00e4llen d\u00e5 du till exempel vill sl\u00e4nga ett inl\u00e4gg.<\/p>\n<p>Och det \u00e4r sk\u00e4l f\u00f6r att anv\u00e4nda <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_delete_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_delete_post<\/a>. Men det har sina varningar, s\u00e4rskilt kring anpassade inl\u00e4ggstyper.<\/p>\n<p>Det hamnar dock i ett annat inl\u00e4gg.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Att beh\u00e5lla en inl\u00e4ggsstatus n\u00e4r du uppdaterar ett WordPress-inl\u00e4gg kan f\u00e5 ov\u00e4ntade resultat. Det \u00e4r d\u00e4rf\u00f6r och hur man hanterar det korrekt.<\/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":[848,901,807,724,868],"tags":[1173],"class_list":["post-228721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228721"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223663"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}