使用自定义帖子类型在插件中使用wp_delete_post删除内容

时间:2013-02-14 19:30:31

标签: wordpress custom-post-type dummy-data

我设置了一个添加自定义帖子类型的插件,然后在激活时带来一堆虚拟内容和wp_insert_post:

    register_activation_hook( __FILE__, array( $this, 'activate' ) );
public function activate( $network_wide ) {
        include 'dummycontent.php';
        foreach ($add_posts_array as $post){
        wp_insert_post( $post );
    };
} // end activate

我想在停用插件时删除此内容,因此我设置了此功能:

    register_deactivation_hook( __FILE__, array( $this, 'deactivate' ) );
   public function deactivate( $network_wide ) {
        include 'dummycontent.php';
    foreach($remove_posts_array as $array){
        $page_name = $array["post_title"];
        global $wpdb;
        $page_name_id = $wpdb->get_results("SELECT ID FROM " . $wpdb->base_prefix . "posts WHERE post_title = '". $page_name ."'");
        foreach($page_name_id as $page_name_id){
            $page_name_id = $page_name_id->ID;
            wp_delete_post( $page_name_id, true );
        };
    };      
} // end deactivate

它运作得很好。除非因为自定义帖子类型是使用运行这两个函数的相同插件创建的,否则在帖子本身可以通过wp_delete_post之前删除帖子类型。当我在没有自定义帖子类型的情况下测试这些功能时,在激活时添加帖子并在停用时删除。所以我知道问题在于帖子类型。有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

尝试这样的事情(YOUTPOSTTYPE是你的帖子类型的名称):

function deactivate () {
  $args = array (
    'post_type' => 'YOURPOSTTYPE',
    'nopaging' => true
  );
  $query = new WP_Query ($args);
  while ($query->have_posts ()) {
    $query->the_post ();
    $id = get_the_ID ();
    wp_delete_post ($id, true);
  }
  wp_reset_postdata ();
}

它适用于我的插件,它应该适用于你的插件。 (已经使用WordPress 3.5.1进行了测试)。

答案 1 :(得分:1)

wp_delete_post($ID, false)将其发送到“已删除邮件”。仅当您从“已删除邮件”中删除邮件时,才会将其删除。这就是为什么它适用于$force = true

所以它按预期工作。第一篇文章转到垃圾箱,然后实际删除。像回收站一样。如果您想要执行任何操作,请跟踪post_status更改以查看它何时到达“已删除邮件”。否则等待删除。

同时删除uninstall上的内容,而不是取消停用。请考虑停用插件暂停,并在您真正想要它时将其卸载。

答案 2 :(得分:0)

尝试使用此功能

function deactivate () {             
        $args = array(
            'post_type'      => 'POST_TYPE', 
            'posts_per_page' => - 1
        );

        if ( $posts = get_posts( $args ) ) {
            foreach ( $posts as $post ) {
                wp_delete_post( $post->ID, true );
            }
        }
    }