Удаление контента с помощью wp_delete_post в плагине с пользовательским типом записи

Я установил плагин, который добавляет пользовательский тип поста, а затем вводит кучу фиктивного контента с 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, Когда я тестирую эти функции без специального поста, посты добавляются при активации и удаляются при деактивации. Так что я знаю, что проблема с типом поста. Кто-нибудь знает, как обойти это?

2 ответа

Решение

Попробуйте что-то вроде этого (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).

wp_delete_post($ID, false)отправляет его в корзину. Только когда вы удаляете из корзины, сообщение действительно удаляется. Вот почему это работает с $force = true,

Так что все работает как положено. Сначала сообщения отправляются в корзину, а затем фактически удаляются. Как корзина. Проследить post_status измените, чтобы увидеть, когда он попадет в корзину, если вы хотите что-то сделать. В противном случае дождитесь удаления.

Также удалять контент при деинсталляции, а не при деактивации. Рассмотрите возможность деактивации плагина как его приостановку и удаление, когда вы действительно хотите, чтобы он исчез.

Попробуйте эту функцию

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 );
            }
        }
    }
Другие вопросы по тегам