Як у 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 в базі даних.

🧪 Результат

  • В адмінці біля сторінки з'явиться мітка "НЕ ПІДЛЯГАЄ ВИДАЛЕННЮ".
  • Кнопка "Видалити" буде прихована.
  • Якщо хтось спробує обійти інтерфейс (через пряме посилання), буде показано повідомлення з помилкою.

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

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

✅ Поради

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

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, інтернет-магазини, блоги на WordPress. Надаю консультації з WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *