
🔒 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_postmit dem Statusdraftin 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_datein die Zukunft geschickt, der Beitrag verschwindet aus den Suchergebnissen, bis das angegebene Datum erreicht ist - Beitrag über
wp_delete_postendgü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 */ 6 function 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 14 sd_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 */ 6 function 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 14 sd_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 */ 6 function 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 17 sd_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 */ 9 function 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 31 sd_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 |
| Vollständig | Versteckt | Alle Rollen mit Beitragszugriff | Vorübergehendes Ausblenden, Überarbeitung |
Privat |
| Vollständig | Versteckt | Admins und Redakteure | Interne Inhalte, Premium |
Zukünftiges Datum |
| 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 bleibtpublish, aber WordPress betrachtet ihn als „noch nicht geschehen" und zeigt ihn Besuchern nicht an. Das kann wichtig sein, wenn andere Plugins oder Snippets vom Statuspublishabhä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 vonwp_cache_flush()oder den Hookclean_post_cachenach 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_dateauf 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.



