
🔒 4 Tapaa poistaa WordPress-julkaisu ohjelmallisesti
Sivusto kaatui lisäosapäivityksen jälkeen, ja sinun on kiireesti piilotettava ongelmallinen artikkeli ennen kuin on liian myöhäistä. Ja viikkoa myöhemmin tuotava se takaisin, kun bugi on korjattu. Tai asiakas pyytää sinua poistamaan vanhentuneen artikkelin hakutuloksista, mutta ei poistamaan sitä pysyvästi.
Tilan vaihtaminen manuaalisesti hallintapaneelin kautta toimii yhdelle tai kahdelle artikkelille. Mutta kun niitä on kymmeniä tai logiikan on käynnistyttävä automaattisesti, tarvitset ohjelmallisen lähestymistavan. WordPress antaa sinulle neljä tapaa poistaa artikkeli julkaisusta PHP:n avulla: turvallisesta luonnoksesta täydelliseen poistoon.
Alla jokainen menetelmä valmiilla koodilla, selityksellä ja vinkillä siitä, milloin mitäkin kannattaa käyttää.
💡 Pikavertailu:
- Muutit artikkelin luonnokseksi
wp_update_post-funktiolladraft-tilaan, turvallisin ja palautettavin tapa - Teit artikkelista yksityisen (
private), näkyvissä vain ylläpitäjille ja päätoimittajille - Lähetit artikkelin tulevaisuuteen
post_date-kentän avulla, artikkeli katoaa hakutuloksista, kunnes määritetty päivämäärä koittaa - Poistit artikkelin pysyvästi
wp_delete_post-funktiolla, viimeinen keino varoitusten ja varmuuskopion kera
Vaihe 1. Luonnos: poista artikkeli julkaisusta menettämättä tietoja
Yleisin skenaario: sinun on tilapäisesti piilotettava artikkeli, mutta säilytettävä kaikki sisältö, URL-osoite ja mahdollisuus palauttaa se yhdellä napsautuksella. Luonnokseksi vaihtaminen on ihanteellinen vaihtoehto.
Vain post_status-kenttä wp_posts-taulussa muuttuu. Itse artikkeli, sen metakentät, liitetiedostot ja URL-osoite säilyvät koskemattomina. Kun päätät tuoda sen takaisin, vaihdat tilan takaisin publish-tilaan.
Koodi tilan vaihtamiseksi draft-tilaan. Lisää se lapsiteemasi functions.php-tiedostoon tai Code Snippets -lisäosan kautta:
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() päivittää tietueen tietokannassa. Välitämme vain ID:n ja uuden post_status-arvon, WordPress hoitaa kaiken muun itse. Muita kenttiä ei muuteta.
Milloin käyttää: artikkelin tilapäinen piilottaminen tarkistusta varten, vanhentuneen merkityksen omaavien artikkeleiden (esim. kampanjat) automaattinen deaktivointi, käyttäjien luoman sisällön ohjelmallinen moderointi.
Vaihe 2. Yksityinen artikkeli: piilota vierailijoilta, säilytä toimittajille
Yksityinen tila on välimuoto julkisen ja piilotetun välillä. Artikkeli ei näy tavallisille vierailijoille, mutta on ylläpitäjien ja päätoimittajien käytettävissä hallintapaneelissa. Kätevä sisäisiin materiaaleihin: tiimin ohjeet, asiakkaan sisältöluonnokset, yksityiset sivut.
Ero luonnokseen: yksityinen artikkeli on teknisesti "julkaistu" ja sillä voi olla oma URL-osoite, mutta WordPress tarkistaa käyttöoikeudet ennen sen näyttämistä. Vierailija, jolla ei ole read_private_posts-oikeutta, näkee 404-sivun.
Koodi on samanlainen kuin edellinen, vain tila muuttuu:
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 );
Huomio: jos sivustolla on mukautettuja käyttäjärooleja ja -oikeuksia, tarkista ne ennen massakäyttöä. Oletuksena yksityiset artikkelit näkyvät editor- ja administrator-rooleille.
Milloin käyttää: premium-tilaussisältö (yhdessä jäsenyyslisäosien kanssa), sisäinen tiimidokumentaatio, artikkeleiden piilottaminen asiakkaan uudelleenhyväksyntää varten ennen uudelleenjulkaisua.
Vaihe 3. Tuleva päivämäärä: viivästetty julkaisun poisto
Mielenkiintoinen temppu: tilan vaihtamisen sijaan voit "lähettää artikkelin tulevaisuuteen", asettaa julkaisupäivämäärän vuoteen 2050. Artikkeli katoaa välittömästi hakutuloksista, koska WordPress näyttää vain artikkelit, joiden päivämäärä on ≤ nykyhetki.
Tämä menetelmä ei muuta post_status-kenttää: artikkeli pysyy publish-tilassa. Se ei yksinkertaisesti "ole vielä tapahtunut" WordPressin näkökulmasta. Plussaa: tarvittaessa voit palauttaa oikean päivämäärän, ja artikkeli ilmestyy uudelleen.
Koodi käyttää post_date- ja post_date_gmt-kenttiä:
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() muuntaa paikallisen ajan GMT:ksi, WordPress tallentaa päivämäärästä molemmat versiot. Älä laiminlyö GMT-kenttää: ilman sitä toiminta muuttuu arvaamattomaksi, kun sivuston aikavyöhyke vaihtuu.
Milloin käyttää: "ajastettu" sisällön julkaisu, uutisten tilapäinen piilottaminen tilaa muuttamatta, skenaariot, joissa post_status-kentän on pysyttävä publish-tilassa taaksepäin yhteensopivuuden vuoksi muiden lisäosien kanssa.
Vaihe 4. Poisto: kun artikkelia ei tarvita lainkaan
wp_delete_post() on peruuttamaton toimenpide. Artikkeli poistetaan tietokannasta kaikkine metakenttineen, taksonomiasuhteineen ja (valinnaisesti) liitetiedostoineen.
Tämä ei ole "julkaisun poistoa" varsinaisessa merkityksessä. Mutta ohjelmallisen sisällönhallinnan kontekstissa poisto on neljäs, järein työkalu. Ja se vaatii suojatoimia.
Ennen suorittamista, tee täydellinen tietokantavarmuuskopio. Alla oleva skripti tulostaa ensin luettelon siitä, mitä poistetaan, ja vasta sitten tuotantoversion.
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 );
$force_delete-lippu:
false, artikkeli siirtyy roskakoriin, se voidaan palauttaa 30 päivän kuluessa.true, pysyvä poisto, ei voida palauttaa edes tietokannasta (ilman varmuuskopiota).
Funktio kirjaa lokia error_log()-funktion kautta, viestit näkyvät tiedostossa wp-content/debug.log, kun WP_DEBUG on käytössä. Tuotannossa korvaa se omalla ilmoitusmekanismillasi.
Milloin käyttää: roskapostiartikkeleiden automaattinen siivous, vanhentuneen sisällön poistaminen (työpaikkailmoitukset, tapahtumat), ohjelmallinen sisällön kierrätys vanhojen merkintöjen täydellisellä poistolla.
Neljän menetelmän vertailu
Menetelmä | Artikkelin tila | Palautettavuus | Näkyvyys lukijoille | Näkyvyys hallinnassa | Milloin käyttää |
|---|---|---|---|---|---|
Luonnos |
| Täysi | Piilotettu | Kaikki roolit, joilla on artikkelin käyttöoikeus | Tilapäinen piilotus, tarkistus |
Yksityinen |
| Täysi | Piilotettu | Ylläpitäjät ja päätoimittajat | Sisäinen sisältö, premium |
Tuleva päivämäärä |
| Täysi | Piilotettu päivämäärään asti | Kaikki | Ajastettu julkaisu, aikataulu |
Poisto | - | Vain roskakorista (30 pv) | - | Vain ylläpitäjät | Täydellinen poisto, siivous |
⁉️🤔 Usein kysytyt kysymykset
Mitä eroa on julkaisun poistamisella ja tuhoamisella?
Julkaisun poistaminen (luonnos/yksityinen/tuleva) säilyttää artikkelin tietokannassa: sisältö, URL-osoite, liitetiedostot ja SEO-historia säilyvät. Tuhoaminen (
wp_delete_post) pyyhkii tietueen kokonaan. Tilapäiseen piilottamiseen käytä aina luonnosta, se on turvallista ja palautettavissa sekunnissa.
Mikä menetelmä ei vaadi post_status-kentän muuttamista?
Tulevaisuuteen lähettäminen
post_date-kentän avulla. Artikkeli pysyypublish-tilassa, mutta WordPress pitää sitä "ei vielä tapahtuneena" eikä näytä sitä vierailijoille. Tämä voi olla tärkeää, jos muut lisäosat tai koodinpätkät riippuvatpublish-tilasta.
Voinko poistaa useita artikkeleita julkaisusta kerralla?
Kyllä, kääri funktiokutsu silmukkaan, joka käy läpi ID-taulukon. Lisää
wp_die()tai rajoitus artikkeleiden määrälle yhtä ajoa kohden, jotta sivusto ei kaadu massaoperaation aikana:array_slice($post_ids, 0, 50)50 kappaleen erälle.
Täytyykö välimuisti tyhjentää ohjelmallisen tilanvaihdon jälkeen?
Ehdottomasti. WordPress tyhjentää sisäisen artikkelivälimuistin, kun
wp_update_post()kutsutaan, mutta ulkoinen välimuisti (lisäosat kuten WP Rocket, palvelinvälimuisti, CDN) on tyhjennettävä erikseen. Lisääwp_cache_flush()-kutsu taiclean_post_cache-koukku tilanvaihdon jälkeen.
Onko turvallista ajaa wp_delete_post tuotannossa?
Vain suojatoimien kera. Ennen kutsumista: (1) tarkista
current_user_can('delete_posts'), (2) pyydä vahvistus erillisellä nonce-tunnisteella, (3) kirjaa poistettavan artikkelin ID ja otsikko lokiin. Ja mikä tärkeintä, varmuuskopio. Jopa roskakorissa artikkeli säilyy 30 päivää, jonka jälkeen WordPress poistaa sen automaattisesti.
Mitä käyttää omassa tapauksessasi: yhteenveto
Nämä neljä menetelmää kattavat lähes minkä tahansa ohjelmallisen julkaisunhallinnan skenaarion. Valinta kiteytyy yhteen kysymykseen: tarvitseeko sinun säilyttää artikkeli?
- Jos sinun on tilapäisesti piilotettava artikkeli tarkistusta varten, valitse luonnos (
draft). Pari riviä, nolla riskiä. - Jos sisältö on rajoitetulle ihmisjoukolle, yksityinen tila (
private). Toimittajat näkevät sen, vierailijat eivät. - Jos sinun on piilotettava artikkeli muuttamatta sen tilaa, tuleva päivämäärä (
post_dateasetettuna vuoteen 2050). Näppärä mutta toimiva temppu. - Jos artikkelia ei varmasti tarvita, poisto (
wp_delete_post). Mutta ensin kuivaharjoittelu ja täydellinen varmuuskopio.
Aloita kääreellä functions.php-tiedostossa yhdelle menetelmälle, esimerkiksi luonnokselle. Kun ymmärrät wp_update_post()-funktion logiikan, muut kolme menetelmää loksahtavat kohdalleen viidessä minuutissa.
Ja mitä menetelmää sinä käytät ohjelmalliseen artikkelien hallintaan? Kirjoita kommentteihin, on mielenkiintoista vertailla lähestymistapoja.



