Sajt vam je pao posle ažuriranja WordPress-a? Evo šta se dešava

Sajt vam je pao posle ažuriranja WordPress-a? Evo šta se dešava

Kada vaš WordPress sajt prestane da radi posle ažuriranja, panika može da vas obuzme. Ovaj članak pruža jednostavna rešenja za vraćanje funkcionalnosti vašeg sajta.

Šta ćete naučiti

  • Kako prepoznati problem sa WordPress-om i WP Rocket
  • Brza rešenja za obnavljanje vašeg sajta
  • Kako primeniti trajnu ispravku koda
  • Najčešća pitanja i odgovori o greškama
  • Kako obezbediti stabilnost sajta nakon ažuriranja

Poslednjih dana smo od nekoliko klijenata dobili istu poruku, sajt je prestao da radi, prikazuje samo belu stranicu sa obaveštenjem o grešci, i to baš posle ažuriranja WordPress-a. Nismo krivi ni mi ni hosting, u pitanju je poznat sukob između najnovije verzije WordPress-a i jednog od najpopularnijih plugina za ubrzavanje sajta, WP Rocket. Evo objašnjenja i rešenja.

Kako se to primeti

Otvorite sajt, i umesto sadržaja dobijete poruku “There has been a critical error on this website”. Isto se dešava i kad pokušate da uđete u administraciju. Ako ste ranije ažurirali WordPress na verziju 7.1 i imate instaliran WP Rocket, ovo je verovatno tačno vaš slučaj.

Zašto se sajt srušio

Bez ulaženja u previše tehničkih detalja, WordPress je u verziji 7.1 promenio unutrašnji način na koji obeležava funkcije koje se kače na razne događaje u sistemu. Plugin WP Rocket, u delu koda koji se stara o njegovoj vezi sa Cloudflare-om, na jednom mestu očekuje da taj podatak bude tekst, a sada dobija broj. Rezultat je greška koja obara ceo sajt, i to toliko rano da se ni admin panel ne otvara.

Ovo se dešava isključivo kada su ispunjena oba uslova, WordPress 7.1 i aktivan WP Rocket. Testirali smo i najnoviju verziju plugina, i problem je i dalje tu, WP Rocket još uvek nije objavio zvaničnu ispravku.

Prva pomoć, ako je sajt već pao

Preko FTP-a ili File Manager-a u hosting panelu, otvorite wp-content/plugins/ i preimenujte folder wp-rocket, na primer u wp-rocket-off. WordPress automatski isključi plugin kad mu se promeni ime foldera, i sajt će odmah ponovo raditi. Keširanje iz WP Rocketa neće raditi dok ne primenite rešenje ispod, ali sajt je dostupan i to je prioritet.

Trajno rešenje

Postoje dve opcije, i obe rade:

Opcija A: Ostavite WP Rocket ugašen

Ako vam keširanje iz WP Rocketa nije ključno (na primer, ako imate keširanje na nivou hostinga ili preko Cloudflare-a), možete jednostavno ostaviti plugin isključen dok WP Rocket ne izbaci svoju zvaničnu popravku.

Opcija B: Primenite ispravku i vratite WP Rocket

Ispravka je jedna linija koda u fajlu plugina:

// Fajl: wp-content/plugins/wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.php
// Staro:
if ( substr( $key, - strlen( $method ) ) !== $method ) {

// Novo:
if ( substr( (string) $key, - strlen( $method ) ) !== $method ) {

Problem je što se ova izmena obriše svaki put kad se WP Rocket ažurira. Zato smo pripremili gotov dodatak koji sam brine o ovome, jednom ga postavite i on sam primeni ispravku i posle svakog narednog ažuriranja plugina, dok zvanično rešenje ne stigne:

<?php
/**
 * Plugin Name: WP Rocket, popravka za WordPress 7.1
 * Description: Sam popravlja gresku koja obara sajt kada je WordPress azuriran na 7.1 a instaliran je WP Rocket.
 * Version: 1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_action( 'admin_init', 'sm_wp71_wprocket_patch' );
add_action( 'upgrader_process_complete', 'sm_wp71_wprocket_patch' );

function sm_wp71_wprocket_patch() {
    $file = WP_PLUGIN_DIR . '/wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.php';

    if ( ! file_exists( $file ) || ! is_readable( $file ) || ! is_writable( $file ) ) {
        return;
    }

    $contents = file_get_contents( $file );

    if ( false === $contents || strpos( $contents, '(string) $key' ) !== false ) {
        return;
    }

    $patched = preg_replace( '/substr(s*$keys*,/', 'substr( (string) $key,', $contents );

    if ( null === $patched || $patched === $contents ) {
        return;
    }

    @copy( $file, $file . '.bak-' . gmdate( 'Ymd-His' ) );
    file_put_contents( $file, $patched );
}

Kako da ga postavite, dve mogućnosti:

  • Sačuvajte kod kao fajl (npr. wp-rocket-wp71-fix.php) i preko FTP-a ga ubacite u wp-content/mu-plugins/ (napravite folder ako ne postoji). Ovi fajlovi rade automatski, bez aktiviranja.
  • Ili ga dodajte kao snippet preko plugina za to (WPCode, Code Snippets), podešen da se izvršava na admin_init.

Kad je popravka na mestu, WP Rocket možete slobodno vratiti (preimenujte folder nazad u wp-rocket), sajt ostaje ispravan i pored toga što je WordPress ažuriran.

Pitanja koja nam klijenti najčešće postave

Znači li ovo da je WordPress nebezbedan?
Ne, ovo nije bezbednosni propust, nego sukob u kodu između dva odvojena sistema koja obično dobro rade zajedno. Dešava se povremeno kad izađe veće ažuriranje, i uglavnom se brzo reši.

Da li treba da prestanem da ažuriram WordPress dok se ovo ne reši?
Ne preporučujemo to. Odlaganje ažuriranja ostavlja sajt izložen drugim, ozbiljnijim problemima. Bolje je primeniti ovu malu popravku i nastaviti normalno da ažurirate.

Šta ako ne znam kako da uđem preko FTP-a ili da menjam fajlove?
Nema potrebe da se time bavite sami. Ako smo vam mi hosting ili održavanje sajta, ovo rešavamo mi, samo nam javite da vam se to desilo ili da hoćete da preventivno primenimo popravku pre nego što ažuriramo WordPress.

Često postavljana pitanja

Znači li ovo da je WordPress nebezbedan?
Ne, ovo nije bezbednosni propust, već sukob u kodu između dva sistema. Dešava se povremeno i obično se brzo reši.
Da li treba da prestanem da ažuriram WordPress dok se ovo ne reši?
Ne preporučujemo to, jer odlaganje ažuriranja može ostaviti sajt izloženim ozbiljnijim problemima.
Šta ako ne znam kako da uđem preko FTP-a ili da menjam fajlove?
Nema potrebe da se time bavite sami. Ako koristite naš hosting, možemo vam pomoći da rešite problem.
Kako mogu brzo da popravim svoj sajt?
Preimenujte folder WP Rocket preko FTP-a ili File Manager-a u hosting panelu kako biste isključili plugin.
Da li postoji trajno rešenje za ovaj problem?
Da, možete primeniti kod ispravke koji automatski rešava grešku prilikom ažuriranja WP Rocketa.