Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)

Jeszcze przed godziną 6 dostałem pierwsze zgłoszenia od niektórych klientów, że przy próbie edycji istniejącego produktu lub próbie dodania nowego w sklepie na WooCommerce WordPress wyrzuca błąd krytyczny. Z tego, co wodzę, na związanych z WordPressem i/lub WooCommerce grupach również zaczynają się pojawiać posty na ten temat. I choć jeszcze odpowiedniej poprawki nie ma, to na szczęście błąd da się relatywnie łatwo wyeliminować.

Błąd krytyczny w sklepie na WooCommerce przy próbie edycji produktu

Problem dotyczy najnowszych tłumaczeń dla języka polskiego dla wtyczki WooCommerce, które – co dodatkowo zwiększa skalę problemu – WordPress instaluje właściwie automatycznie, a więc dotkniętych stron może być sporo. Choć jeśli problem w tłumaczeniach zostanie naprawiony niebawem, to może wielu właścicieli sklepów nawet go nie zauważy, bo dotyczy on tylko sytuacji, gdy chcemy wejść w ekran edycji produktu (istniejącego lub nowego). Wtedy pojawia się błąd w stylu:

Fatal error: Uncaught ValueError: Unknown format specifier „Z” in D:\VM\Local\woocommerce-dev\app\public\wp-content\plugins\woocommerce\includes\admin\class-wc-admin-post-types.php on line 128

W witrynie wystąpił błąd krytyczny. W wiadomości wysłanej na adres e-mail administratora strony umieszczono dodatkowe instrukcje.

I choć to jest trochę rozszerzona wersja błędu, to i tak niewiele mówi. Przynajmniej do momentu, aż nie zerkniemy do wskazanego pliku i linijki 128:

1 => sprintf( __( 'Product updated. <a href="%s">View Product</a>', 'woocommerce' ), esc_url( get_permalink( $post->ID ) ) ),

Odrobinę więcej pokazuje tryb debugowania WordPressa:

[20-Jan-2023 03:52:16 UTC] PHP Fatal error: Uncaught ValueError: Unknown format specifier "Z" in D:\VM\Local\sklep\app\public\wp-content\plugins\woocommerce\includes\admin\class-wc-admin-post-types.php:128
Stack trace:
#0 D:\VM\Local\sklep\app\public\wp-content\plugins\woocommerce\includes\admin\class-wc-admin-post-types.php(128): sprintf('Produkt zaktual...', '<a id="woocomme...', '</a>')

Wygląda, jak wygląda, ale naprowadza na plik z tłumaczenia, gdzie faktycznie widać, że jest błąd:

Angielski oryginał to:

Product updated. %1$sView Product%2$s

Obecne, błędne tłumaczenie:

Produkt zaktualizowany. %1$Zobacz produkt%2$s

A powinno być:

Produkt zaktualizowany. %1$sZobacz produkt%2$s

Jak widać różnica niewielka, właściwie pomijalna – brak „s” po pierwszym znaku dolara – a takie problemy. Ale tylko w wersji PHP 8+, bo np. w PHP 7.4 edycja produktu działa.

Tymczasowe rozwiązanie problemu

Najlepsze rozwiązanie to oczywiście aktualizacja tłumaczenia serwowanego przez WordPressa, ale obecnie na nie jeszcze czekamy. Można samodzielnie zmienić tłumaczenie, można nawet tymczasowo wspomniany plik PHP (class-wc-admin-post-types.php).

Można też tymczasowo cofnąć wersję PHP na serwerze (hostingu) do 7.4, gdzie nie ma tego problemu,  ale chyba najlepszym i najprostszym rozwiązaniem, jest tymczasowa zmiana języka profilu użytkownika (nie całej strony, ale tylko danego użytkownika) na inny niż polski, np. na angielski. Zwłaszcza że jest to rozwiązanie, które może wdrożyć właściwie każdy, nawet bez pomocy „specjalisty informatyka”.

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)