Як у WordPress заборонити видалення окремих сторінок (записів)
Привіт:) У цьому пості покажу, як у WordPress заборонити видалення окремих сторінок або записів. Така задача виникає, коли на сайті є критично важливі сторінки. Наприклад:
- головна сторінка;
- сторінка з політикою конфіденційності;
- технічні або службові записи, пов’язані з логікою роботи сайту (наприклад, шаблонні сторінки WooCommerce);
- або просто контент, який ніколи не має бути видалений з міркувань SEO.
📌 Суть рішення
Створю PHP-клас, який:
- перевірятиме список важливих сторінок і записів;
- відображатиме біля них мітку "НЕ ПІДЛЯГАЄ ВИДАЛЕННЮ";
- видалить кнопку "Видалити" зі списку дій в адмінці;
- заблокує саме видалення таких об'єктів через інтерфейс WordPress.
🛠️ Код рішення
Наведений нижче код розмістіть у файлі functions.php вашої активної теми або у власному плагіні.
if ( ! is_admin() ) {
return;
}
final class MP_Important_Pages {
public static array $importantPages = [
// 'page' — для сторінок, 'post' — для звичайних записів, можна додати й інші типи (наприклад, 'product')
'page' => [
'sample-page',
'page-2',
'page-3',
]
];
public static function mp_init() {
add_filter( 'display_post_states', [ __CLASS__, 'mp_mark_in_post_list_page' ], 10, 2 );
add_action( 'pre_trash_post', [ __CLASS__, 'mp_restrict_post_deletion' ], 10, 2 );
add_filter( 'pre_delete_post', [ __CLASS__, 'mp_restrict_post_deletion' ], 10, 2 );
add_filter( 'page_row_actions', [ __CLASS__, 'mp_remove_row_action' ], 10, 2 );
}
public static function mp_mark_in_post_list_page( array $postStates, $post ): array {
if( self::mp_is_post_in_list( $post ) ) {
$postStates[] = '<small>НЕ ПІДЛЯГАЄ ВИДАЛЕННЮ</small>';
}
return $postStates;
}
public static function mp_remove_row_action( array $actions, $post ): array {
if( self::mp_is_post_in_list( $post ) ) {
unset( $actions['delete'] );
}
return $actions;
}
public static function mp_restrict_post_deletion( $delete, $post ) {
if( self::mp_is_post_in_list( $post ) ) {
wp_die( "Сторінка `$post->post_name` не може бути видалена!" );
}
return $delete;
}
private static function mp_is_post_in_list( $post ): bool {
if( empty( $post->post_type ) ) {
return false;
}
$list = self::$importantPages[ $post->post_type ] ?? [];
return in_array( $post->post_name, $list, true );
}
}
MP_Important_Pages::mp_init();
🧩 Як налаштувати список захищених сторінок
У масиві $importantPages вказуйте тип записів (page, post, product, custom_type) як ключ, а масив слагів (тобто post_name) як значення:
'page' => [ 'about-us', 'home' ],
'post' => [ 'seo-guide' ],
Знайти slug сторінки можна в URL-адресі редагування сторінки або через post_name в базі даних.
🧪 Результат
- В адмінці біля сторінки з'явиться мітка "НЕ ПІДЛЯГАЄ ВИДАЛЕННЮ".
- Кнопка "Видалити" буде прихована.
- Якщо хтось спробує обійти інтерфейс (через пряме посилання), буде показано повідомлення з помилкою.

При спробі видалити таку сторінку користувач побачить повідомлення

✅ Поради
- Для надійності можна винести цей код в окремий плагін, щоб зміна теми не зламала обмеження.
- Також можна розширити логіку, щоб показувати окрему роль (наприклад, дозволити видалення тільки користувачеві з правами адміністратора).
