Snapchat jede. Hlavně teda mezi těmi, kteří mimino 2000 považují za svého vrstevníka. A já vlastně ani pořádně nevím, o co v tom jde. Trpím jen takovou představou, že se tam musí posílat hodně pipů a pipin. Hlavní myšlenkou ale je, že všechny ty texty, obrázky, videa a kdo ví co ještě, mají jen omezenou dobu trvání. A to samé vám dnes představím – články s omezenou životností.
Nejdříve jsem přemýšlel, že bych nastavil cron, který by kontroloval, zda mají ještě jednotlivé příspěvky povolený život. Nicméně cron ve WordPressu ne vždy funguje úplně spolehlivě, takže platnost příspěvku se bude kontrolovat při zobrazení jejich detailů. To znamená, že článek se bude zobrazovat ve všech přehledech i po expiraci, dokud nedojde k jeho přímému zobrazení.
A také pamatujte, že cokoliv se objeví na internetu, velmi pravděpodobně už nikdy nebude smazáno. Kdokoliv si může článek jednoduše uložit, takže si dobře rozmyslete, co vypouštíte ven.
Jak připravit článek
Napadají mě možnosti, jak určit, jak dlouho má článek vydržet na webu. Buď jedna pevná doba- například každý článek (případně každý článek určité kategorie) vydrží 24 hodin od zveřejnění. Případně podle uživatelského pole, kde půjde přesně napsat datum expirace. V příkladu vám ukážu obojí.
Pro tyto účely vytvořím u článku uživatelské pole expire a vložím datum ve tvatu HH:MM:SS DD.MM.YYYY.
Jak oveřit platnost článku
Jak už jsem nadnesl, platnost článku se bude ověřovat při jeho zobrazení. Můžete samozřejmě použít i cron, který by mazal starší články, které mnoho lidí nečte.
function getPostExpire($id) { $expireDate = new \DateTime(); // try to load custom field $expire = get_post_meta($id, 'expire', true); // if it not exists make expiration day after published if (!$expire) { $expireDate->setTimestamp(strtotime(get_the_date('d.m.Y H:i:s'), $id)); $expireDate->modify('+1 day'); } else { // otherwise use custom field $expireDate->setTimestamp(strtotime($expire . 'Europe/Prague')); } return $expireDate; } function checkPostExpire() { // check expiration only on single page if (is_single()) { $now = new \DateTime(); $expireDate = getPostExpire(get_the_ID()); // compare unix times if ($expireDate->format('U') <= $now->format('U')) { // if post should expire, trash it wp_trash_post(get_the_ID()); // and redirect user to homepage wp_redirect(home_url()); exit; } } } add_action('get_header', 'checkPostExpire');
Check na straně uživatele
Ještě můžeme přidat jednoduché javascriptové počítadlo, které čtenáře upozorní, že by měl číst rychle. Na konci odpočtu refresne stránku, čímž se článek smaže a uživatel bude přesměrován na homepage.
Javascript by si zasloužil externí javascriptový soubor, ale pro zjednodušení tohoto příkladu ho inlinově vkládám ke každému příspěvku.
function addCountdown($content) { if (is_single()) { $content .= '<p>Příspěvek bude smazán za <span id="time"></span></p>'; $content .= '<script> function getTimeRemaining(endtime){ var t = Date.parse(endtime) - Date.parse(new Date()); var seconds = Math.floor( (t/1000) % 60 ); var minutes = Math.floor( (t/1000/60) % 60 ); var hours = Math.floor( (t/(1000*60*60)) % 24 ); var days = Math.floor( t/(1000*60*60*24) ); return { "total": t, "days": days, "hours": hours, "minutes": minutes, "seconds": seconds }; }; function initializeClock(id, endtime){ var clock = document.getElementById(id); var timeinterval = setInterval(function(){ var t = getTimeRemaining(endtime); clock.innerHTML = t.days + " dní " + t.hours + " hodin " + t.minutes + " minut " + t.seconds + " sekund."; if(t.total<=0){ window.location.reload(); clearInterval(timeinterval); } },1000); } initializeClock("time", "' . getPostExpire(get_the_ID())->format('H:i:s m-d-Y e') . '"); </script>'; } return $content; } add_filter('the_content', 'addCountdown');