Skip to content
🔒 4 Wege, einen Beitrag in WordPress programmgesteuert zu deaktivieren

🔒 4 Wege, einen Beitrag in WordPress programmgesteuert zu deaktivieren

Die Website war nach einem Plugin-Update ausgefallen, Sie müssen den problematischen Beitrag dringend verstecken, bevor es zu spät ist. Und eine Woche später, wenn der Fehler behoben ist, holen Sie ihn zurück. Oder ein Kunde bittet Sie, einen veralteten Artikel aus den Suchergebnissen zu entfernen, aber nicht endgültig zu löschen.

Den Status manuell über das Admin-Panel zu ändern, funktioniert für ein oder zwei Beiträge. Wenn es aber Dutzende sind oder die Logik automatisch greifen soll, brauchen Sie einen programmatischen Ansatz. WordPress bietet Ihnen vier Wege, einen Beitrag per PHP zu deaktivieren: vom sicheren Entwurf bis zur vollständigen Löschung.

Nachfolgend jede Methode mit einsatzbereitem Code, einer Erläuterung und einem Hinweis, wann Sie welche verwenden.

💡 Kurzüberblick:

  • Beitrag über wp_update_post mit dem Status draft in einen Entwurf umgewandelt, der sicherste und am einfachsten rückgängig zu machende Weg
  • Beitrag auf privat gesetzt (private), nur für Administratoren und Redakteure sichtbar
  • Beitrag über post_date in die Zukunft geschickt, der Beitrag verschwindet aus den Suchergebnissen, bis das angegebene Datum erreicht ist
  • Beitrag über wp_delete_post endgültig gelöscht, das letzte Mittel mit Warnhinweisen und einem Backup

Schritt 1. Entwurf: einen Beitrag deaktivieren, ohne Daten zu verlieren

Das häufigste Szenario: Sie müssen einen Beitrag vorübergehend ausblenden, aber alle Inhalte, die URL und die Möglichkeit, ihn mit einem Klick zurückzuholen, behalten. Das Umschalten auf Entwurf ist die ideale Option.

Es ändert sich nur das Feld post_status in der Tabelle wp_posts. Der Beitrag selbst, seine Metafelder, Anhänge und die URL bleiben unberührt. Wenn Sie ihn zurückholen möchten, ändern Sie den Status wieder auf publish.

Code, um den Status auf draft zu ändern. Fügen Sie ihn in die functions.php Ihres Child-Themes oder über das Plugin Code Snippets ein:

1/**
2 * Converts a post to draft by ID.
3 *
4 * @param int $post_id ID of the post to unpublish.
5 */
6function sd_unpublish_to_draft( $post_id ) {
7 wp_update_post( array(
8 'ID' => $post_id,
9 'post_status' => 'draft',
10 ) );
11}
12
13// Example call: unpublish post with ID = 42
14sd_unpublish_to_draft( 42 );

wp_update_post() aktualisiert einen Datensatz in der Datenbank. Wir übergeben nur die ID und den neuen Wert für post_status, WordPress erledigt alles Weitere selbst. Keine anderen Felder werden geändert.

Wann zu verwenden: vorübergehendes Ausblenden eines Beitrags zur Überarbeitung, automatisches Deaktivieren von Beiträgen mit abgelaufener Relevanz (z. B. Werbeaktionen), programmatische Moderation von nutzergenerierten Inhalten.

Schritt 2. Privater Beitrag: vor Besuchern verbergen, für Redakteure behalten

Der private Status ist ein Mittelweg zwischen öffentlich und versteckt. Der Beitrag ist für normale Besucher nicht sichtbar, aber für Administratoren und Redakteure im Admin-Panel zugänglich. Praktisch für interne Materialien: Team-Anleitungen, Kundeninhaltsentwürfe, private Seiten.

Unterschied zum Entwurf: Ein privater Beitrag ist technisch „veröffentlicht" und kann eine eigene URL haben, aber WordPress prüft die Benutzerberechtigungen, bevor es ihn anzeigt. Ein Besucher ohne die Berechtigung read_private_posts sieht einen 404-Fehler.

Der Code ähnelt dem vorherigen, nur der Status ändert sich:

1/**
2 * Makes a post private — visible only to admins and editors.
3 *
4 * @param int $post_id Post ID.
5 */
6function sd_unpublish_to_private( $post_id ) {
7 wp_update_post( array(
8 'ID' => $post_id,
9 'post_status' => 'private',
10 ) );
11}
12
13// Example call
14sd_unpublish_to_private( 42 );

Hinweis: Wenn die Website benutzerdefinierte Benutzerrollen mit eigenen Berechtigungen hat, prüfen Sie diese vor dem Masseneinsatz. Standardmäßig sind private Beiträge für die Rollen editor und administrator sichtbar.

Wann zu verwenden: Premium-Abonnementinhalte (in Verbindung mit Mitgliedschafts-Plugins), interne Teamdokumentation, Ausblenden von Beiträgen zur erneuten Freigabe mit einem Kunden vor der Wiederveröffentlichung.

Schritt 3. Zukünftiges Datum: verzögertes Deaktivieren

Ein interessanter Trick: Anstatt den Status zu ändern, können Sie einen Beitrag „in die Zukunft schicken", das Veröffentlichungsdatum auf das Jahr 2050 setzen. Der Beitrag verschwindet sofort aus den Suchergebnissen, weil WordPress nur Beiträge mit einem Datum ≤ dem aktuellen Zeitpunkt anzeigt.

Diese Methode ändert post_status nicht: Der Beitrag bleibt publish. Er ist aus Sicht von WordPress einfach „noch nicht passiert". Ein Plus: Bei Bedarf können Sie das echte Datum wiederherstellen und der Beitrag erscheint erneut.

Der Code verwendet die Felder post_date und post_date_gmt:

1/**
2 * Hides a post by setting its publication date far into the future.
3 *
4 * @param int $post_id Post ID.
5 */
6function sd_unpublish_to_future( $post_id ) {
7 $future_date = '2050-12-31 23:59:59';
8
9 wp_update_post( array(
10 'ID' => $post_id,
11 'post_date' => $future_date,
12 'post_date_gmt' => get_gmt_from_date( $future_date ),
13 ) );
14}
15
16// Example call
17sd_unpublish_to_future( 42 );

get_gmt_from_date() konvertiert die lokale Zeit in GMT, WordPress speichert beide Versionen des Datums. Vernachlässigen Sie das GMT-Feld nicht: Ohne es wird das Verhalten bei einer Änderung der Zeitzone der Website unvorhersehbar.

Wann zu verwenden: „geplante" Veröffentlichung von Inhalten, vorübergehendes Ausblenden von Nachrichten ohne Statusänderung, Szenarien, in denen post_status aus Gründen der Abwärtskompatibilität mit anderen Plugins publish bleiben muss.

Schritt 4. Löschung: wenn der Beitrag gar nicht mehr benötigt wird

wp_delete_post() ist ein irreversibler Vorgang. Der Beitrag wird aus der Datenbank gelöscht, zusammen mit all seinen Metafeldern, Taxonomie-Beziehungen und (optional) Anhängen.

Dies ist keine „Deaktivierung" im engeren Sinne. Aber im Kontext der programmatischen Inhaltsverwaltung ist die Löschung das vierte, drastischste Werkzeug. Und sie erfordert Sicherheitsvorkehrungen.

Erstellen Sie vor der Ausführung ein vollständiges Datenbank-Backup. Das folgende Skript gibt zunächst eine Liste dessen aus, was gelöscht wird, und erst dann die Produktionsversion.

1/**
2 * Deletes a post. First — dry-run with info output, then — actual deletion.
3 *
4 * WARNING: irreversible operation. Backup before running.
5 *
6 * @param int $post_id Post ID.
7 * @param bool $force_delete true — delete permanently (skip trash), false — move to trash.
8 */
9function sd_delete_post_safe( $post_id, $force_delete = false ) {
10 $post = get_post( $post_id );
11
12 if ( ! $post ) {
13 error_log( "Post with ID {$post_id} not found." );
14 return;
15 }
16
17 // Dry-run: output info without deleting
18 error_log( sprintf(
19 'READY TO DELETE: ID=%d, title="%s", status=%s, attachments=%d',
20 $post->ID,
21 $post->post_title,
22 $post->post_status,
23 count( get_attached_media( '', $post_id ) )
24 ) );
25
26 // Uncomment the following line for actual deletion:
27 // wp_delete_post( $post_id, $force_delete );
28}
29
30// Dry-run: only outputs info
31sd_delete_post_safe( 12341, false );

Das Flag $force_delete:

  • false, der Beitrag geht in den Papierkorb, er kann innerhalb von 30 Tagen wiederhergestellt werden.
  • true, endgültige Löschung, kann auch über die Datenbank nicht wiederhergestellt werden (ohne Backup).

Die Funktion protokolliert über error_log(), Meldungen erscheinen in wp-content/debug.log, wenn WP_DEBUG aktiviert ist. Ersetzen Sie dies in der Produktion durch Ihren eigenen Benachrichtigungsmechanismus.

Wann zu verwenden: automatische Bereinigung von Spam-Beiträgen, Löschen abgelaufener Inhalte (Stellenanzeigen, Veranstaltungen), programmatische Inhaltsrotation mit vollständiger Entfernung alter Einträge.

Vergleich der vier Methoden

Methode

Beitragsstatus

Umkehrbarkeit

Sichtbarkeit für Leser

Sichtbarkeit im Admin

Wann zu verwenden

Entwurf

draft

Vollständig

Versteckt

Alle Rollen mit Beitragszugriff

Vorübergehendes Ausblenden, Überarbeitung

Privat

private

Vollständig

Versteckt

Admins und Redakteure

Interne Inhalte, Premium

Zukünftiges Datum

publish

Vollständig

Versteckt bis zum Datum

Alle

Geplante Veröffentlichung, Zeitplan

Löschung

-

Nur aus dem Papierkorb (30 Tage)

-

Nur Admins

Vollständige Löschung, Bereinigung

⁉️🤔 Häufige Fragen

Was ist der Unterschied zwischen Deaktivieren und Löschen?

Deaktivieren (Entwurf/privat/zukünftig) behält den Beitrag in der Datenbank: Inhalt, URL, Anhänge und SEO-Historie bleiben erhalten. Löschung (wp_delete_post) entfernt den Datensatz vollständig. Verwenden Sie zum vorübergehenden Ausblenden immer einen Entwurf, das ist sicher und in einer Sekunde rückgängig gemacht.

Welche Methode erfordert keine Änderung von post_status?

Das Senden in die Zukunft über post_date. Der Beitrag bleibt publish, aber WordPress betrachtet ihn als „noch nicht geschehen" und zeigt ihn Besuchern nicht an. Das kann wichtig sein, wenn andere Plugins oder Snippets vom Status publish abhängen.

Kann ich mehrere Beiträge auf einmal deaktivieren?

Ja, packen Sie den Funktionsaufruf in eine Schleife über ein Array von IDs. Fügen Sie wp_die() oder eine Begrenzung der Anzahl von Beiträgen pro Durchlauf hinzu, um einen Absturz der Website bei einer Massenoperation zu vermeiden: array_slice($post_ids, 0, 50) für einen Stapel von 50.

Muss ich den Cache nach einer programmatischen Statusänderung leeren?

Unbedingt. WordPress leert den internen Beitrags-Cache, wenn wp_update_post() aufgerufen wird, aber externe Caches (Plugins wie WP Rocket, Server-Cache, CDN) müssen separat geleert werden. Fügen Sie einen Aufruf von wp_cache_flush() oder den Hook clean_post_cache nach der Statusänderung hinzu.

Ist es sicher, wp_delete_post in der Produktion auszuführen?

Nur mit Sicherheitsvorkehrungen. Prüfen Sie vor dem Aufruf: (1) current_user_can('delete_posts'), (2) fordern Sie eine Bestätigung über ein separates Nonce-Token an, (3) protokollieren Sie die ID und den Titel des zu löschenden Beitrags. Und am wichtigsten: ein Backup. Selbst im Papierkorb lebt ein Beitrag 30 Tage, danach löscht WordPress ihn automatisch.

Was Sie in Ihrem Fall verwenden: das Fazit

Die vier Methoden decken nahezu jedes Szenario der programmatischen Publikationsverwaltung ab. Die Wahl läuft auf eine Frage hinaus: Müssen Sie den Beitrag behalten?

  • Wenn Sie einen Beitrag vorübergehend zur Überarbeitung ausblenden müssen, nehmen Sie einen Entwurf (draft). Ein paar Zeilen, null Risiko.
  • Wenn der Inhalt für einen begrenzten Personenkreis bestimmt ist, privater Status (private). Redakteure sehen ihn, Besucher nicht.
  • Wenn Sie einen Beitrag ausblenden müssen, ohne seinen Status zu ändern, ein zukünftiges Datum (post_date auf 2050 gesetzt). Ein cleverer, aber funktionierender Trick.
  • Wenn der Beitrag definitiv nicht mehr benötigt wird, Löschung (wp_delete_post). Aber zuerst ein Probelauf und ein vollständiges Backup.

Beginnen Sie mit einem Wrapper in der functions.php für eine Methode, zum Beispiel einen Entwurf. Wenn Sie die Logik von wp_update_post() verstanden haben, sind die anderen drei Methoden in fünf Minuten umgesetzt.

Und welche Methode verwenden Sie für die programmatische Beitragsverwaltung? Schreiben Sie es in die Kommentare, es ist interessant, Ansätze zu vergleichen.