Gdy skrypt motywu lub wtyczki nie widzi danych z PHP, przyczyną może być uchwyt, warunek ładowania albo rozbieżna nazwa obiektu. Dobór funkcji zależy od rodzaju danych, a żądania AJAX wymagają dodatkowo kontroli nonce, parametrów i uprawnień.
Krótka odpowiedź
`wp_localize_script()` tworzy obiekt JavaScript z tablicy PHP dla wcześniej zarejestrowanego skryptu i służy przede wszystkim do lokalizowanych tekstów. Ogólną konfigurację, taką jak URL AJAX i nonce, przekazuj przez `wp_add_inline_script()`.
Nonce nie zastępuje walidacji danych ani kontroli uprawnień do konkretnego wpisu.
Usługi KC Mobile
Potrzebujesz pomocy w tym temacie?
Czytasz poradnik „WordPress wp_localize_script - jak przekazać dane do JavaScriptu”. Napisz, co chcesz zrobić i na jakim etapie jesteś. Ustalimy, czy możemy pomóc i jaki zakres prac będzie potrzebny.
Do czego służy wp_localize_script?
`wp_localize_script()` tworzy obiekt JavaScript z danych PHP i przypisuje go do zarejestrowanego skryptu. Funkcja zwraca `true`, gdy lokalizacja się powiedzie, albo `false`, gdy się nie powiedzie; `undefined` może natomiast oznaczać, że kod JavaScript odwołuje się do obiektu, którego nie wypisano lub używa innej nazwy.
Podstawowym zastosowaniem funkcji są tłumaczone teksty interfejsu, takie jak komunikaty walidacji czy etykiety. Pobieraj je przez funkcje tłumaczeń WordPressa z domeną motywu lub wtyczki.
Do ogólnej konfiguracji, na przykład adresu endpointu albo ustawień widoku, użyj `wp_add_inline_script()`. Nazwa obiektu lokalizowanego powinna być unikalna, poprawnym identyfikatorem JavaScript i bez dywizu, na przykład `kcNoticeText`.
Czytasz poradnik „WordPress wp_localize_script - jak przekazać dane do JavaScriptu”. Napisz, co chcesz zrobić i na jakim etapie jesteś. Ustalimy, czy możemy pomóc i jaki zakres prac będzie potrzebny. Omów temat tego poradnika
Jak poprawnie zarejestrować i załadować skrypt?
Najpierw zarejestruj skrypt, dodaj go do kolejki, a następnie wywołaj `wp_localize_script()` z tym samym uchwytem. Dokumentacja WordPressa potwierdza, że funkcja lokalizująca działa tylko dla wcześniej zarejestrowanego skryptu.
add_action( 'wp_enqueue_scripts', 'kc_enqueue_notice_assets' );
function kc_enqueue_notice_assets() {
$handle = 'kc-notice';
wp_register_script(
$handle,
get_stylesheet_directory_uri() . '/assets/js/notice.js',
array(),
'1.0.0',
true
);
wp_enqueue_script( $handle );
wp_localize_script(
$handle,
'kcNoticeText',
array(
'saved' => __( 'Zmiany zapisane', 'kc-theme' ),
)
);
}`wp_register_script()` definiuje plik i zależności, a `wp_enqueue_script()` dodaje go do kolejki. Można też użyć samego `wp_enqueue_script()` z adresem pliku, ponieważ ta funkcja może zarejestrować i zakolejkować skrypt w jednym wywołaniu.
Uchwyt przekazany do lokalizacji musi odpowiadać uchwytowi skryptu. Zasoby frontendu zwykle dodajemy w `wp_enqueue_scripts`, a zasoby panelu administracyjnego w `admin_enqueue_scripts`. Skrypt ładowany w stopce wymaga, by motyw wywoływał `wp_footer()`.
Jaki jest minimalny przykład wp_localize_script?
Minimalny przykład PHP rejestruje i ładuje plik, a następnie tworzy obiekt, którego nazwy używa JavaScript. W motywie potomnym umieść callback w `functions.php`, a wtyczce przypisz własny adres pliku przez `plugins_url()`.
add_action( 'wp_enqueue_scripts', 'kc_enqueue_notice_script' );
function kc_enqueue_notice_script() {
$handle = 'kc-notice';
wp_enqueue_script(
$handle,
get_stylesheet_directory_uri() . '/assets/js/notice.js',
array(),
'1.0.0',
true
);
wp_localize_script(
$handle,
'kcNoticeText',
array(
'saved' => __( 'Zmiany zapisane', 'kc-theme' ),
)
);
}const notice = document.querySelector('[data-save-notice]');
if (notice && window.kcNoticeText) {
notice.textContent = window.kcNoticeText.saved;
}PHP tworzy obiekt `kcNoticeText`, a JavaScript odczytuje go pod tą samą nazwą. Przetestuj zmianę na kopii witryny; konfiguracja Local WP pozwala sprawdzić motyw lub wtyczkę przed wdrożeniem. Jeśli prace obejmują rozwój motywu albo funkcji witryny, strony firmowe oparte na WordPressie mogą być właściwym zakresem wsparcia.
Jak przekazywać nonce, adres AJAX i teksty?
Przekazuj adres AJAX i nonce jako konfigurację przez `wp_add_inline_script()`, a tłumaczone komunikaty przez `wp_localize_script()`. Nonce to wartość WordPressa używana do weryfikacji żądania; nie przyznaje użytkownikowi uprawnienia do edycji wpisu.
add_action( 'wp_enqueue_scripts', 'kc_enqueue_save_script' );
function kc_enqueue_save_script() {
$handle = 'kc-save';
wp_enqueue_script(
$handle,
plugins_url( 'assets/js/save.js', __FILE__ ),
array(),
'1.0.0',
true
);
$config = array(
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'kc_save_item' ),
);
wp_add_inline_script(
$handle,
'window.kcSaveConfig = ' . wp_json_encode( $config ) . ';',
'before'
);
wp_localize_script(
$handle,
'kcSaveText',
array(
'error' => __( 'Nie udało się zapisać zmian', 'kc-plugin' ),
)
);
}
add_action( 'wp_ajax_kc_save_item', 'kc_save_item' );
function kc_save_item() {
check_ajax_referer( 'kc_save_item', 'nonce' );
$item_id = isset( $_POST['item_id'] )
? absint( wp_unslash( $_POST['item_id'] ) )
: 0;
if ( ! $item_id || ! get_post( $item_id ) ) {
wp_send_json_error( array( 'message' => 'Nieprawidłowy identyfikator' ), 400 );
}
if ( ! current_user_can( 'edit_post', $item_id ) ) {
wp_send_json_error( array( 'message' => 'Brak uprawnień do edycji wpisu' ), 403 );
}
// W tym miejscu dodaj walidację wartości i właściwy zapis pola.
wp_send_json_success( array( 'itemId' => $item_id ) );
}Identyfikator wpisu jest najpierw oczyszczany i sprawdzany pod kątem istnienia, a dopiero potem WordPress sprawdza uprawnienie obiektowe `edit_post` dla tego rekordu. Kontrola `current_user_can( 'edit_posts' )` sprawdzałaby ogólną zdolność edycji wpisów, nie dostęp do wskazanego obiektu.
Powyższy callback nie zapisuje pola, ponieważ trzeba dopasować operację do konkretnego typu danych i wymagań wtyczki. Przykład żądania musi przekazać identyfikator i nonce:
fetch(window.kcSaveConfig.ajaxUrl, {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
body: new URLSearchParams({
action: 'kc_save_item',
nonce: window.kcSaveConfig.nonce,
item_id: '123'
})
});`check_ajax_referer()` weryfikuje nonce, ale nie zastępuje sprawdzenia uprawnień ani walidacji treści. Nie przekazuj sekretów API do przeglądarki, ponieważ odwiedzający może odczytać wartości wysłane w HTML i JavaScript.
Kiedy lepsze jest wp_add_inline_script?
`wp_add_inline_script()` lepiej pasuje do ogólnej konfiguracji JavaScript, a `wp_localize_script()` do tłumaczonych tekstów. Funkcja inline dołącza kod przed wskazanym skryptem (`before`) albo po nim (`after`).
| Metoda | Rodzaj danych | Warunek | Typowe zastosowanie |
|---|---|---|---|
| `wp_localize_script()` | Teksty do tłumaczenia | Skrypt musi być zarejestrowany | Etykiety i komunikaty |
| `wp_add_inline_script()` | Konfiguracja w formie kodu | Skrypt musi być dodany do kolejki | URL endpointu i nonce |
| Atrybuty `data-*` | Dane pojedynczego elementu | Element musi istnieć w DOM | ID wpisu lub ustawienie komponentu |
$config = array(
'endpoint' => rest_url( 'kc/v1/search' ),
'limit' => 8,
);
wp_add_inline_script(
'kc-search',
'window.kcSearchConfig = ' . wp_json_encode( $config ) . ';',
'before'
);Kod zadziała, jeśli `kc-search` został wcześniej zarejestrowany i dodany do kolejki. Atrybuty `data-*` są wygodne dla ustawienia przypisanego do jednego elementu, lecz nie umieszczaj w nich haseł ani prywatnych kluczy.
Jak bezpiecznie przekazywać wartości z PHP?
Wartości wysłane do przeglądarki są dostępne dla użytkownika, więc przekazuj tylko dane potrzebne na danym widoku. Nie wysyłaj haseł, prywatnych kluczy API ani informacji, których odbiorca nie powinien zobaczyć.
Waliduj format i zakres danych wejściowych przed użyciem ich w operacji. Przy wypisywaniu do HTML dobieraj escaping do kontekstu, na przykład `esc_attr()` dla atrybutu i `esc_html()` dla treści, a tablice konfiguracji koduj przez `wp_json_encode()`.
Endpoint zmieniający dane powinien sprawdzać nonce, uprawnienie użytkownika do konkretnego obiektu i poprawność parametrów. Nonce ogranicza ryzyko sfałszowania żądania, ale nie jest mechanizmem autoryzacji.
Dlaczego obiekt z wp_localize_script nie pojawia się na stronie?
Brak obiektu JavaScript zwykle oznacza, że WordPress nie wypisał lokalizacji albo kod odwołuje się do innej nazwy. W narzędziach deweloperskich wyszukaj nazwę obiektu w panelu Elements, sprawdź `typeof window.kcNoticeText` w Console i potwierdź odpowiedź 200 dla pliku w Network.
| Objaw | Prawdopodobna przyczyna | Pierwszy test |
|---|---|---|
| `kcNoticeText is not defined` | Obiektu nie wypisano lub użyto innej nazwy | Wyszukaj nazwę w HTML i porównaj wielkość liter |
| Obiekt działa tylko na części stron | Warunek enqueue pomija widok | Sprawdź `wp_enqueue_scripts` i warunki strony |
| Brak konfiguracji inline | Skrypt nie jest w kolejce lub uchwyt się różni | Porównaj uchwyty enqueue i inline |
| AJAX zwraca `-1` lub 403 | Błędny nonce albo brak uprawnień | Sprawdź payload Network i callback PHP |
| Po wdrożeniu pojawia się stara wartość | Cache przechowuje starszy HTML lub JS | Wyczyść cache i sprawdź wersję assetu |
| Brakuje skryptu w stopce | Motyw nie wywołuje `wp_footer()` | Sprawdź szablon stopki i hooki |
Tabela wskazuje kolejność pierwszej diagnostyki: od nazwy obiektu i kolejki skryptów do cache oraz callbacku AJAX. Funkcja `wp_localize_script()` zwraca `true` lub `false`, nie wartość `undefined`; dokumentacja WordPressa potwierdza też wymóg wcześniejszej rejestracji skryptu.
Jeśli problem występuje wyłącznie na środowisku lokalnym, porównaj warunki ładowania i konfigurację hosta. Przygotowanie testowego środowiska opisuje poradnik o WordPress localhost, Local i wp-env.
Jak uniknąć konfliktów i utrzymać kod?
Używaj unikalnych prefiksów zarówno dla uchwytów skryptów, jak i obiektów JavaScript, na przykład `kc-save` i `kcSaveConfig`. Unikaj ogólnych nazw typu `data`, które łatwo kolidują z kodem innych wtyczek.
Zbuduj jeden obiekt konfiguracji zamiast wielokrotnie lokalizować ten sam uchwyt i nazwę. Przy wielu komponentach przypisz ustawienia do właściwych elementów DOM albo utwórz nazwane obiekty dla odrębnych skryptów.
Po zmianie WordPressa, motywu lub wtyczki sprawdź docelowy widok, obiekt w konsoli, odpowiedź endpointu i uprawnienia do edytowanego wpisu. Jeśli błąd dotyczy działającego motywu lub wtyczki, wsparcie przy stronach WordPress może obejmować diagnostykę i naprawę.
Perspektywa KC Mobile
Z naszych wdrożeń wynika, że błąd `undefined` często wiąże się z różnicą między uchwytem użytym przy enqueue a tym przekazanym do lokalizacji albo z warunkiem, który ładuje plik tylko na wybranych widokach. Dlatego diagnozujemy konkretny HTML, kolejkę WordPressa i callback PHP, zamiast zakładać, że sam plik na serwerze jest już dostępny w przeglądarce.
Jeśli potrzebujesz wykonawcy do pracy nad motywem lub funkcją, rozwój stron firmowych w WordPressie obejmuje wdrożenia i poprawki dopasowane do działania witryny.
Więcej poradników w tym temacie
Wspomniane narzędzia
Najczęściej zadawane pytania
Jak sprawdzić, czy WordPress wypisał obiekt JavaScript?
Dlaczego obiekt JavaScript z wp_localize_script nie pojawia się na stronie?
Czy wp_localize_script służy tylko do tłumaczeń?
Jak przekazać nonce do JavaScriptu w WordPressie?
Czy current_user_can( 'edit_posts' ) wystarcza do edycji wskazanego wpisu?
Potrzebujesz pomocy w tym temacie?
Czytasz poradnik „WordPress wp_localize_script - jak przekazać dane do JavaScriptu”. Napisz, co chcesz zrobić i na jakim etapie jesteś. Ustalimy, czy możemy pomóc i jaki zakres prac będzie potrzebny.
