Prečo WordPress nezverejnil naplánovaný článok a ako tomu zabrániť

Obrázok tohto článku

Naplánovaný článok mal vyjsť o 9:00, ale na webe nie je. V zozname článkov má v stĺpci Dátum hlášku "Planované publikovanie ešte neprebehlo", v anglickej verzii WordPressu "Missed schedule". WordPress nemá hodiny, ktoré by bežali nepretržite, a článok zverejní, len keď ho k tomu niečo vyzve. V článku nájdete, prečo sa to stáva, prečo sa príčina často nedá zistiť a ako zariadiť, aby články vychádzali načas aj tak.

Obsah článku

  1. Čo hláška znamená a ako článok zverejniť hneď
  2. Kto vo WordPresse zverejňuje naplánované články
  3. Prečo článok nevyšiel
  4. Ako hľadať príčinu
  5. Ako veľmi záleží na hostingu
  6. Ako zariadiť, aby články vychádzali načas

Čo hláška znamená a ako článok zverejniť hneď

Čas publikovania prešiel, ale článok ostal v stave Naplánovaný. WordPress ho mal zverejniť a neurobil to. Slovenský preklad píše hlášku s preklepom, "Planované" namiesto "Plánované".

Zoznam článkov vo WordPresse: pri naplánovanom článku po termíne hláška Planované publikovanie ešte neprebehlo

Na snímke sú dva naplánované články. Horný ešte čaká na svoj termín, dolný ho zmeškal, hoci pri názve má stále stav Naplánovaný.

Už samotné otvorenie zoznamu článkov dá WordPressu podnet skontrolovať naplánované úlohy. Ak bol problém len v tom, že na web dlho nikto neprišiel, článok o chvíľu vyjde a po obnovení stránky hláška zmizne. Ak ostáva, zverejnite článok ručne: otvorte ho v editore a kliknite na Uložiť. WordPress zistí, že čas publikovania už prešiel, a článok zverejní s pôvodným dátumom.

Kto vo WordPresse zverejňuje naplánované články

Naplánované články zverejňuje WP-Cron, plánovač úloh zabudovaný vo WordPresse. Pri naplánovaní článku si zapíše úlohu, ktorá ho má v daný čas zverejniť. Nebeží však nepretržite. Pri otvorení stránky WordPress pozrie, či niektorá úloha nie je na rade, a ak áno, pošle požiadavku sám sebe na súbor wp-cron.php, ktorý úlohy vykoná. Tejto požiadavke sa hovorí spätná požiadavka (loopback). Rovnako sa spúšťa aj kontrola aktualizácií a úlohy pluginov, napríklad zálohy alebo rozosielanie newslettrov.

Prečo článok nevyšiel

Článok vyjde, len keď zafunguje celý reťazec: niekto otvorí stránku, WordPress ju poskladá, spätná požiadavka prejde a server ju vybaví. Stačí, aby zlyhal jeden krok.

  1. Na web nikto neprišiel. Na webe s malou návštevnosťou vyjde článok až pri prvej návšteve po termíne, v noci aj o niekoľko hodín neskôr. Je to oneskorenie, nie porucha.
  2. Návštevy dostávajú stránky z cache. Cache plugin posiela návštevníkom hotové uložené stránky a WordPress sa pri nich vôbec nespustí, teda ani WP-Cron. Na webe, kde ide z cache takmer všetko, sa WP-Cron spúšťa len občas.
  3. Spätná požiadavka neprejde. Môže ju zablokovať firewall hostingu, bezpečnostný plugin alebo heslo na celý web, aké mávajú testovacie verzie. Po presune webu ju server môže posielať na starý server, kým sa zmena DNS nerozšíri.
  4. WP-Cron je vypnutý. Konštanta DISABLE_WP_CRON v súbore wp-config.php vypne jeho spúšťanie pri návštevách. Keď ho nahrádza cron úloha na hostingu, je to v poriadku. Keď úloha chýba, napríklad po presune na iný hosting, nespustí úlohy nič.
  5. Server nestíha. Preťažený server alebo hosting s prísnymi limitmi požiadavku na wp-cron.php nevybaví, alebo ju ukončí skôr, než úlohy dobehnú.

Podľa mojej skúsenosti chyba prichádza nepravidelne a kým si ju niekto všimne, všetko zase funguje. Príčinu sa tak nie vždy podarí zistiť. Oplatí sa preto nespoliehať na to, že sa nájde, a zariadiť, aby článok vyšiel aj tak.

Ako hľadať príčinu

  • Zdravie webovej stránky. V menu Nástroje > Zdravie webovej stránky WordPress hlási meškajúce úlohy ako "Plánovaná akcia je neskoro" alebo "Naplánovaná udalosť zlyhala". Hlásenie "Na vašej stránke sa nepodarilo vykonať loopback požiadavku" ukazuje na zablokovanú spätnú požiadavku.
  • Plugin WP Crontrol. WP Crontrol ukáže v menu Nástroje všetky naplánované úlohy a čas, keď sa majú spustiť, upozorní na tie, ktoré termín zmeškali, a každú sa dá spustiť ručne. Zverejnenie článku je úloha publish_future_post.
  • Záznamy servera. Podpora hostingu vie v logoch zistiť, či v čase publikovania prišli požiadavky na wp-cron.php a čo na ne server odpovedal.

Kontrola však ukáže stav vo chvíli, keď ju spustíte. Ak článok nevyšiel v noci a ráno všetko funguje, odpoveď priniesť nemusí.

Ako veľmi záleží na hostingu

Väčšina príčin vyššie je na strane servera, preto hosting rozhoduje viac, než sa zdá. Pri výbere sa oplatí sledovať tri veci:

  • či sa v administrácii dá nastaviť cron úloha, ideálne aj s WP-CLI (nástrojom na správu WordPressu z príkazového riadka),
  • či firewall neblokuje požiadavky webu na seba samého,
  • či má server dosť výkonu aj vtedy, keď je na webe najviac ľudí.

Pri probléme rozhoduje podpora. Dobrá pozrie do logov a povie, čo sa na serveri dialo. Ani tá však príčinu nájsť nemusí.

TIP: Svoje weby aj weby klientov mám v Hostcreators, prečo práve tam a zľavový kód nájdete v článku o prechode z Websupportu.

Ako zariadiť, aby články vychádzali načas

Najlepšie funguje kombinácia dvoch vecí: WP-Cron spúšťaný serverom a záchranná sieť, ktorá článok zverejní, keby zlyhalo aj to.

1. Cron úloha na hostingu

Namiesto návštev bude WP-Cron spúšťať server v pravidelnom intervale. V administrácii hostingu, zvyčajne v časti Cron alebo Cron úlohy, pridajte úlohu s intervalom 5 minút (v zápise cronu */5 * * * *), ktorá zavolá súbor wp-cron.php:

wget --delete-after https://vasadomena.sk/wp-cron.php

Ak hosting ponúka WP-CLI, je spoľahlivejší príkaz, ktorý úlohy spustí priamo, bez požiadavky cez web. Nezastaví ho teda ani firewall:

wp cron event run --due-now --path=/cesta/k/webu

Až keď úloha beží, pridajte do súboru wp-config.php, nad komentár "That's all, stop editing!", tento riadok:

define( 'DISABLE_WP_CRON', true );

WordPress potom pri návštevách WP-Cron nespúšťa a úlohy bežia len podľa servera. V opačnom poradí by sa na čas medzi oboma krokmi zastavili všetky úlohy. Či všetko funguje, ukáže o niekoľko minút Zdravie webovej stránky alebo WP Crontrol.

2. Záchranná sieť: vlastný kód

Kód nižšie najviac raz za 5 minút, pri otvorení stránky alebo administrácie, skontroluje, či na webe nie je naplánovaný článok viac ako 10 minút po termíne. Ak taký nájde, zverejní ho rovnakou funkciou, akú používa WP-Cron, a pošle e-mail na adresu správcu webu z Nastavenia > Všeobecné.

Na spätnú požiadavku ani na zapísanú úlohu sa nespolieha, články hľadá priamo v databáze. Pomôže preto, nech WP-Cron zlyhá z akéhokoľvek dôvodu, a má zmysel aj popri cron úlohe na hostingu. E-maily navyše ukážu, ako často a kedy sa to deje. S presným časom sa podpore hostingu v logoch hľadá oveľa ľahšie.

Kód patrí do súboru functions.php odvodenej (child) témy alebo do pluginu na vkladanie kódu, napríklad Code Snippets. Začína komentárom, bez úvodného <?php.

// zverejnenie naplánovaných článkov, ktoré WordPress nezverejnil včas,
// a upozornenie e-mailom na adresu správcu webu

function jh_publish_missed_posts() {
	// kontrola najviac raz za 5 minút
	if ( get_transient( 'jh_missed_posts_check' ) ) {
		return;
	}
	set_transient( 'jh_missed_posts_check', 1, 5 * MINUTE_IN_SECONDS );

	// naplánované články, ktorých čas publikovania prešiel pred viac ako 10 minútami
	$posts = get_posts(
		array(
			'post_type'      => 'post',
			'post_status'    => 'future',
			'posts_per_page' => 10,
			'date_query'     => array(
				array(
					'column' => 'post_date_gmt',
					'before' => gmdate( 'Y-m-d H:i:s', time() - 10 * MINUTE_IN_SECONDS ),
				),
			),
		)
	);

	foreach ( $posts as $post ) {
		// rovnaká funkcia, ktorou článok zverejňuje WP-Cron
		check_and_publish_future_post( $post );

		if ( 'publish' !== get_post_status( $post->ID ) ) {
			continue;
		}

		// zmazanie úlohy, ktorú WP-Cron nestihol vykonať
		wp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) );

		wp_mail(
			get_option( 'admin_email' ),
			'Oneskorene zverejnený článok: ' . $post->post_title,
			sprintf(
				"Článok \"%s\" mal vyjsť %s, zverejnený bol až %s.\n\n%s",
				$post->post_title,
				wp_date( 'j.n.Y G:i', strtotime( $post->post_date_gmt . ' GMT' ) ),
				wp_date( 'j.n.Y G:i' ),
				get_permalink( $post )
			)
		);
	}
}
add_action( 'init', 'jh_publish_missed_posts' );
  • Kontroluje len články. Ak plánujete aj stránky alebo produkty, zmeňte riadok s 'post_type' na 'post_type' => array( 'post', 'page', 'product' ),.
  • Hranica 10 minút nechá WP-Cronu čas zverejniť článok sám, aj keď ho server spúšťa každých 5 minút. Kód tak zasiahne a pošle e-mail, len keď WP-Cron zlyhal alebo výrazne mešká.
  • Kód beží, len keď sa spúšťa WordPress. Návštevy stránok z cache ho nespustia, otvorenie administrácie áno.
  • Aby e-mail prišiel, web musí vedieť odosielať poštu. Ak e-maily z webu nechodia, poradí článok Čo robiť, keď WordPress neodosiela e-maily?

3. Hotové pluginy

Ak nechcete vkladať kód, podobnú záchrannú sieť poskytne plugin Missed Scheduled Posts Publisher od WPBeginner. Každých 15 minút skontroluje naplánované články a tie po termíne zverejní. Na sledovanie úloh a ich ručné spustenie poslúži WP Crontrol, ktorý navyše sám upozorní, keď zistí problém so spúšťaním WP-Cronu.

Zhrnutie

Hláška "Planované publikovanie ešte neprebehlo" znamená, že WP-Cron článok včas nezverejnil. Príčin je niekoľko, od webu bez návštev a cache cez zablokovanú spätnú požiadavku až po preťažený server, a často sa nedá zistiť, ktorá to bola. Spoľahlivejšie než ju hľadať je spúšťať WP-Cron cron úlohou na hostingu a pridať záchrannú sieť, ktorá zmeškaný článok zverejní a dá o tom vedieť e-mailom.

Ak to nechcete nastavovať sami, cron úlohu, záchrannú sieť aj pravidelnú kontrolu naplánovaných úloh nastavím v rámci správy web stránok.


Páčil sa vám tento článok? Zdieľajte ho na sociálnych sieťach alebo ho pošlite niekomu, komu by mohol pomôcť.

Zdieľať článok:
Ak chcete podporiť ďalšie články, kúpte mi kávičku.
Profilový obrázok autora článku
O autorovi článku

Juraj

Nezávislý profesionál s viac ako 10 rokmi skúseností v tvorbe webových stránok & eshopov a špecialista na WordPress. Pomáham klientom vytvárať funkčné, moderné a efektívne webové riešenia. Vo voľnom čase cestujem a oddychujem vo wellnesse. Rád varím a ešte radšej jem!

Pridať komentár