Öffnet in einem neuen Tab

WordPress Menü löschen verhindern

Autor
Lesezeit
Share

Ein falscher Klick genügt, und das komplette Hauptmenü einer WordPress-Website ist weg. Unter Design → Menüs liegt der Link „Menü löschen“ direkt neben dem Speichern-Button. Wer nur einen einzelnen Menüpunkt entfernen will, erwischt schnell den falschen Link. WordPress fragt zwar kurz nach, aber diesen Standard-Dialog klickt man im Alltag einfach weg.

Was das Snippet macht

Statt des unscheinbaren Browser-Dialogs erscheint ein deutliches Warn-Popup. Es zeigt den Namen des betroffenen Menüs und erklärt, dass die Löschung endgültig ist. Erst nachdem das Wort LÖSCHEN eingetippt wurde, wird der Lösch-Button aktiv.

Das Popup enthält außerdem einen Hinweis, wie man stattdessen einen einzelnen Menüpunkt entfernt. Der häufigste Grund für versehentliches Löschen ist damit gleich mit abgedeckt.

Die Funktionen im Überblick:

  • Auffälliges Warn-Modal statt Standard-Dialog
  • Löschung erst nach Eingabe von „LÖSCHEN“
  • Anzeige des Menünamens, damit klar ist, was gelöscht wird
  • Serverseitige Absicherung: Menüs ohne Bestätigung werden nicht gelöscht
  • Abbrechen per Button, Klick daneben oder Escape-Taste
  • Keine Einstellungen, keine Datenbank-Einträge, kein Ballast

Für wen ist das Snippet gedacht?

Das Snippet ist vor allem für Agenturen und Freelancer gedacht, die WordPress-Websites für Kunden betreuen. Kunden sollen ihre Inhalte selbst pflegen können, aber ein gelöschtes Menü bedeutet meistens einen Support-Anruf und eine Wiederherstellung aus dem Backup. Das kostet Zeit, die niemand bezahlt.

Auch auf eigenen Websites mit mehreren Redakteuren, zum Beispiel bei Vereinen, Pfarren oder kleinen Unternehmen, bringt der Schutz deutlich mehr Ruhe.

Warum nicht einfach die Berechtigungen einschränken?

Man könnte Redakteuren den Zugriff auf die Menüs ganz entziehen. In der Praxis sollen Kunden aber oft genau dort selbst Seiten hinzufügen oder umbenennen. Das Snippet lässt den Zugriff vollständig bestehen und baut nur dort eine Hürde ein, wo ein Fehler wirklich wehtut.

Installation in zwei Minuten

  1. Den Code als Datei dw-menu-loeschschutz.php speichern.
  2. Die Datei per FTP oder Dateimanager in den Ordner wp-content/mu-plugins/ hochladen. Falls es den Ordner noch nicht gibt, einfach anlegen.
  3. Fertig, eine Aktivierung ist nicht nötig.

Als Must-Use-Plugin taucht das Snippet nicht in der Plugin-Liste auf. Kunden können es deshalb auch nicht versehentlich deaktivieren. Wer lieber mit einem Snippet-Plugin wie Code Snippets oder WPCode arbeitet, kann den Code dort einfügen und die Kopfzeilen weglassen.

Kompatibilität

Das Snippet greift ausschließlich auf der Seite Design → Menüs und lädt nirgendwo sonst Code. Es funktioniert mit klassischen Themes und gängigen Page-Buildern wie Elementor, Bricks oder Divi, solange die Menüs über die WordPress-Menüverwaltung gepflegt werden. Block-Themes mit Full Site Editing verwenden ein eigenes Navigations-System und sind nicht betroffen.

Häufige Fragen

Verlangsamt das Snippet meine Website?
Nein. Der Code wird nur im Backend auf der Menü-Seite geladen. Im Frontend kommt davon nichts an.

Kann ich das Bestätigungswort ändern?
Ja. Im Code an zwei Stellen „LÖSCHEN“ durch ein beliebiges Wort ersetzen.

Was passiert bei einem WordPress-Update?
Das Snippet nutzt Standard-Hooks von WordPress und bleibt auch nach Updates aktiv.


Lieber gar keine Sorgen mit Ihrer Website? Mit der WordPress-Wartung von digital workshop kümmern wir uns um Updates, Backups und Sicherheit, damit ein falscher Klick nie zum Problem wird.

<?php
/**
 * Plugin Name: DW Menü-Löschschutz
 * Description: Warn-Popup mit Tipp-Bestätigung beim Löschen eines Menüs unter Design → Menüs.
 * Author: digital workshop
 * Version: 1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Serverseitiger Schutz: Löschen nur mit Bestätigungs-Parameter.
 */
add_action( 'load-nav-menus.php', function () {
	if ( isset( $_REQUEST['action'] ) && 'delete' === $_REQUEST['action'] && empty( $_REQUEST['dw_confirm'] ) ) {
		wp_die(
			'Das Menü wurde <strong>nicht</strong> gelöscht. Bitte die Löschbestätigung im Popup verwenden.',
			'Löschen abgebrochen',
			array( 'back_link' => true )
		);
	}
} );

/**
 * Modal + JS auf der Menü-Seite.
 */
add_action( 'admin_footer-nav-menus.php', function () {
	?>
	<style>
		#dw-menu-del-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:100000;display:none;align-items:center;justify-content:center}
		#dw-menu-del-overlay.is-open{display:flex}
		#dw-menu-del-box{background:#fff;max-width:460px;width:92%;padding:24px 26px;border-radius:6px;border-top:6px solid #d63638;box-shadow:0 10px 40px rgba(0,0,0,.3)}
		#dw-menu-del-box h2{margin:0 0 12px;color:#d63638;font-size:20px}
		#dw-menu-del-box p{font-size:14px;line-height:1.5;margin:0 0 12px}
		#dw-menu-del-box input{width:100%;margin:4px 0 18px;padding:6px 8px;font-size:15px}
		#dw-menu-del-box .dw-actions{display:flex;gap:10px;justify-content:flex-end}
		#dw-menu-del-confirm{background:#d63638;border-color:#d63638;color:#fff}
		#dw-menu-del-confirm:disabled{opacity:.4;cursor:not-allowed}
	</style>

	<div id="dw-menu-del-overlay" role="dialog" aria-modal="true" aria-labelledby="dw-menu-del-title">
		<div id="dw-menu-del-box">
			<h2 id="dw-menu-del-title">⚠️ Achtung: Ganzes Menü löschen!</h2>
			<p>Du bist dabei, das <strong>komplette Menü „<span id="dw-menu-del-name"></span>“</strong> mit allen Einträgen zu löschen.</p>
			<p>Das kann <strong>nicht rückgängig</strong> gemacht werden. Wenn du nur einen einzelnen Menüpunkt entfernen willst, klappe diesen auf und klicke dort auf „Entfernen“.</p>
			<p>Zum Bestätigen bitte <strong>LÖSCHEN</strong> eintippen:</p>
			<input type="text" id="dw-menu-del-input" autocomplete="off">
			<div class="dw-actions">
				<button type="button" class="button button-primary" id="dw-menu-del-cancel">Abbrechen</button>
				<button type="button" class="button" id="dw-menu-del-confirm" disabled>Menü endgültig löschen</button>
			</div>
		</div>
	</div>

	<script>
	(function () {
		var overlay = document.getElementById('dw-menu-del-overlay');
		var input   = document.getElementById('dw-menu-del-input');
		var btnOk   = document.getElementById('dw-menu-del-confirm');
		var btnNo   = document.getElementById('dw-menu-del-cancel');
		var nameEl  = document.getElementById('dw-menu-del-name');
		var targetHref = null;

		function openModal(href) {
			targetHref = href;
			var menuName = document.getElementById('menu-name');
			nameEl.textContent = menuName ? menuName.value : '';
			input.value = '';
			btnOk.disabled = true;
			overlay.classList.add('is-open');
			btnNo.focus();
		}

		function closeModal() {
			overlay.classList.remove('is-open');
			targetHref = null;
		}

		// Capture-Phase: fängt den Klick ab, bevor WordPress' eigener Dialog kommt
		document.addEventListener('click', function (e) {
			var link = e.target.closest('a.menu-delete');
			if (!link) return;
			e.preventDefault();
			e.stopImmediatePropagation();
			openModal(link.href);
		}, true);

		input.addEventListener('input', function () {
			btnOk.disabled = input.value.trim().toUpperCase() !== 'LÖSCHEN';
		});

		btnOk.addEventListener('click', function () {
			if (btnOk.disabled || !targetHref) return;
			window.onbeforeunload = null;
			window.location.href = targetHref + (targetHref.indexOf('?') > -1 ? '&' : '?') + 'dw_confirm=1';
		});

		btnNo.addEventListener('click', closeModal);
		overlay.addEventListener('click', function (e) { if (e.target === overlay) closeModal(); });
		document.addEventListener('keydown', function (e) {
			if (e.key === 'Escape' && overlay.classList.contains('is-open')) closeModal();
		});
	})();
	</script>
	<?php
} );

Hinterlasse den ersten Kommentar