Что такое и для чего нужен файл uninstall.php в WordPress

Плагин WordPress, который добавляет свои данные в базу данных, должен очищать их после того, как пользователь его удалил. Для этого в движке есть простой и удобный инструмент — файл uninstall.php. Разберем, что он может, и как его использовать ВордПресс-разработчику.

Как работает uninstall.php в WordPress

Он помещается в корневой каталог плагина. Например, дополнение находится в папке

plugins/add-comments/

С файлом удаления она будет иметь структуру:

plugins/add-comments/
/add-comments.php
/index.php
/uninstall.php
/readme.txt

Когда пользователь в админке нажимает Удалить, движок ищет файл uninstall.php и выполняет его. Это позволяет разработчикам плагинов убирать «мусор» из базы данных.

Что может uninstall.php

Он может содержать любой код, необходимый для очистки и удаления всех данных плагина. Но первым делом должен иметь защиту от нежелательного доступа.

if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) exit;

Эта строка должна находится в самом его начале. В тоге, если что-то кроме WordPress попытается получить доступ к файлу, скрипт немедленно будет завершен.

Пример uninstall.php, который удаляет несколько типов данных:

<?php
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) exit;
// удалить опции плагина
// удалить промежуточные данные
// удаляем cron-события
// удалить что-либо еще

Правильно будет очистить все данные их БД, а также файловую структуру модуля.

Удаление опций плагина

Часто в плагинах создаются свои опции. Чтобы их удалить, используется функция delete_option(). Например, чтобы удалить опцию с названием add_comments_options можно этим кодом:

delete_option( 'add_comments_options' );

Чтобы удалить несколько опций, можно использовать массив:

$options = array (
    'add_comments_options_1',
    'add_comments_options_2',
    'add_comments_options_3',
);
foreach ( $options as $option ) {
    if ( get_option( $option ) ) delete_option( $option );
}

Вместо add_comments_options_1 и остальных укажите свои названия.

Удаление промежуточных данных (transients)

Они тоже хранятся в базе данных ВордПресс. Для этого есть функция delete_transient():

delete_transient( 'add_comments_transient' );

Для массовой очистки:

$transients = array (
    'add_comments_transient_1',
    'add_comments_transient_2',
    'add_comments_transient_3',
);
foreach ( $transients as $transient ) {
    delete_transient( $transient );
}

Удаление cron-событий

Используется функция wp_unschedule_event(). Например:

$timestamp = wp_next_scheduled( 'add_comments_cron_event' );
wp_unschedule_event( $timestamp, 'add_comments_cron_event' );

Удаление таблиц БД

Чтобы удалить таблицу с названием add_comments_table:

global $wpdb;
$table_name = $wpdb->prefix .'add_comments_table';
$wpdb->query( "DROP TABLE IF EXISTS {$table_name}" );

wpdb — это WordPress-класс для операций с таблицами базы данных.

Удаление записей и страниц

Для этого служит функция wp_trash_post(). Например, чтобы удалить пост с ID=123:

wp_trash_post( 123 );

Удалять посты и страницы нужно в том случае, если вы абсолютно уверены, что пользователю они больше не нужны. Один из способов это выяснить — добавить опцию на странице настроек плагина с вопросом «Удалить посты/записи при удалении плагина?»

Удаление пользовательских типов записей

Часто в плагине нужно создать свой тип записей. При удалении дополнения эти записи тоже нужно удалять. Для этого используют wp_delete_post(). Например, чтобы удалить все записи, которые относятся к пользовательскому типу add_comments_cpt:

$add_comments_cpt_args = array( 'post_type' => 'add_comments_cpt', 'posts_per_page' => -1 );
$add_comments_cpt_posts = get_posts( $add_comments_cpt_args );
foreach ( $add_comments_cpt_posts as $post ) {
wp_delete_post( $post->ID, false );
}

Функция get_posts() выбирает все записи, которые относятся к нашему типу. Затем идет их перебор и удаление функцией wp_delete_post(). В коде вместо add_comments_cpt подсавьте свое значение.

Также будут удалены комментарии, мета-поля, таксономии этих записей.

Параметр false указывает движку, чтобы он помещал посты в корзину. Если хотите удалить их безвозвратно, поставьте true.

Удаление метаданных пользователя

Для этого имеется delete_user_meta(). Например, нужно удалить все метаданные пользователя с именем add_comments_user_meta:

$users = get_users();
foreach ( $users as $user ) {
    delete_user_meta( $user->ID, 'add_comments_user_meta' );
}

get_users() — получает массив всех зарегистрированных пользователей. Дальше он перебирается и функцией delete_user_meta() удаляются все пользовательские метаданные с именем add_comments_user_meta.

Удаление метаданных записи

Метаданные постов удаляет функиця delete_post_meta(). Удалим, например, все мета с названием add_comments_post_meta:

$add_comments_post_args = array( 'posts_per_page' => -1 );
$add_comments_posts = get_posts( $add_comments_post_args );
foreach ( $add_comments_posts as $post ) {
    delete_post_meta( $post->ID, 'add_comments_post_meta' );
}

В параметре posts_per_page использовано значение -1, чтобы получить все записи.

Удаление метаданных записи для произвольного типа записей

Если хотите удалить метаданные только определенного типа записи , замените значение $add_comments_post_args в приведенном выше коде на следующее:

array( 'post_type' => 'add_comments_cpt', 'posts_per_page' => -1 );

Вместо add_comments_cpt подставьте название своего типа.

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

Если Вам понравилась статья — поделитесь с друзьями
Михаил Петров
Привет! Меня зовут Михаил Петров. Я копирайтер и занимаюсь этим с 2013 года. Скрупулезность и ответственность - моя фишка! Не могу делать как попало и добиваюсь, чтоб заказчик сказал минимум “неплохо”. За все время своей работы пришлось написать и отредактировать немало разной “текстовухи”, включая SEO-тексты, отзывы и прочую чушь. На сегодняшний день специализируюсь на написании информационных статей и руководств технического направления. Вижу смысл и светлое будущее в текстах для людей, а не для машин.
Задать вопрос