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
<?phptaga - 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. uplugins_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_bufferingpomaže da se spreče greške sa preranim izlazom.session.cookie_securegarantuje da se kolačići šalju samo preko HTTPS-a, čuvajući ih od presretanja.session.cookie_httponlyblokira JavaScript da čita kolačiće, čime se smanjuje rizik od XSS napada.session.cookie_samesitepomaže u zaštiti od CSRF napada.session.use_strict_modedodatno 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ć