问题描述
publish_post Runs when a post is published, or if it is edited and its status is “published”. Action function arguments: post ID.
我已经将 publish_post 钩子添加到我正在编写的 WordPress 插件中。钩子本身调用的函数是使用 wp_update_post 函数来更改多个帖子的类别。
这个钩子不行,因为从运行结果返回的结果 wp_update_post 总是 0. 我最好的猜测是,运行 wp_update_post 导致另一个我的钩子的一个实例,因为它的 re-publishes 的帖子… 我相信带来了 「…」 或者如果被编辑,并且其状态是上述声明的”published”” 。
有没有其他可以使用的 action-hook,只有当该帖子被添加为全新且未被编辑时才会被调用?
<?php
/*
Plugin Name: Category Switcher Plugin
Plugin URI: http://www.example.com
Description: When a new post is created this plugin will cause the
Version: 0.1
Author: Me
License: GPL2
?>
<?php
class categoryShifter {
function shiftCategories($post_ID) {
$maxNumPostsFirstTeir = 4;
$first_teir_cat = "Fresh News Stories 1";
$second_teir_cat = "Slightly Dated Stories 2";
$firephp = FirePHP::getInstance(true);
$firephp->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'));
?>
我现在已经切换到使用 wp_insert_post 挂钩… 但是我仍然无法获取 wp_set_post_categories 功能来更改帖子的类别。
我明白,我可能需要更新此代码,以便它考虑到现有的职位类别,只修改由插件指定的类别,但现在它只是一个 alpha 。
最佳解决思路
add_action('new_to_publish', 'your_function');
add_action('draft_to_publish', 'your_function');
add_action('pending_to_publish', 'your_function');
次佳解决思路
确切地说,创建新职位的目标其实比看起来更棘手。技术上,有多种方式可以创建或更新,并且有很多不是很明显的东西,技术上的帖子 (例如修改) 。
WordPress 提供了动态挂钩,不仅跟踪后创建,而且它是什么和它成为什么。见食典中的 Post Status Transitions 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。