Własne Pola (Custom Fields), technicznie znane jako Post Meta, to funkcja, która zmienia WordPressa z prostej platformy blogowej w potężny System Zarządzania Treścią (CMS). Pozwalają one przypisać do wpisu dowolne dodatkowe informację, takie jak “Ocena filmu”, “Cena produktu”, “Data wydarzenia” czy “ID powiązanego wideo”.
W tym kompleksowym przewodniku dla developerów (2026 Edition) nie tylko nauczymy się wyświetlać pola. Zrozumiemy architekturę Metadata API, nauczymy się pisać wydajne zapytania i dowiemy się, kiedy nie używać własnych pól.

1. Jak działa Metadata API (CRUD)
WordPress oferuje zestaw funkcji do zarządzania metadanymi, znany jako CRUD (Create, Read, Update, Delete).
Pobieranie wartości pola przez get_post_meta()
To najczęściej używana funkcja.
// Składnia
$wartosc = get_post_meta( $post_id, $klucz, $single );- $post_id: ID wpisu (użyj
get_the_ID()w pętli). - $klucz: Nazwa pola w bazie danych (np. ‘cena_produktu’).
- $single:
true: Zwraca pojedynczą wartość (string/int).false(domyślnie): Zwraca tablicę wartości. To częsta pułapka!
Przykład:
$cena = get_post_meta( get_the_ID(), 'cena_produktu', true );
if ( $cena ) {
echo 'Cena: ' . esc_html( $cena ) . ' PLN';
}Zapisywanie i aktualizacja pola przez update_post_meta()
Ta funkcja jest sprytna: jeśli pole nie istnieje, tworzy je. Jeśli istnieje, aktualizuje je.
update_post_meta( $post_id, 'cena_produktu', '99.00' );Jeśli przechowujesz tablicę, WordPress automatycznie ją zserializuje:
$dane = ['kolor' => 'czerwony', 'rozmiar' => 'XL'];
update_post_meta( $post_id, 'warianty', $dane );
// W bazie zapisze się jako: a:2:{s:5:"kolor";s:8:"czerwony"...}Usuwanie pola przez delete_post_meta()
delete_post_meta( $post_id, 'cena_produktu' );2. Tablice i serializacja w post meta a wydajność
Domyślnie get_post_meta() z parametrem $single = false zwraca tablicę tablic, co jest nieintuicyjne.
Jeśli masz pole “kolor” z wartością “niebieski”:
$val = get_post_meta( $id, 'kolor', false );
// Zwróci: Array ( [0] => "niebieski" )Dlatego w 99% przypadków używamy $single = true.
Czy można wyszukiwać po zserializowanych polach meta
WordPress automatycznie serializuje tablice i obiekty PHP w bazie danych. To wygodne, ALE: Nie możesz efektywnie wyszukiwać ani sortować po zserializowanych danych w SQL.
Jeśli zapiszesz dane jako ['wiek' => 25, 'miasto' => 'Warszawa'] w jednym polu meta, zapytanie SQL wyszukujące “osoby z Warszawy” będzie musiało użyć powolnego LIKE %Warszawa%, co przy dużej bazie zabije wydajność.
Złota zasada: Jeśli musisz po czymś wyszukiwać lub sortować (ORDER BY), zapisz to w osobnym polu meta, a nie w tablicy.
3. Meta query: Jak wyszukiwać wpisy po polach?
Prawdziwa moc objawia się w WP_Query. Możesz pobierać wpisy na podstawie wartości ich pól.
Jak pobrać produkty droższe niż 100 zł przez meta_query
$args = [
'post_type' => 'produkt',
'meta_query' => [
[
'key' => 'cena',
'value' => 100,
'compare' => '>',
'type' => 'NUMERIC' // Ważne dla poprawnego sortowania liczb!
]
]
];
$query = new WP_Query( $args );Jak połączyć kilka warunków w meta_query
$args = [
'post_type' => 'produkt',
'meta_query' => [
'relation' => 'AND', // lub 'OR'
[
'key' => 'cena',
'value' => 100,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'kolor',
'value' => 'czerwony'
]
]
];Ostrzeżenie o wydajności: Zapytania meta_query generują JOIN do tabeli wp_postmeta. Każde dodatkowe kryterium to kolejny JOIN. Przy milionach wpisów to może być bardzo wolne. Jeśli twoja strona muli, sprawdź czy nie nadużywasz meta_query. W takich przypadkach warto rozważyć własne tabele w bazie danych.
4. Jak wyświetlić wartość pola w ACF i w czystym PHP
Wtyczka Advanced Custom Fields (ACF) jest standardem w branży. Ułatwia tworzenie UI dla pól w panelu admina.
Wyświetlanie pola przez ACF i get_field()
$cena = get_field('cena'); // Automatycznie robi get_post_metaWłasne pola bez wtyczki w czystym PHP
Jeśli nie chcesz zależności od wtyczki, możesz stworzyć metabox ręcznie używając add_meta_box(), ale to wymaga sporo kodu (HTML formularza, nonce, zapisywanie save_post).
W 2026 roku często hybrydowym podejściem jest używanie ACF do tworzenia pól (UI), ale pobieranie ich przez get_post_meta() w kodzie, jeśli zależy nam na “czystości” i ominięciu narzutu API ACF w prostych przypadkach.
5. Jak działają ukryte pola meta (underscore)
Czy zauważyłeś, że niektóre pola nie pokazują się na liście “Własne pola” w edytorze wpisu? Dzieje się tak, gdy nazwa klucza zaczyna się od podkreślnika _.
cena-> Widoczne dla użytkownika w standardowym UI._cena-> Ukryte (Chronione).
Wtyczki takie jak Yoast SEO czy WooCommerce używają _ (np. _yoast_wpseo_title), aby użytkownik nie popsuł tych danych ręcznie. Jako developer też powinieneś używać tej konwencji dla danych systemowych.
6. Jak zabezpieczyć własne pola przez sanityzację i escaping
To najważniejsza sekcja. Nigdy nie ufaj danym, nawet z bazy.
Sanityzacja pól przy zapisie
Zanim wrzucisz dane do bazy (update_post_meta), oczyść je.
$nowa_cena = sanitize_text_field( $_POST['cena'] );
update_post_meta( $post_id, 'cena', $nowa_cena );Inne przydatne funkcje: sanitize_email(), absint() (dla liczb całkowitych).
Escaping pól przy wyświetlaniu
Zanim wyślesz dane do przeglądarki (echo), upewnij się, że nie zawierają złośliwego JS (XSS).
// ŹLE
echo get_post_meta($id, 'url', true);
// DOBRZE
echo esc_url( get_post_meta($id, 'url', true) );
// TEKST
echo esc_html( get_post_meta($id, 'miasto', true) );
// ATRYBUTY HTML
echo '<div class="' . esc_attr( $klasa ) . '">';7. Jak używać własnych pól w Gutenbergie (FSE)
W 2026 roku, kiedy używamy Block Editora (Gutenberg), pojawia się pytanie: Gdzie trzymać dane? W atrybutach bloku czy w post meta?
- Atrybuty bloku: Zapisywane w treści wpisu (HTML). Szybkie do odczytu przy renderowaniu, ale niemożliwe do zapytania w SQL (nie zrobisz “pokaż wpisy z blokiem, który ma kolor czerwony”).
- Post Meta: Zapisywane w tabeli
wp_postmeta. Wolniejsze (wymaga osobnego zapytania), ale pozwala na filtrowanie i sortowanie (np. w archiwach).
Dobra praktyka: Jeśli dane dotyczą wyglądu konkretnego elementu na stronie -> Atrybut Bloku. Jeśli dane opisują cały wpis i chcesz po nich filtrować -> Post Meta.
Możesz też łączyć obie metody: Blok Gutenberga może zapisywać swoje atrybuty do Post Meta, aby były dostępne dla WP_Query.
Co zapamiętać o własnych polach w WordPressie
Funkcja get_post_meta() to tylko wierzchołek góry lodowej. Aby być świadomym developerem WordPressa w 2026:
- Zrozum różnicę między
$single=trueafalse. - Unikaj serializacji danych, po których musisz wyszukiwać.
- Uważaj na wydajność
meta_query(indeksy w bazie). - Zawsze (ZAWSZE) używaj escaping functions (
esc_html,esc_url). - Wybieraj mądrze między atrybutami bloków a polami meta.







