wordpress发布文章时的Action事件

9月 26th, 2012 4,823 留下评论 阅读评论

昨天一网友加QQ询问关于wp-sns-share对于定时发布文章同步微博失效的问题,然后LZ才知道wordpress还支持定时发布文章文章这一神奇的功能,原来在发布文章的界面点击 “立即发布” 右边的编辑按钮选择一个未来的时间,再点击确定,就变成定时发布了。

wordpress实现定时发布的原理,模拟了一套CRON API,位于/wp-includes/cron.php。程序上并没有真正每分钟都去扫描一次而是在有用户访问的时候才去检测是否到了触发的时间,如果满足触发条件就新发起一个http请求(这样异步的方式不会阻塞原来那次http访问),坏处就是如果完全没有人访问的话,定时就失效啦,而且比较难做到很准时除非每分每秒都有访问量。

为了搞明白wp-sns-share对于定时发布文章同步微博失效的原因,对着wordpress源码调试了很久,顺带着把这块源码摸熟了不少,搞清楚了Action事件这一套路,值得讲一讲。

绑定Action的add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1)函数,第四个要注意下,很多Action事件不只一个参数的,这样参数设置好可以在自己的函数里少执行一些数据库操作。

下面列举一些wordpress发布文章中会调用的Action事件,按顺利为:

涉及到的属性值,$post为文章对象,ID为文章ID,文章对象的post_status属性、post_type属性。

  • pre_post_update : 参数1个($post_ID)。只要文章已经存在(有了ID)就会被触发,在文章内容被保存前触发。
  • transition_post_status : 参数3个($new_status, $old_status, $post)。比较通用的一个事件。
  • {$old_status}_to_{$new_status} : 参数1个($post)。比如future_to_publish事件可以很好地抓取定时文章发布,draft_to_publish事件则是普通文章发布的事件。
  • {$new_status}_{$post->post_type} : 参数2个($post->ID, $post)。比如众所周知的publish_post事件,这里的组合太多啦。
  • edit_post : 参数2个($post->ID, $post)。只要文章已经存在(有了ID)就会被触发。
  • post_updated : 参数3个($post_ID, $post_after, $post_before)。只要文章已经存在(有了ID)就会被触发。
  • save_post : 参数2个($post->ID, $post)。
  • wp_insert_post : 参数2个($post->ID, $post)。

很清楚明了地可以发现,post_updated事件是最强大的最万能的,可以获取到最多的参数,包括文章修改前和修改后的所有内容;其次是 transition_post_status 事件。而{$old_status}_to_{$new_status} 和 {$new_status}_{$post->post_type} 事件的针对性很强大,可以选择某一种特殊情况进行事件抓取。而edit_post save_post 、wp_insert_post 这3个事件就比较鸡肋,基本任何情况都会触发但却很难判断具体是哪种情况,建议不用。

发布、编辑文章的主要代码在/wp-includes/post.php里,主要函数wp_update_post、wp_insert_post等,可以好好看一下。

看源码是最靠谱的,而且也能学习到很多,wordpress的源码真心高深莫测!如果能把wordpress的源码全部看明白了,相信web设计和开发的能力就非常强大了。

Categories: Wordpress 标签:,
  1. 4月 18th, 2015 14:42

    请问

    我想在文章新建和保存时,将提交的内容处理后,再提交上去;要怎么做呢

    例如:

    想把内容自己分页;

    提交的内容是:$_POST[post_content]

    处理好内容是:$img_post_content_new

    那我保存时要怎么做呢

    我尝试:

    function is_dmz_auto_page( $post_id ) {

    if ( $parent_id = wp_is_post_revision( $post_id ) )
    $post_id = $parent_id;

    $content=$img_post_content_new=str_replace($search_array,$replace_array,$_POST[post_content]);

    $my_post = array();
    $my_post[‘ID’] = $post_id;
    $my_post[‘post_content’] =$content;
    wp_update_post($my_post );

    update_post_meta($post_id, ‘dmz_img_nextpage’, ‘ok’);

    }
    add_action( ‘save_post’, ‘is_dmz_auto_page’ );

    我这样写不行

    • 不好意思,我并没有写过这方面的,wp的程序也好久没碰了…

  2. 5月 6th, 2013 12:24

    我comment_unapproved_to_approved和comment_post用得最多

    • 评论发表和批准的时候做什么事呢?发送邮件?

  3. 11月 24th, 2012 08:43

    请问你可以接受定做wordpress插件吗?如果可以,希望能和你合作一下。大致要求是一个项目管理插件,有任务的时候自动向团队成员发布提醒,某位成员完成了任务会自动发一个邮件提醒接下来怎么做,每个程序的要求等。这个流程我会写出来。我知道可以在现有的项目管理的插件基础上进行修改就是了。只是我对于php不太懂。期待回复。

    • 具体发邮件看看吧

  4. 9月 28th, 2012 13:48

    wordpress的源码全部看明白那是多么大的工作量啊 不是把英文词典背会了你就会English的

    • 一个Linux也能一个人写得出来,看完wordpress源码自然也不是难事,只不过很少人会有那么长的空闲时间

  5. 9月 27th, 2012 10:17

    这样的异步方式倒是也不错,至少减少了服务器的负担,只是这样是不是对收录会有影响啊。

    • 异步发送增加一次http请求应该算是增加了服务器负担,为的是减少用户访问时间。这和收录没有关系…