В WordPress часто накапливаются различные типы постов, которые уже не используются на сайте, например, кастомные типы, созданные плагинами, или временные записи. Это приводит к увеличению размера базы данных, замедлению работы сайта и усложнению управления контентом. В этой статье мы подробно разберем, как можно автоматически находить и удалять неиспользуемые типы постов, используя код и плагины, с примерами и рекомендациями.
Что такое типы постов в WordPress и почему важно их удалять
Типы постов (post types) — это способ группировки и хранения контента в WordPress. Помимо стандартных post и page, могут быть созданы пользовательские типы, например, product, portfolio или event. Когда такие типы перестают использоваться, записи остаются в базе, создавая «мусор».
Удаление неиспользуемых типов постов позволяет:
- Оптимизировать базу данных и уменьшить её размер.
- Повысить скорость запросов и загрузки сайта.
- Сделать админ-панель WordPress чище и удобнее.
- Снизить риск ошибок и конфликтов с другими плагинами.
Однако удалять записи нужно аккуратно, чтобы не потерять важные данные.
Как найти неиспользуемые типы постов — анализ базы данных
Первый шаг — определить, какие типы постов не используются. Для этого можно:
- Посмотреть список зарегистрированных типов постов с помощью функции
get_post_types(). - Проверить количество записей каждого типа в базе:
SELECT post_type, COUNT(*) FROM wp_posts GROUP BY post_type; - Оценить, какие типы не отображаются на сайте и не используются в админке.
Для упрощения анализа можно использовать плагин Post Types Order или WP phpMyAdmin для работы с базой данных.
Пример кода для вывода типов постов с количеством записей
function wpeditor_list_post_types_count() {
$post_types = get_post_types(['public' => true], 'objects');
echo '<ul>';
foreach ($post_types as $post_type) {
$count_posts = wp_count_posts($post_type->name);
$count = array_sum((array) $count_posts);
echo '<li>' . esc_html($post_type->label) . ' (' . esc_html($post_type->name) . '): ' . intval($count) . '</li>';
}
echo '</ul>';
}
add_action('admin_notices', 'wpeditor_list_post_types_count');Этот код выводит в админке список типов постов с количеством записей, что помогает быстро оценить объемы данных.
Автоматическое удаление записей неиспользуемых типов с помощью кода
После анализа можно написать функцию, которая удалит все записи выбранного типа поста. Важно делать это с подтверждением и резервным копированием базы.
Пример функции для удаления всех постов типа old_custom_type
function wpeditor_delete_unused_post_type_posts($post_type) {
$args = [
'post_type' => $post_type,
'post_status' => 'any',
'posts_per_page' => -1,
'fields' => 'ids',
];
$posts = get_posts($args);
if (!empty($posts)) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
}
}
}
// Вызов функции для удаления
// wpeditor_delete_unused_post_type_posts('old_custom_type');Такую функцию можно запускать вручную или через крон, например, с проверкой условий.
Как сделать безопасное удаление с подтверждением
Для безопасности лучше запускать удаление через админскую страницу с nonce:
function wpeditor_register_delete_page() {
add_submenu_page(
'tools.php',
'Удаление типов постов',
'Удаление типов постов',
'manage_options',
'wpeditor-delete-post-types',
'wpeditor_delete_page_html'
);
}
add_action('admin_menu', 'wpeditor_register_delete_page');
function wpeditor_delete_page_html() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_POST['wpeditor_delete_nonce']) && wp_verify_nonce($_POST['wpeditor_delete_nonce'], 'wpeditor_delete_action')) {
$post_type = sanitize_text_field($_POST['post_type']);
wpeditor_delete_unused_post_type_posts($post_type);
echo '<div class="notice notice-success">Удаление типа постов "' . esc_html($post_type) . '" выполнено.</div>';
}
$post_types = get_post_types(['public' => true], 'objects');
echo '<h1>Удаление неиспользуемых типов постов</h1>';
echo '<form method="POST">';
wp_nonce_field('wpeditor_delete_action', 'wpeditor_delete_nonce');
echo '<select name="post_type">';
foreach ($post_types as $post_type) {
echo '<option value="' . esc_attr($post_type->name) . '">' . esc_html($post_type->label) . '</option>';
}
echo '</select>';
echo '<input type="submit" value="Удалить" class="button button-primary" />';
echo '</form>';
}Использование плагинов для удаления неиспользуемого контента
Если не хочется писать код, можно использовать плагины. Хороший вариант — Clearfy Pro, который умеет оптимизировать базу, удалять временные типы постов и очищать метаданные.
Преимущества использования плагина:
- Простота и безопасность: пользовательский интерфейс для выбора типов постов.
- Дополнительные инструменты для очистки базы и оптимизации.
- Поддержка и обновления от разработчиков.
Также можно рассмотреть WP-Optimize для общей оптимизации базы, хотя он не всегда фокусируется на конкретных типах постов.
Рекомендации и советы по работе с типами постов
Чтобы избежать накопления неиспользуемого контента в будущем:
- Регулярно проверяйте список типов постов и их использование.
- При удалении плагина, который создавал кастомные типы, удаляйте и связанные записи (если они не нужны).
- Используйте резервное копирование базы перед массовым удалением.
- Автоматизируйте проверку типов постов с помощью WP Cron и создавайте отчеты.
Например, можно добавить функцию для ежедневной проверки и отправки отчета на email с ненулевыми типами постов.
Пример кода автоматической проверки и уведомления
function wpeditor_daily_post_type_report() {
$post_types = get_post_types(['public' => true], 'names');
$report = '';
foreach ($post_types as $post_type) {
$count = wp_count_posts($post_type)->publish ?? 0;
if ($count > 0) {
$report .= $post_type . ': ' . $count . "\n";
}
}
if ($report) {
wp_mail('admin@example.com', 'Ежедневный отчет по типам постов', $report);
}
}
add_action('wpeditor_daily_event', 'wpeditor_daily_post_type_report');
if (!wp_next_scheduled('wpeditor_daily_event')) {
wp_schedule_event(time(), 'daily', 'wpeditor_daily_event');
}