Råkade ut för en lustig effekt när jag jobbade med ett WordPressplugin. Scenariot var att jag i en viss situation ville spara en helt ny sida, när man i pluginet sparar en annan sida. wp_insert_post bör lösa detta på ett bra sätt. Problemet som uppkom var att jag skapade en oändlig loop med effekten att det sparades nya sidor tills minnet åts upp.

 

Sidor som finns men ändå inte

 

 

Ett annat problem var att de ny sidorna faktiskt inte dök upp i listningen. Märktes enligt bilden, där antal sidor för ”Alla” är 2338, men bara en syns i listan. Vilket var irriterande men lätt löst.  Note-to-self: det ska vara publish och inte published… hade alltså satt fel ‘post_status’.

Koden för att lägga till en sida programmatiskt är alltså exempelvis:

$args = array (
 "post_type" => "page",
 "post_title" => "En ny sida",
 "post_content" => "Lite innehåll",
 "post_status" => "publish",
 "post_author" => '1',
 );
 
$postID = wp_insert_post($args);

($PostID innehåller alltså IDt på den nyss skapade sidan.) Till saken hör att jag ville göra detta när jag sparar en sida, lite beroende på eventuella värden i ett eller flera custom fields. Funktionen som hanterar detta, anropas via action save_post.

Om man funderar lite, vilket jag alltså inte gjorde, så är det rimligt att save_post triggas från wp_insert_post. Dvs, min add_action(”save_post”,”my_function”)  kommer köras om och om igen, vilket då givetvis ger denna effekt.

I det här fallet ville jag dock att denna funktion skulle köras på en viss custom post type. Jag ville skapa en sida av annan page_type, så lösning var helt enkelt att kolla så id:t på posten som sparas tillhör min önskade sidtyp. Om inte så avbryt helt enkelt.

function my_function($id)
{
   if('my_post_type' == get_post_type($id)) {
      if(!current_user_can('edit_page', $id)) {
         return $id;
      }
   } else {
      ..move on!
   }
}

Så, nu vet jag, och ni, det.