În administrarea unui blog sau portal WordPress apar frecvent situații în care anumite articole au relevanță doar pentru o perioadă limitată: concursuri, oferte promoționale speciale, evenimente sau anunțuri sezoniere. Pentru a preveni situația în care vizitatorii accesează conținut depășit sau concursuri încheiate, poți stabili un termen de expirare automat pentru fiecare articol.
O modalitate flexibilă și eficientă de a implementa această regulă fără pluginuri complicate este utilizarea câmpurilor personalizate (Custom Fields) asociate articolului, verificate direct în bucla principală WordPress (The Loop).
Cum funcționează verificarea datei de expirare în bucla WordPress
În fișierul de șablon responsabil cu listarea articolelor (cum ar fi index.php, archive.php sau category.php), bucla WordPress standard poate fi adaptată pentru a verifica dacă data salvată în metadatele articolului se află în viitor.
Iată codul corectat și structurat în PHP:
<?php
if (have_posts()) :
while (have_posts()) : the_post();
// Extragem data de expirare din câmpul personalizat
$expiration = get_post_meta(get_the_ID(), 'expiration', true);
// Verificăm dacă articolul mai este activ
$is_active = true;
if (!empty($expiration)) {
$seconds_remaining = strtotime($expiration) - time();
if ($seconds_remaining <= 0) {
$is_active = false;
}
}
// Afișăm conținutul doar dacă articolul nu a expirat
if ($is_active) : ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div>
</article>
<?php
endif;
endwhile;
endif;
?>
Configurarea câmpului personalizat în panoul de administrare
Pentru a stabili momentul expirării unui articol:
- În ecranul de editare al articolului, activează panoul Câmpuri personalizate (Custom Fields) din setările de afișare.
- Adaugă un câmp nou cu denumirea exactă
expiration. - În căsuța Valoare, introdu data și ora până la care articolul rămâne activ. Se recomandă formatul standard internațional
YYYY-MM-DD HH:MM:SS(de exemplu:2026-12-31 23:59:59) sau formatul recunoscut nativ de funcția PHPstrtotime():mm/dd/yyyy 00:00:00. - Publică sau actualizează articolul. Dacă lași câmpul gol, articolul va fi tratat ca permanent și va rămâne vizibil pe site.
Filtrarea la nivel de interogare prin pre_get_posts (Abordare avansată)
Deși ascunderea conținutului în interiorul buclei din șablon este rapidă, ea are un dezavantaj legat de paginare: dacă o pagină este configurată să arate 10 articole și 3 dintre ele au expirat, vizitatorii vor vedea doar 7 articole pe acea pagină.
Pentru a rezolva elegant această problemă, poți exclude articolele expirate direct din interogarea SQL din functions.php folosind hook-ul pre_get_posts:
<?php
function dexblog_filtreaza_articole_expirate($query) {
if (!is_admin() && $query->is_main_query() && ($query->is_home() || $query->is_archive())) {
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'expiration',
'compare' => 'NOT EXISTS',
),
array(
'key' => 'expiration',
'value' => date('Y-m-d H:i:s'),
'compare' => '>',
'type' => 'DATETIME',
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'dexblog_filtreaza_articole_expirate');
?>
Soluții prin pluginuri dedicate
Dacă preferi o soluție automată fără modificări în codul temei, există pluginuri specializate precum PublishPress Future (cunoscut anterior ca Post Expirator). Acestea permit nu doar ascunderea articolului, ci și schimbarea automată a stării lui la data stabilită: transformarea din Publicat în Ciornă, mutarea într-o categorie specială de arhivă sau ștergerea definitivă a postării.