Start » WordPress » Rešavanje problema » Čudna WordPress greška sa PHP 8.0

Čudna WordPress greška sa PHP 8.0

U ovom članku pišem o dosta čudnoj grešci sa WordPress-om i PHP-om 8.0, kakvu nisam video do sada – a koristim WordPress oko sedam godina.


Sadržaj:

  1. PHP 8.0
  2. WordPress PHP 8.0 greška
  3. Pronalaženje uzroka problema
  4. Rešenje problema
  5. Dilema


1. PHP 8.0

Zbog duha vremena i trendova u razvoju softvera, oprezan sam pri korištenju novih verzija i apdejtovanju generalno (na engleskom sam se ovoga dotakao u članku Zeitgeist: “Fake it ’till you make it!”).

Moji sajtovi su sretno radili na PHP 7.4 verziji već par godina. Svi koriste istu temu i vrlo sličan skup plaginova. Međutim, niko ne zarađuje kada stari softver samo radi – mora se “apgrejdovati.” Elem, PHP verziji 7.4. se bliži kraj života:

PHP (EOL - End Of Life) vremenik razvoja i podrške verzija
PHP (EOL – End Of Life) vremenik razvoja i podrške verzija – izvor: php.net
Slika 1

Sam WordPress, kao i mnoge teme i plagini još su daleko od zrelih i dovoljno ispitanih sa PHP verzijom 8.0, a sat neumoljivo kuca – još par meseci do ispraćaja verzije 7.4 u penziju.

Krajnje je vreme da sajtove testiram i prebacim na PHP 8.0, uz rešavanje eventualnih problema koji se jave. Tako da sam prvo testirao klonirane verzije sajtova u staging okruženju – sve dobro. OK, mogu početi prebacivati jedan po jedan produkcioni sajt na novu verziju PHP-a. Radi dodatnog opreza, odlučio sam krenuti sa svojim blogom – to niko ne čita ( Uglavnom Beskorisno™ ). 🙂

Sve je prošlo glatko i prebacio sam i sve ostale sajtove – bez problema. Dosta sam oprezan pri izboru WordPress tema i plagina, ali ovo me je ipak prijatno iznenadilo! Sad ide ona scena kad nasmejan trčim po cvetnoj poljani, a u pozadini se pojačava ona muzika iz horor filmova…


2. WordPress PHP 8.0 greška

Odlučio sam najzad napraviti BikeGremlin ODEI ™ sajt da liči na nešto – prebaciti ga sa statičkog HTML-a u WordPress i srediti izgled, korisnički interfejs i pretragu.

Pošto na samom tom sajtu ne planiram sekciju za pitanja & odgovore, nisam ni instalirao plagin Subscribe To Comments Reloaded (wp.org link).

Ostatak setapa je isti kao za moje ostale sajtove – tema, custom kod child teme, plagini itd.

Šta bi moglo da ne radi?! 🙂

Sajt je lepo radio, ali sam za svaki slučaj pogledao logove grešaka na hosting serveru (lokacija error logova na cPanel i DirectAdmin kontrolnim panelima).

PHP error log u WordPress home direktorijumu
PHP error log u WordPress home direktorijumu
Slika 2

Otvaranje loga pokazalo je ovu grešku puno puta (po jednom za svako otvaranje stranice):

[15-Sep-2021 19:59:44 UTC] PHP Warning: Undefined variable $custom_content in /home/bikegremlin/public_html/wp-content/themes/generatepress-child/functions.php on line 26

Dooobro, problem je sa kodom child teme, na liniji 26 (boldovana):

// BEGIN Prikaz poslednjeg azuriranja

function wpb_last_updated_date( $content ) {
    $u_time = get_the_time('U'); 
    $u_modified_time = get_the_modified_time('U');
    if ($u_modified_time >= $u_time + 86400) { 
        $updated_date = get_the_modified_time('d/m/Y');
        $custom_content .= '<p class="last-updated">Updated: '. $updated_date .   '.  </p>';
    }
    $custom_content .= $content;
    return $custom_content;
}
add_filter( 'the_content', 'wpb_last_updated_date' );

// END Prikaz poslednjeg azuriranja

Ali sve radi savršeno na frontendu – čak i ta funkcija uradi šta treba i prikaže kako treba?!?

Da sve bude još čudnije, ista ta funkcija ne prikazuje tu grešku na ostalim sajtovima!

– Sadržaj –


3. Pronalaženje uzroka problema

Probao sam instaliranje WordPress-a, teme i plaginova na novom cPanel nalogu – i on je pravio probleme.

Proverio sam dvaput da li je sve na “problematičnom” sajtu podešeno identično kao što je na sajtovima koji ne javljaju grešku – ali nisam bio instalirao plagin za komentare.

Do sad mi se dešavalo da dodatni plagin pravi problem, ali nikada da ne-instaliranje plagina uzrokuje problem. Pogotovo što je problem sa mojim custom kodom koji se ne poziva na taj plagin i što nema grešaka sa PHP 7.4 (bez tog plagina).

Vidite kako (i zašto) sam ovo propustio?

Ono što sam uspeo utvrditi je da sa PHP 7.4 nema greške, kao i da sa temom Twenty Twenty-One (koristi se da ne zaboravite koja je godina 🙂 ) nema greškeispravka, nisam bio ubacio problematični kod u child temu pri testiranju za Twenty Twenty-One.

Tako da sam uradio sve ostalo, kao klasičan početnik:

  • Pitao sam provajdera da proveri ima li neki problem sa PHP 8.0, takav da zahvata samo pojedinačne cPanel naloge (a na drugima radi) – proverili su i potvrdili da je kod njih sve OK.
    Koristim HostMantis hosting, i moram reći da je njihova tehnička podrška bila brza i efikasna. Zaista nije bio problem do njih, već do mog lošeg koda, kako sam kasnije utvrdio.
  • Pitao sam na forumu podrške za GeneratePress.
  • Davio sam dobre ljude na LowEndSpirit forumu.

I dalje sam bio u Kvaka 22 situaciji – morao sam to rešiti sam. Uz dosta saveta, smernica i pomoći, ali bez rešenja.

“Svi smo se složili da je Vaša teorija luda. Pitanje koje nas deli je da li je dovoljno luda da bi imala šansu da bude ispravna.”

– Nils Bor, u odgovoru Wolfgangu Pauliu

Odlučujem da na novom sajtu napravim sve 1-na-1 identično kao na sajtovima koji ne prave grešku, pa počinjem dodavati plagine – iako su na novom sajtu nepotrebni. Posle više sati eksperimentisanja shvatam da instaliranje Subscribe To Comments Reloaded plagina (wp.org link) rešava problem. Sa njime nema greške, čak ni sa GeneratePress temom i PHP 8.0 verzijom.

– Sadržaj –


4. Rešenje problema

Po čemu se WordPress plagini razlikuju od žbica na točku bicikla?
– Što manje, to bolje!

Instaliranje nepotrebnog WordPress plagina je put u propast (ne mislim na album Ramonesa! 🙂 ).

S tim na umu, ovo su mi bila ograničenja za rešenje:

  • Sajt mora dobro raditi na PHP 8.0.
  • Želim koristiti GeneratePress temu – jer je ipak među najboljim.
  • Ne smeju se instalirati nikakvi nepotrebni plagini!

Jedan od razloga zašto je GeneratePress najbolja WordPress tema je njena fenomenalna dokumentacija (link ka GP dokumentaciji). 🙂

Izbacujem svoju custom funkciju. Kako kaže kolega johnk na LES forumu:

The issue is in PHP 8.0, usage became more strict compared to 7.4. So, technically “improper” assignment like what you were doing throws a warning now.

– johnk

I ubacujem sledeći kod u style.css child teme:

/* BEGIN prikaz samo datuma azuriranja */

.posted-on .updated {
    display: inline-block;
}

.posted-on .updated + .entry-date {
    display: none;
}

.posted-on .updated:before {
    content: "Updated ";
}

/* END prikaz samo datuma azuriranja */

Mislim da je to-to – Proper Job™ 🙂

Ispravan kod za moju originalnu funkciju je ovaj (boldovao sam liniju koja je nedostajala, sa definicijom varijable pre njene upotrebe):

function wpb_last_updated_date( $content ) {
    $u_time = get_the_time('U'); 
    $u_modified_time = get_the_modified_time('U');
    $custom_content = '';
    if ($u_modified_time >= $u_time + 86400) { 
        $updated_date = get_the_modified_time('d/m/Y');
        $custom_content .= '<p class="last-updated">Updated: '. $updated_date .   '.  </p>';
    }
    $custom_content .= $content;
    return $custom_content;
}
add_filter( 'the_content', 'wpb_last_updated_date' );

Ovakvo rešenje ne prikazuje datum ažuriranja na stranicama (eng. page), samo na člancima (eng. post). Ovo ima više smisla od mog prethodnog izbora, pošto je vreme ažuriranja bitno samo za članke.

– Sadržaj –


5. Dilema

Problem je rešen (barem za sada), ali još me ovo kopka:

  1. Ako je problem u mom lošem kodu i njegovoj nekompatibilnosti sa PHP 8.0 (što me ne bi čudilo, jer sam majstorčina, a ne programer), zašto tema Twenty Twenty-One ne prijavljuje ovu grešku?
    – Odgovor je da nisam bio ubacio problematičan kod u Twenty Twenty-One child temu.
  2. Kako i zašto plagin Subscribe To Comments Reloaded (wp.org link) eliminiše prijavu ove greške?

Izgleda mi da u razvoju softvera, kao i u većini drugih industrija, ima sve više marketinga, a sve manje testiranja i dokumentovanja.

Za ovo što meni treba, mislim da je WordPress i dalje namanje loše rešenje, ali uopšte mi se ne dopadaju česti “apdejti & apgrejdi” svega živog. U svakom slučaju, ne nameštam prijateljima kočnice bajsa bez probne vožnje posle toga.

– Sadržaj –

2 misli o “Čudna WordPress greška sa PHP 8.0”

  1. Sve je to lepo ali ta boldovana greška se ne pravi posle 7 godina rada u WP. Ja radim oko 11 godina u WP i bez obzira na PHP verziju uvek težim ka bare-bone rešenju. Ne dozvoljavam da mi PHP “gleda kroz prste” jer me mrzi da iskucam kod kako treba. Ipak, lepo je što si ovo dokumentovao kako bi koristilo početnicima u PHP-u.

    Odgovori

Komentiraj

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.


Google izbor sadržaja: