现在的位置:首页>wordpress>正文

如何在WordPress操作Posts时执行相应的代码?

2016年07月14日 ⁄ 共 4596字 评论 2 条

这一点,部落之前介绍的wordpress发布或更新文章时邮件通知在博客上参与过评论的用户原理差不多,WordPress对Posts的操作包括Edit、Trash、Untrash和delete,我们主要能用到的,也就是这几个操作了,如果你写了一些自定义代码,希望在文章发生变化时更新一些信息,那么了解这些事件发生时可以使用的actions就变的很有用.

特别是一些使用wordpress的朋友,网站中有付费会员时,那么能做的功能就更多了.

事件发生时触发的actions

除了delete事件,其它都会调用wp_insert_post(),所以save_post或者wp_insert_post对它们都是可用的.

事件发生时触发的actions

Delete事件还有其它几个action:

before_delete_post – 准备删除之前触发

delete_post – 删除post之后触发,此时post meta信息还未删除

after_delete_post – 删的一点不剩了,顺带刷新了post cache

WordPress操作Posts时执行相应的代码使用示例

这个需要根据您自己的需求来布局相应的代码:

例1:在文章更新时执行代码:

  1. function action_on_save( $post_id$post ){   
  2.     // $post_id and $post are required  from www.mfbuluo.com   
  3.     if ( emptyempty$post_id ) || emptyempty$post ) ) {   
  4.         return;   
  5.     }   
  6.     // Dont' save meta boxes for revisions or autosaves   
  7.     if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {   
  8.         return;   
  9.     }       
  10.     // Check the post being saved == the $post_id to prevent triggering this call for other save_post events   
  11.     if ( emptyempty$_POST['post_ID'] ) || $_POST['post_ID'] != $post_id ) {   
  12.         return;   
  13.     }   
  14.     // Check user has permission to edit   
  15.     if ( ! current_user_can( 'edit_post', $post_id ) ) {   
  16.         return;   
  17.     }   
  18.     // If you want to check the custom post type   
  19.     global $post_type;   
  20.     if$post_type == '[CPT]' ){   
  21.         // Your code here     
  22.     }         
  23. }   
  24. add_action( 'save_post', 'action_on_save', 100, 2 );  

这段代码不会再trash、untrash时执行,前面的判断条件把这两种情况过滤掉了。

例2:移动到回收站时执行代码:

  1. function action_on_trash ( $post_id ){   
  2.     global $post_type;   
  3.     if ( $post_type == '[CPT]' ){   
  4.         // Your code here     
  5.     }   
  6. }   
  7. add_action( 'wp_trash_post', 'action_on_trash' );  

批量操作 | Bulk Actions

批量回收、复原或删除文章时,上述actions会被执行若干次,如果你的操作很费资源,那么跟着批量操作执行n次就不太舒服了.

这时可以在WordPress的批量操作执行结束并准备跳转时运行你的代码,要用到wp_redirect filter,虽然filter不能影响程序执行,但更新一下数据库还是可以的.

完整示例代码

下面这段代码在WordPress操作Posts时记录被影响的Post的ID,如果批量操作,就记录所有ID,在wp_redirect时显示哪些ID被影响了,根据传回的post IDs可以进行自己的操作.

注意程序运行到wp_redirect时,若删除文章,则文章已经被删的一干二净了,想再访问post meta已经不可能.

下面的代码只是演示,使用时应判断使用场景.

  1. class CP_Post_Actions{   
  2.     var $post_IDs = array(); // 记录受影响的Post IDs from www.mfbuluo.com   
  3.     public function __construct(){   
  4.         add_action( 'save_post',        array$this, 'save' ), 100, 2 );   
  5.         add_action( 'wp_trash_post',    array$this, 'trash' ) );   
  6.         add_action( 'untrash_post',     array$this, 'untrash' ) );   
  7.         add_action( 'deleted_post',     array$this, 'delete' ) );   
  8.         add_filter( 'wp_redirect',      array$this, 'catch_results') );   
  9.     }    
  10.     // 新建或更新posts时执行   
  11.     function save( $post_id$post ){   
  12.         // $post_id and $post are required   
  13.         if ( emptyempty$post_id ) || emptyempty$post ) ) {   
  14.             return;   
  15.         }    
  16.         // Dont' save meta boxes for revisions or autosaves   
  17.         if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {   
  18.             return;   
  19.         }            
  20.         // Check the post being saved == the $post_id to prevent triggering this call for other save_post events   
  21.         if ( emptyempty$_POST['post_ID'] ) || $_POST['post_ID'] != $post_id ) {   
  22.             return;   
  23.         }   
  24.         // Check user has permission to edit   
  25.         if ( ! current_user_can( 'edit_post', $post_id ) ) {   
  26.             return;   
  27.         }   
  28.         // Check CPT type if necessory   
  29.         global $post_type;   
  30.         if$post_type == '[CPT]' ){   
  31.             // 执行你的代码   
  32.         }   
  33.         // 存储受影响的Post ID,如果指定了CPT,则移动到CPT的判断里   
  34.         $this->post_IDs[] = $post_id;   
  35.     }   
  36.     // 删除posts时执行   
  37.     function delete$post_id ){   
  38.         //你的代码,这里我们只记录post IDs   
  39.         // 如果批量删除,会有多个post IDs被记录   
  40.         $this->post_IDs[] = $post_id;   
  41.     }    
  42.     // 删除到回收站时执行   
  43.     function trash ( $post_id ){   
  44.         //这里演示一下如何判断CPT类型   
  45.         global $post_type;   
  46.         if ( $post_type == '[CPT]' ){   
  47.             //你的代码    
  48.         }   
  49.         $this->post_IDs[] = $post_id;   
  50.     }   
  51.     //从回收站恢复时执行   
  52.     function untrash( $post_id ){   
  53.         //你的代码        
  54.         $this->post_IDs[] = $post_id;   
  55.     }    
  56.     // WordPress处理结束后准备跳转,在这里更新数据   
  57.     function catch_results( $location ){   
  58.         // 根据受影响的post IDs来操作   
  59.         if( !emptyempty$this->post_IDs ) ){   
  60.             echo '<pre>';   
  61.             print_r( $this->post_IDs );   
  62.             echo '</pre>';   
  63.             echo '<a href="'.$location.'">Continue</a>';   
  64.             exit;   
  65.         }   
  66.         // 操作完成后进行正常的跳转   
  67.         return $location;   
  68.     }   
  69. }   
  70. new CP_Post_Actions();  

小结

文章内容来源自网络,由免费部落整理发布.

我们有时候,需要添加某个功能时,经常会在当前主题的functions.php这个文件中看到很多的actions字段,其实这个就是在操作这些相应的功能了.

评论 2 条 评论内容很精采,有内幕,而且绝对有干货

  1. 创意产品 2016年07月14日 16:34  @回复  Δ-49楼 回复

    写得很好

  2. 香港服务器 2016年07月14日 17:15  @回复  Δ-48楼 回复

    虽然代码很多,但是害死蛮简单的,可能是因为博主写得很容易理解的原因

给我留言