add_action hook für komplett neue Post?

publish_post Wird ausgeführt, wenn ein Beitrag veröffentlicht wird oder wenn er bearbeitet wird und sein Status “veröffentlicht” ist. Aktionsfunktionsargumente: Post-ID.

– Plugin API Dokumentation

Ich habe den publish_post-Hook zu einem WordPress-Plugin hinzugefügt, das ich gerade schreibe. Die vom Hook selbst aufgerufene function soll die Kategorien mehrerer Posts mit der function wp_update_post ändern.

Dieser Hook funktioniert jedoch nicht, da das Ergebnis von der Ausführung von wp_update_post immer 0 ist. Meine beste Vermutung ist, dass das Ausführen von wp_update_post eine andere Instanz meines Hooks zum Laufen bringt, weil er den Post erneut veröffentlicht … was meiner Meinung nach den “. ..oder wenn es bearbeitet wird und sein Status “veröffentlicht” “ der obigen Aussage ist.

Gibt es einen anderen Aktions-Hook, den ich benutzen kann, der nur aufgerufen wird, wenn der hinzugefügte Beitrag komplett neu und nicht bearbeitet ist?

 info('BEGIN: categoryShifter.shiftCategories()'); $firephp->log($post_ID, 'post_ID: '); $firephp->trace('trace to here'); $first_teir_id = categoryShifter::getIDForCategory($first_teir_cat, $firephp); $second_teir_id = categoryShifter::getIDForCategory($second_teir_cat, $firephp); $firephp->log($first_teir_id, '$first_teir_id'); $firephp->log($second_teir_id, '$second_teir_id'); $qPostArgs = array( 'numberposts' => 100, 'order' => 'DESC', 'orderby' => 'post_date', 'post_type' => 'post', 'post_status' => 'published', 'category_name' => $first_teir_cat ); $firstTeirPosts = get_posts($qPostArgs); $firephp->log($firstTeirPosts, 'got posts:'); $firephp->log(sizeof($firstTeirPosts), 'sizeof'); // NOTE: This appears to work. for($i = sizeof($firstTeirPosts)-1; $i > $maxNumPostsFirstTeir-4; $i--) { $newCats = array($second_teir_id); $editingId = $firstTeirPosts->ID; $result = wp_set_post_categories($editingId, $newCats); /* NOTE: Doesn't work presently... returns an array with the $second_teir_id in it. */ $firephp->log($result, 'Result'); } /* $my_post = array(); $my_post['ID'] = 132; $my_post['post_category'] = array($second_teir_id); $firephp->log('Before', 'Before'); if(wp_update_post( $my_post ) == 0) { $firephp->Error('Fatal Error, Post not updated', 'error'); } $firephp->log('After', 'After'); */ return $post_ID; } function getIDForCategory($cat_name, $logger) { $logger->Info("Begin: getIDForCategory()"); $cats = get_categories(); $whichCatId = ""; foreach($cats as $single_cat) { if($single_cat->name == $cat_name) { $whichCatId = $single_cat->term_id; break; } } $logger->Info("End: getIDForCategory()"); return (int)$whichCatId; } } /* Hook Post Creation */ /* add_action('publish_post', array('categoryShifter','shiftCategories')); */ add_action('wp_insert_post', array('categoryShifter', 'shiftCategories')); ?> 

Ich habe vorläufig den wp_insert_post-Hook benutzt … aber ich kann immer noch nicht die wp_set_post_categories-function bekommen, um die Kategorien der Posts zu ändern.

Ich verstehe, dass ich diesen Code wahrscheinlich aktualisieren muss, so dass er die vorhandenen Kategorien des Posts berücksichtigt und nur die vom Plugin angegebenen ändert, aber im Moment ist es wirklich nur ein Alpha.

Solutions Collecting From Web of "add_action hook für komplett neue Post?"

 add_action('new_to_publish', 'your_function'); add_action('draft_to_publish', 'your_function'); add_action('pending_to_publish', 'your_function'); 

Genau die Erstellung eines neuen Posts ist tatsächlich schwieriger als es scheint. Technisch gibt es mehrere Möglichkeiten, Posts zu erstellen oder zu aktualisieren und es gibt viele nicht so offensichtliche Dinge, die auch technisch Beiträge sind (Revisionen zum Beispiel).

WordPress bietet dynamische Hooks, die nicht nur Post-Erstellung, sondern auch was es war und was es wurde. Siehe Post-Statusübergänge im Codex.

Mehr durch Experimentieren als durch Befolgen der Dokumente funktioniert das für mich (WP 3.3). Ich erhalte einen transaction_post_status-Hook-Aufruf, bei dem $ new_status auf “auto-draft” gesetzt wird, wenn Sie einen neuen Post erstellen.

 function my_post_new($new_status, $old_status=null, $post=null){ if ($new_status == "auto-draft"){ // do stuff here } } add_action('transition_post_status', 'my_post_new');