Jak vypnout kešování WP Super Cache při splnění určité podmínky

Potřeboval jsem vypnout kešování stránek u pluginu WP Super Cache pro WordPress za určitých jasně daných podmínek (v mém případě, když uživatel přišel s nějakými konkrétními utm tagy).

Řešení je nakonec velmi jednoduché, ale jelikož jsem jeho hledáním strávil asi 2 hodiny, mohlo by se hodit i někomu dalšímu.

Mé řešení spočívá ve vytvoření jednoduchého pluginu pro plugin WP Super Cache. Předtím silně doporučuji v souboru wp-cache-config.php nastavit $wp_cache_plugins_dir na jinou než výchozí hodnotu. Když to neuděláte, tak při prvním updatu pluginu se Vaše práce nadobro ztratí.

Kromě jednoduchého přepínače (Enabled/Disabled) obsahuje plugin jedinou funkci, která se spustí při akci cache_init:

add_cacheaction( 'cache_init', 'cacheornot_action' );

Samotná funkčnost je také jednoduchá:

function cacheornot_action() {
  global $cache_cacheornot, $cache_enabled;

  if($cache_cacheornot == '1') {
    if($condition) {	// podmínka, za které se nemá kešovat
      define( 'DONOTCACHEPAGE', 1 );
      $cache_enabled = 0;
    }
  }
}

Teoreticky by podle manuálu mělo stačit nastavit konstantu DONOTCACHEPAGE. Problém je v tom, že existence této konstanty se kontroluje až ve 2. fázi (wp-cache-phase2.php).

Pokud už v 1. fázi (wp-cache-phase1.php) najde plugin již vytvořenou cache právě volané stránky, tak jí uživateli vrátí a na hodnotu DONOTCACHEPAGE nehledí. Jestli je to bug nebo feature, se mi nechtělo zjišťovat. Proto zároveň upravím hodnotu globální proměnné $cache_enabled na 0.

Plugin je pahýl, musíte si do něho doprogramovat vyhodnocení podmínky. Celý zdrojový kód najdete na mém GitHubu.

Pokud Vám tento článek pomohl, napište mi do komentářů, ať vím, že mělo smysl ho psát.