Удаление контента с помощью 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 );
}
}
}