Kolačići u WordPress-u i najčešće greške u vezi sa njima Idi do glavnog sadržaja

Kako rešiti i sprečiti probleme sa kolačićima u WordPress-u

Ako ste se ikada susreli sa problemima u WordPress-u gde vas sistem stalno vraća na stranicu za prijavu ili vam izbacuje poruku da je sesija istekla, prirodno je da prvo posumnjate na svoj browser. U mnogim slučajevima, to i jeste uzrok problema, ali nije i jedini.

Podešavanja browsera, instalirane ekstenzije ili privacy blocker-i mogu da ometaju rad kolačića u vašem browseru i tako onemoguće da vidite ispravno svoj web sajt. Ovo je posebno problem kada se javlja kod posetilaca vašeg sajta.

Ovakvi problemi mogu da izgledaju isto kao i greške koje potiču iz browsera, ali se rešavaju na potpuno drugačiji način. Zato ćemo u u ovom tekstu objasniti na šta treba da obratite pažnju i kako da postepeno eliminišete uzroke.

Proverite da li postoji prazan prostor u PHP fajlovima

Jedan od tih skrivenih uzroka problema sa kolačićima u WordPress-u je prisustvo praznih linija ili razmaka na pogrešnom mestu u PHP fajlovima. Ovo se posebno često dešava u fajlu wp-config.php, ali može biti i u drugim ključnim fajlovima teme ili plugin-ova.

Greška nastaje kada postoji razmak ili prazan red:

  • pre početnog <?php taga
  • ili posle završnog ?> taga

I najmanji znak viška može sprečiti slanje kolačića jer PHP tada počinje da šalje izlaz (output) pre nego što su poslata HTTP zaglavlja.

Pogrešno (obratite pažnju na razmak pre otvarajućeg PHP taga):

 <?php

/** WordPress configuration file */

Ispravno (bez ikakvog razmaka):

<?php

/** WordPress configuration file */

Kod čistih PHP fajlova čak se preporučuje da se završni ?> tag potpuno izostavi, kako bi se izbegao rizik od dodavanja praznih znakova posle njega.

Ispravno:

define('WP_DEBUG', true);

/* That's all, stop editing! */

require_once(ABSPATH . 'wp-settings.php');

Problematično (završni tag + potencijalni razmak):

define('WP_DEBUG', true);

/* That's all, stop editing! */

require_once(ABSPATH . 'wp-settings.php');

?>

Dakle, mala i jednostavna provera fajlova može rešiti veliki broj problema sa kolačićima.

Skeniranje fajlova na BOM karaktere

Još jedan tih nevidljivih krivaca za greške sa kolačićima su BOM (Byte Order Mark) karakteri.
Oni su nevidljivi znakovi koje pojedini editori teksta automatski dodaju na početak fajla. Nažalost, BOM znakovi se računaju kao izlaz pre HTTP zaglavlja i tako ometaju rad kolačića.

Da biste ovo rešili otvorite fajl u bilo kom kod editoru i proverite da li je enkodiran kao UTF-8 bez BOM.
U većini editora opcija za promenu enkodiranja nalazi se u donjoj statusnoj traci ili u meniju File > Save with Encoding.

Ako koristite komandnu liniju, BOM možete detektovati pomoću:

find . -type f -name '*.php' -exec file {} \; | grep "with BOM"

Svi fajlovi koje pronađete ovim testom treba da se ponovo sačuvaju u formatu UTF-8 bez BOM.

Prepoznavanje problema koje izazivaju plugin-ovi

Vrlo često problem ne dolazi iz jezgra WordPress-a, već iz plugin-ova.
Plugin može:

  • da pošalje izlaz pre nego što su poslata zaglavlja,
  • da prikaže debug poruku prerano,
  • ili da nepravilno rukuje aktivacijom.

Najbrži način provere je da privremeno deaktivirate sve plugin-ove. To možete uraditi:

  • kroz WordPress admin panel
  • ili tako što ćete preimenovati folder wp-content/plugins (npr. u plugins_backup).

Ako nakon toga problem nestane, vratite plugin-ove jedan po jedan dok ne pronađete onaj koji pravi grešku.

Provera WordPress teme i njenog koda

Ako deaktivacija plugin-ova ne pomogne, sledeći korak je testiranje sa podrazumevanom WordPress temom (npr. Twenty Twenty-Four).
Ako problem nestane kada promenite temu, vrlo je verovatno da uzrok leži u functions.php ili nekom drugom fajlu teme.

Tipičan primer greške:
Pogrešno (output pre zaglavlja):

<?php

echo "Debug message"; // Ovo će izazvati grešku sa kolačićima

function my_theme_setup() {

    // Theme setup code

}

Ispravno:

<?php

function my_theme_setup() {

    // Theme setup code

}

Sve što šalje tekst ili razmake pre slanja zaglavlja treba ukloniti ili smestiti unutar funkcija.

Kada je problem u browseru

Postoji i verzija ove greške „Cookies are blocked or not supported by your browser“ koja nema veze sa WordPress-om, već sa podešavanjima browsera. U tom slučaju rešenje je podešavanje dozvola za kolačiće.

Google Chrome:
Idite na Settings > Privacy and security > Third-party cookies i dodajte svoj domen u listu sa dozvolama.

Microsoft Edge:
U Cookies and site permissions odaberite opciju koja dozvoljava kolačiće za vaš sajt.

Brave:
Kliknite na ikonicu „Shield“ pored adrese sajta i izaberite da dozvolite kolačiće.

Firefox:
Otvorite Settings > Privacy and Security i u odeljku Cookies and Site Data dodajte izuzetak za svoj sajt.

Safari:
U Settings > Advanced isključite opciju Block all cookies.

Bez obzira koji browser koristite, potrebno je da pronađete opciju za izuzetke i dodate svoj domen kako bi kolačići radili ispravno.

Ručno podešavanje domena kolačića

Kada WordPress kreira kolačiće, on mora da zna na koji domen se oni odnose. Ako ga ne postavite ručno, WordPress će pokušati sam da ga odredi. U jednostavnim instalacijama to obično radi bez problema, ali u složenijim okruženjima, kao što su Multisite mreže, sajtovi sa više poddomena ili instalacije u poddirektorijumima, može da pogreši.

Da biste sprečili probleme, možete eksplicitno da odredite domen kolačića u wp-config.php fajlu:

// Za standardne domene

define('COOKIE_DOMAIN', 'mojdomen.co.rs');

// Za poddomene kojima treba pristup iz glavnog domena

define('COOKIE_DOMAIN', '.mojdomen.co.rs');

// Za instalacije u poddirektorijumima

define('ADMIN_COOKIE_PATH', '/');

define('COOKIEPATH', '/');

define('SITECOOKIEPATH', '/');

Rešavanje greške session expired u formama

Sigurno ste nekada popunili kontakt formu ili započeli kupovinu u online prodavnici, kliknuli na „Pošalji“ ili „Plati“ i dobili poruku „Your session has expired“. Ova greška je posebno frustrirajuća za posetioce, a za vlasnika sajta znači izgubljene kupce ili upite.

Zašto se dešava:

  • Nonce tokeni (sigurnosni kodovi) u WordPress-u ističu nakon određenog vremena, obično 24–48 sati, ali može biti i kraće.
  • Kolačići sesije ne uspevaju da očuvaju stanje od učitavanja do slanja forme, posebno ako se koristi agresivno keširanje.

Kako to popraviti:

  • Produžite trajanje sesije.
  • Isključite stranice sa formama iz keša.
  • Produžite vreme trajanja nonce tokena pomoću filtera nonce_life.

WooCommerce i problemi sa sesijama

Ako imate WooCommerce prodavnicu, sesije postaju još važnije, jer one ne služe samo za prijavu korisnika, već i za čuvanje podataka o korpi, adresama, načinu dostave i drugim informacijama tokom procesa kupovine.

Kako produžiti trajanje WooCommerce sesije:

add_filter('wc_session_expiration', function() {

    return 7 * DAY_IN_SECONDS; // 7 dana umesto podrazumevana 2 dana

});

Multi-step i AJAX forme

Forme koje se popunjavaju u više koraka (multi-step) ili koriste AJAX za slanje podataka bez osvežavanja stranice posebno su osetljive na probleme sa sesijama.

Kako smanjiti rizik od greške:

  • Produžite vreme trajanja nonce tokena.
  • Isključite stranice sa formama iz keša.
// Produžavanje trajanja nonce tokena na 12 sati

add_filter('nonce_life', function() {

    return 12 * HOUR_IN_SECONDS;

});

Gravity Forms i napredna kontrola sesija

Gravity Forms, jedan od najpopularnijih plugin-ova za forme, ima sopstvene postavke za rukovanje sesijama, uključujući i čuvanje nepotpunih prijava (incomplete submissions).

Produžavanje perioda čuvanja nepotpunih prijava:

add_filter('gform_incomplete_submissions_expiration_days', function($days) {

    return 7; // umesto podrazumevanih 30 dana

});

Isključivanje Gravity Forms AJAX poziva iz keša:

add_action('init', function() {

    if (isset($_POST['gform_ajax']) || (isset($_GET['page']) && $_GET['page'] === 'gf_entries')) {

        if (!defined('DONOTCACHEPAGE')) {

            define('DONOTCACHEPAGE', true);

        }

    }

});

Prevencija i rešavanje grešaka sa kolačićima u WordPress-u

Do sada smo govorili o tome kako da rešite konkretne probleme kada se oni već pojave. Međutim, mnogo je bolje da ih uopšte ne dozvolite, a to se postiže dobrim razvojnim praksama i pravilnim postavljanjem kolačića i sesija.

Postavite kolačiće pre bilo kakvog izlaza ka browseru

U PHP-u i WordPress-u pravilo je jasno: kolačići moraju biti postavljeni pre nego što se pošalje bilo kakav HTML, CSS, JavaScript ili tekstualni izlaz ka korisniku. Ako se makar i jedan karakter pošalje ranije, browser će ignorisati sve naknadne pokušaje da se kolačići postave.

Primer ispravnog koda:

if (!headers_sent()) {

    setcookie('custom_cookie', $value, time() + 3600, COOKIEPATH, COOKIE_DOMAIN);

}

Ovaj uslov !headers_sent() osigurava da se kolačić ne pokuša postaviti ako je browser već počeo da dobija sadržaj.

Output buffering: zaštita od „nenamernog izlaza“

Često plugin ili tema mogu neprimetno da pošalju neki razmak, echo, debug poruku (var_dump) ili BOM karakter pre nego što bi trebalo. Ovo dovodi do greške „headers already sent“, zbog koje kolačići ne funkcionišu.

U tom slučaju rešenje je da koristite output buffering. On funkcioniše tako što sve što bi inače išlo direktno ka browseru, prvo čuva u memoriji i šalje tek kada vi to odobrite.

Primer:

ob_start(); // Uključuje output buffering

// Sav kod koji može da proizvede izlaz

ob_end_flush(); // Tek ovde šalje sadržaj browseru

Na ovaj način ste sigurni da nikakav slučajni razmak ili echo neće pokvariti rad sa kolačićima.

Ispravno vreme za rad sa kolačićima u WordPress ciklusu

WordPress ima svoj redosled (ciklus) izvršavanja koda. Ako postavite kolačić prerano (pre nego što WordPress završi inicijalizaciju), ili prekasno (nakon što su već poslata HTTP zaglavlja), doći će do greške.

Najsigurniji trenutak je init hook:

add_action('init', function() {

    if (!is_admin()) {

        wp_set_auth_cookie($user_id);

    }

});

Ovo osigurava da se kolačići postave u pravom trenutku, nakon što je WordPress spreman, a pre nego što je bilo šta poslato browseru.

Preporučena PHP podešavanja za kolačiće i sesije

Da bi kolačići i sesije radili bezbedno i stabilno, uvek podesite sledeće vrednosti:

output_buffering = 4096          

session.cookie_secure = On       

session.cookie_httponly = On     

session.cookie_samesite = Lax    

session.use_strict_mode = On

Zašto su važna:

  • output_buffering pomaže da se spreče greške sa preranim izlazom.
  • session.cookie_secure garantuje da se kolačići šalju samo preko HTTPS-a, čuvajući ih od presretanja.
  • session.cookie_httponly blokira JavaScript da čita kolačiće, čime se smanjuje rizik od XSS napada.
  • session.cookie_samesite pomaže u zaštiti od CSRF napada.
  • session.use_strict_mode dodatno jača sigurnost tako što sprečava preuzimanje tuđe sesije.

Ako niste sigurni kako da podesite PHP vrednosti, pročitajte naš tekst
Kako promeniti PHP verziju u cPanel-u. Tu ćete naći i uputstvo za podešavanje dodatnih opcija.

WordPress debug log za detaljnu analizu kolačića

Kada ne znate šta se dešava iza kulisa, tu je debug log. On beleži sve što WordPress radi sa kolačićima i sesijama.

Dodajte u wp-config.php:

define('WP_DEBUG', true);

define('WP_DEBUG_LOG', true);

define('WP_DEBUG_DISPLAY', false);

define('SCRIPT_DEBUG', true);

define('SAVEQUERIES', true);

A možete i posebno logovati stanje kolačića:

add_action('init', function() {

    if (defined('WP_DEBUG') && WP_DEBUG) {

        error_log('=== Cookie Debug Start ===');

        error_log('Cookie state: ' . print_r($_COOKIE, true));

        error_log('Headers sent: ' . (headers_sent($file, $line) ? "Yes at $file:$line" : 'No'));

        error_log('Request URI: ' . $_SERVER['REQUEST_URI']);

        error_log('=== Cookie Debug End ===');

    }

});

Na ovaj način u svakom trenutku možete proveriti: koje kolačiće WordPress vidi, da li su zaglavlja poslata i šta je izazvalo problem.

Korišćenje browser DevTools za analizu

Moderni browseri imaju odlične alate za praćenje kolačića:

  • Network tab → prikazuje HTTP zaglavlja i sve kolačiće koje WordPress šalje.
  • Application/Storage tab → daje listu svih kolačića, njihovo vreme isteka, domen i putanju.

Primer u JavaScript konzoli:

// Pregled svih kolačića u tabeli

console.table(document.cookie.split(';').map(c => {

    const [name, value] = c.trim().split('=');

    return { name, value: decodeURIComponent(value) };

}));

Ovo vam omogućava da u realnom vremenu vidite kako se kolačići menjaju dok klikćete po sajtu.

Query Monitor – napredni uvid

Query Monitor nije samo za SQL upite. Može se proširiti tako da prikaže i stanje kolačića tokom izvršavanja WordPress-a:

class QM_Collector_Cookies extends QM_Collector {

    public $id = 'cookies';

    public function process() {

        $this->data['cookies'] = $_COOKIE;

        $this->data['headers_sent'] = headers_sent($file, $line);

        $this->data['ob_level'] = ob_get_level();

    }

}

add_filter('qm/collectors', function($collectors) {

    $collectors['cookies'] = new QM_Collector_Cookies();

    return $collectors;

});

Na ovaj način u jednom panelu dobijate spisak kolačića, status zaglavlja i informacije o tome u kojoj fazi ciklusa se oni postavljaju.

Automatsko testiranje konflikata plugin-ova

Plugin-ovi su čest uzrok problema sa kolačićima. Umesto da ih ručno testirate, možete napraviti funkciju koja sama proverava:

function test_plugin_conflicts() {

    $active_plugins = get_option('active_plugins');

    $problematic_plugins = array();

    foreach ($active_plugins as $plugin) {

        deactivate_plugins($plugin);

        wp_cache_flush();

        if (!headers_sent()) {

            setcookie('test_cookie', 'value', time() + 3600, '/');

        }

        activate_plugins($plugin);

    }

    return $problematic_plugins;

}

Na ovaj način možete brzo otkriti koji plugin kvari rad kolačića i rešiti problem bez dugog isprobavanja.

Zaključak

Kolačići i sesije u WordPress-su ključni su za prijavu korisnika, forme i online kupovinu, pa čak i male greške mogu izazvati ozbiljne probleme.

Najčešći uzroci su nepotrebni razmaci u kodu, nekompatibilni plugin-ovi ili nepravilna podešavanja, ali se lako rešavaju ako znate gde da pogledate.

Zato je dobra praksa da držite kod urednim, testirate promene i koristite preporučena podešavanja. Na taj način ćete obezbediti stabilan rad svog web sajta i dobro korisničko iskustvo za posetioce vašeg sajta.

Nenad Mihajlović


Ostavite odgovor