Skip to content
🔒 4 Sätt att programmatiskt avpublicera ett inlägg i WordPress

🔒 4 Sätt att programmatiskt avpublicera ett inlägg i WordPress

Sajten gick ner efter en plugin-uppdatering, du måste snabbt dölja det problematiska inlägget innan det är för sent. Och en vecka senare ta tillbaka det när buggen är fixad. Eller så ber en kund dig att ta bort en föråldrad artikel från sökresultaten, men inte radera den permanent.

Att manuellt växla status via adminpanelen fungerar för ett eller två inlägg. Men när det är dussintals av dem eller logiken måste köras automatiskt, behöver du ett programmatiskt tillvägagångssätt. WordPress ger dig fyra sätt att avpublicera ett inlägg via PHP: från ett säkert utkast till fullständig radering.

Nedan finns varje metod med färdig kod, en förklaring och en ledtråd om när du ska använda vilken.

💡 Snabb översikt:

  • Gjorde ett inlägg till ett utkast via wp_update_post med statusen draft, det säkraste och mest reversibla sättet
  • Gjorde ett inlägg privat (private), synligt endast för administratörer och redaktörer
  • Skickade ett inlägg till framtiden via post_date, inlägget försvinner från sökresultaten tills det angivna datumet inträffar
  • Raderade ett inlägg permanent via wp_delete_post, en sista utväg med varningar och en backup

Steg 1. Utkast: avpublicera ett inlägg utan att förlora data

Det vanligaste scenariot: du behöver tillfälligt dölja ett inlägg men behålla allt innehåll, URL och möjligheten att ta tillbaka det med ett klick. Att växla till utkast är det ideala alternativet.

Endast fältet post_status i tabellen wp_posts ändras. Själva inlägget, dess metafält, bilagor och URL förblir orörda. När du bestämmer dig för att ta tillbaka det ändrar du statusen tillbaka till publish.

Kod för att ändra statusen till draft. Lägg till den i ditt barntemas functions.php eller via tillägget Code Snippets:

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() uppdaterar en post i databasen. Vi skickar bara med ID och det nya värdet för post_status, WordPress hanterar allt annat själv. Inga andra fält ändras.

När du ska använda: tillfälligt dölja ett inlägg för revidering, automatiskt avaktivera inlägg med utgången relevans (t.ex. kampanjer), programmatisk moderering av användargenererat innehåll.

Steg 2. Privat inlägg: dölj för besökare, behåll för redaktörer

Den privata statusen är en medelväg mellan offentlig och dold. Inlägget är inte synligt för vanliga besökare men är tillgängligt för administratörer och redaktörer i adminpanelen. Praktiskt för internt material: teaminstruktioner, klientinnehållsutkast, privata sidor.

Skillnad mot ett utkast: ett privat inlägg är tekniskt sett "publicerat" och kan ha en egen URL, men WordPress kontrollerar användarbehörigheter innan det visas. En besökare utan behörigheten read_private_posts kommer att se en 404.

Koden liknar den föregående, bara statusen ändras:

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 );

Obs: om webbplatsen har anpassade användarroller med anpassade behörigheter, kontrollera dem före massanvändning. Som standard är privata inlägg synliga för rollerna editor och administrator.

När du ska använda: premiuminnehåll för prenumeration (parat med medlemskapsplugins), intern teamdokumentation, dölja inlägg för nytt godkännande med en kund före återpublicering.

Steg 3. Framtida datum: fördröjd avpublicering

Ett intressant trick: istället för att ändra statusen kan du "skicka ett inlägg till framtiden", sätta publiceringsdatumet till år 2050. Inlägget försvinner omedelbart från sökresultaten eftersom WordPress bara visar inlägg med ett datum ≤ det aktuella ögonblicket.

Denna metod ändrar inte post_status: inlägget förblir publish. Det har helt enkelt "inte hänt än" ur WordPress perspektiv. Ett plus: om det behövs kan du återställa det riktiga datumet så kommer inlägget att dyka upp igen.

Koden använder fälten post_date och 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() konverterar lokal tid till GMT, WordPress lagrar båda versionerna av datumet. Försumma inte GMT-fältet: utan det blir beteendet oförutsägbart när webbplatsens tidszon ändras.

När du ska använda: "schemalagd" innehållspublicering, tillfälligt dölja nyheter utan att ändra statusen, scenarier där post_status måste förbli publish för bakåtkompatibilitet med andra plugins.

Steg 4. Radering: när inlägget inte behövs alls

wp_delete_post() är en oåterkallelig operation. Inlägget raderas från databasen, tillsammans med alla dess metafält, taxonomirelationer och (valfritt) bilagor.

Detta är inte "avpublicering" i strikt mening. Men i kontexten av programmatisk innehållshantering är radering det fjärde, mest drastiska verktyget. Och det kräver skyddsåtgärder.

Innan du kör, gör en fullständig databasbackup. Skriptet nedan matar först ut en lista över vad som kommer att raderas, och först därefter, produktionsversionen.

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 );

Flaggan $force_delete:

  • false, inlägget hamnar i Papperskorgen, det kan återställas inom 30 dagar.
  • true, permanent radering, kan inte återställas ens via databasen (utan en backup).

Funktionen loggar via error_log(), meddelanden kommer att visas i wp-content/debug.log när WP_DEBUG är aktiverat. I produktion, ersätt det med din egen notifieringsmekanism.

När du ska använda: automatisk rensning av skräppostinlägg, radering av utgånget innehåll (jobbannonser, evenemang), programmatisk innehållsrotation med fullständig borttagning av gamla poster.

Jämförelse av de fyra metoderna

Metod

Inläggsstatus

Reversibilitet

Synlighet för läsare

Synlighet i admin

När du ska använda

Utkast

draft

Full

Dold

Alla roller med inläggsåtkomst

Tillfälligt döljande, revidering

Privat

private

Full

Dold

Administratörer och redaktörer

Internt innehåll, premium

Framtida datum

publish

Full

Dold tills datumet

Alla

Schemalagd publicering, tidtabell

Radering

-

Endast från Papperskorgen (30 dagar)

-

Endast administratörer

Fullständig radering, rensning

⁉️🤔 Vanliga frågor

Vad är skillnaden mellan avpublicering och radering?

Avpublicering (utkast/privat/framtida) behåller inlägget i databasen: innehåll, URL, bilagor och SEO-historik finns kvar. Radering (wp_delete_post) raderar posten helt. För tillfälligt döljande, använd alltid ett utkast, det är säkert och reversibelt på en sekund.

Vilken metod kräver inte att post_status ändras?

Att skicka till framtiden via post_date. Inlägget förblir publish, men WordPress anser att det "inte har hänt än" och visar det inte för besökare. Detta kan vara viktigt om andra plugins eller snippets är beroende av statusen publish.

Kan jag avpublicera flera inlägg samtidigt?

Ja, slå in funktionsanropet i en loop över en array av ID:n. Lägg till wp_die() eller en gräns för antalet inlägg per körning för att undvika att krascha webbplatsen under en massoperation: array_slice($post_ids, 0, 50) för en batch om 50.

Behöver jag rensa cachen efter en programmatisk statusändring?

Absolut. WordPress tömmer den interna inläggscachen när wp_update_post() anropas, men extern cache (plugins som WP Rocket, servercache, CDN) måste rensas separat. Lägg till ett wp_cache_flush()-anrop eller hooken clean_post_cache efter statusändringen.

Är det säkert att köra wp_delete_post i produktion?

Endast med skyddsåtgärder. Innan anrop: (1) kontrollera current_user_can('delete_posts'), (2) begär bekräftelse via en separat nonce-token, (3) logga ID och titel på inlägget som raderas. Och viktigast av allt, en backup. Även i Papperskorgen lever ett inlägg i 30 dagar, varefter WordPress raderar det automatiskt.

Vad du ska använda i ditt fall: summan av kardemumman

De fyra metoderna täcker nästan alla scenarier för programmatisk publiceringshantering. Valet kokar ner till en fråga: behöver du behålla inlägget?

  • Om du behöver tillfälligt dölja ett inlägg för revidering, välj ett utkast (draft). Ett par rader, noll risk.
  • Om innehållet är för en begränsad krets av människor, privat status (private). Redaktörer ser det, besökare gör det inte.
  • Om du behöver dölja ett inlägg utan att ändra dess status, ett framtida datum (post_date satt till 2050). Ett smart men fungerande trick.
  • Om inlägget definitivt inte behövs, radering (wp_delete_post). Men först, en torrkörning och en fullständig backup.

Börja med en wrapper i functions.php för en metod, till exempel ett utkast. När du förstår logiken i wp_update_post() kommer de andra tre metoderna att falla på plats på fem minuter.

Och vilken metod använder du för programmatisk inläggshantering? Skriv i kommentarerna, det är intressant att jämföra tillvägagångssätt.