Advanced Custom Fields (ACF) w WordPressie — poradnik z przykładami kodu
Jak używać Advanced Custom Fields w WordPressie: tworzenie grup pól, wyświetlanie get_field() w motywie, repeater, zapytania po polach i różnice ACF a SCF.

W skrócie
- ACF dodaje do edytora WordPressa własne pola (tekst, liczba, data, obraz, relacja itp.), a ich wartości zapisuje w tabeli wp_postmeta.
- Grupę pól tworzysz w ACF → Grupy pól i przypisujesz regułami lokalizacji, np. do typu wpisu „Wydarzenie”.
- W motywie wartości odczytujesz funkcją get_field() i zawsze escapujesz przy wyświetlaniu (esc_html, esc_url).
- Repeater, Flexible Content, Gallery, strony opcji i bloki ACF wymagają wersji ACF PRO.
- Od 2024 r. istnieje fork Secure Custom Fields (SCF) — przy instalacji sprawdź, którą wtyczkę wybierasz; API get_field() jest w obu takie samo.
Spis treści
Advanced Custom Fields (ACF) to wtyczka do WordPressa, która pozwala dodać do edytora własne pola — np. cenę, datę wydarzenia, adres, galerię czy powiązane wpisy — i wyświetlić je w motywie jedną funkcją PHP get_field(). Dzięki temu redaktor wypełnia uporządkowany formularz, zamiast wpisywać wszystko w treść, a programista dostaje dane w przewidywalnej strukturze.
W tym poradniku przejdziemy przez cały proces na przykładzie strony z wydarzeniami: od instalacji, przez tworzenie grupy pól, po wyświetlanie wartości w szablonie, pola powtarzalne i filtrowanie wpisów po polach.
Czym są pola niestandardowe i do czego służy ACF
WordPress od zawsze pozwala zapisywać przy wpisie dodatkowe dane w tabeli wp_postmeta (para klucz–wartość). Natywny panel „Własne pola” jest jednak surowy: każdą wartość wpisujesz ręcznie jako tekst, bez walidacji, list wyboru czy wyboru obrazka z biblioteki.
ACF nakłada na ten mechanizm wygodny interfejs. Typowe zastosowania:
- katalogi i oferty — nieruchomości (metraż, liczba pokoi, cena), samochody, produkty bez sklepu,
- wydarzenia — data, godzina, miejsce, link do biletów,
- zespół i referencje — stanowisko, zdjęcie, profil LinkedIn,
- strony firmowe — edytowalne sekcje strony głównej, dane kontaktowe w ustawieniach motywu,
- headless WordPress — uporządkowane dane wystawiane przez REST API lub GraphQL do aplikacji frontendowej (więcej w artykule WordPress jako headless CMS).
ACF, ACF PRO i Secure Custom Fields — którą wtyczkę zainstalować
Od października 2024 roku sytuacja jest mniej oczywista niż kiedyś. W trakcie sporu między Automattic a WP Engine (właścicielem ACF) zespół WordPress.org utworzył fork o nazwie Secure Custom Fields (SCF). W efekcie istnieją dwie rozwijane niezależnie wtyczki o wspólnym rodowodzie:
| Wtyczka | Kto rozwija | Uwagi |
|---|---|---|
| ACF (darmowa) | WP Engine | Podstawowe typy pól, własne typy wpisów i taksonomie |
| ACF PRO (płatna) | WP Engine | Repeater, Flexible Content, Gallery, Clone, strony opcji, bloki ACF |
| Secure Custom Fields | WordPress.org | Fork ACF, zgodny z API get_field() |
Przy instalacji z katalogu wtyczek zwróć uwagę na nazwę autora. Kod motywu opisany w tym poradniku działa w każdej z tych wtyczek, ale nie instaluj dwóch naraz.
Krok 1: instalacja i rejestracja własnego typu wpisu
- W panelu przejdź do Wtyczki → Dodaj nową wtyczkę, wyszukaj
Advanced Custom Fields, zainstaluj i włącz (wersję PRO wgrywasz jako plik ZIP przez Wyślij wtyczkę na serwer). - W menu pojawi się pozycja ACF. Od wersji 6.1 możesz w niej zarejestrować własny typ wpisu bez kodu: ACF → Typy treści → Dodaj nowy.
- Utwórz typ „Wydarzenia” (liczba pojedyncza „Wydarzenie”, klucz
wydarzenie). Zaznacz, czy ma mieć archiwum i być widoczny w REST API.
Jeśli wolisz kod (np. w motywie potomnym lub wtyczce), odpowiednik wygląda tak:
add_action( 'init', function () {
register_post_type( 'wydarzenie', [
'label' => 'Wydarzenia',
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'menu_icon' => 'dashicons-calendar-alt',
'supports' => [ 'title', 'editor', 'thumbnail' ],
'rewrite' => [ 'slug' => 'wydarzenia' ],
] );
} );
Po dodaniu nowego typu wpisu wejdź w Ustawienia → Bezpośrednie odnośniki i kliknij Zapisz zmiany, żeby odświeżyć reguły adresów — inaczej podstrony wydarzeń zwrócą błąd 404.
Krok 2: tworzenie grupy pól
- Przejdź do ACF → Grupy pól → Dodaj nową.
- Nazwij grupę, np. „Dane wydarzenia”.
- Dodaj pola (dla każdego ustaw etykietę, nazwę i typ):
| Etykieta | Nazwa (klucz) | Typ pola | Ustawienia |
|---|---|---|---|
| Data wydarzenia | data_wydarzenia | Date Picker | Format zwracany: d.m.Y |
| Miejsce | miejsce | Text | Wymagane |
| Cena biletu (zł) | cena_biletu | Number | Minimum 0 |
| Link do biletów | link_bilety | URL | — |
| Plakat | plakat | Image | Format zwracany: Image ID |
- W sekcji Ustawienia → Reguły lokalizacji wybierz: Typ treści jest równy Wydarzenie.
- Opcjonalnie w ustawieniach grupy zaznacz Pokaż w REST API, jeśli dane mają być dostępne dla aplikacji zewnętrznych.
- Zapisz. Przy dodawaniu nowego wydarzenia pod edytorem pojawi się formularz z polami.

Wskazówka: Utwórz w katalogu motywu pusty folder
acf-json. ACF zacznie zapisywać tam definicje grup pól jako pliki JSON, które możesz trzymać w repozytorium Git i przenosić między środowiskiem testowym a produkcją bez ręcznego odtwarzania pól.
Krok 3: wyświetlanie pól w szablonie motywu
Pola odczytujesz w pliku szablonu, np. single-wydarzenie.php w motywie potomnym. Funkcja get_field() zwraca wartość, a o bezpieczne wyświetlenie dbasz sam:
<?php
$data = get_field( 'data_wydarzenia' );
$miejsce = get_field( 'miejsce' );
$cena = get_field( 'cena_biletu' );
$link = get_field( 'link_bilety' );
$plakat = get_field( 'plakat' ); // ID obrazka
?>
<div class="wydarzenie-meta">
<?php if ( $plakat ) : ?>
<?php echo wp_get_attachment_image( $plakat, 'large' ); ?>
<?php endif; ?>
<?php if ( $data ) : ?>
<p>Data: <?php echo esc_html( $data ); ?></p>
<?php endif; ?>
<?php if ( $miejsce ) : ?>
<p>Miejsce: <?php echo esc_html( $miejsce ); ?></p>
<?php endif; ?>
<?php if ( '' !== $cena && null !== $cena ) : ?>
<p>Cena: <?php echo esc_html( number_format_i18n( (float) $cena, 2 ) ); ?> zł</p>
<?php endif; ?>
<?php if ( $link ) : ?>
<a href="<?php echo esc_url( $link ); ?>">Kup bilet</a>
<?php endif; ?>
</div>
Kilka zasad, które oszczędzą Ci problemów:
- Sprawdzaj, czy pole ma wartość, zanim wyświetlisz etykietę — inaczej na stronie pojawią się puste „Miejsce:”.
the_field()wypisuje wartość od razu i w nowszych wersjach ACF filtruje niebezpieczny HTML, ale jawneesc_html()iesc_url()przyget_field()są czytelniejsze i bezpieczniejsze.- Pole z innego wpisu odczytasz, podając jego ID:
get_field( 'miejsce', 123 ). Dla użytkownika użyj'user_5', dla kategorii'category_7', dla strony opcji'option'.
Jeśli szablon nie wyświetla pól i nie wiesz dlaczego, włącz tryb debugowania WordPressa — literówka w nazwie pola nie generuje błędu, tylko zwraca null.
Pola powtarzalne i elastyczne (ACF PRO)
Pole Repeater pozwala dodać dowolną liczbę wierszy o tej samej strukturze — np. harmonogram wydarzenia z godziną i opisem punktu programu:
<?php if ( have_rows( 'harmonogram' ) ) : ?>
<ul class="harmonogram">
<?php while ( have_rows( 'harmonogram' ) ) : the_row(); ?>
<li>
<strong><?php echo esc_html( get_sub_field( 'godzina' ) ); ?></strong>
<?php echo esc_html( get_sub_field( 'punkt_programu' ) ); ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Flexible Content idzie krok dalej: redaktor składa stronę z gotowych układów (np. „tekst ze zdjęciem”, „galeria”, „cennik”), a każdy układ ma własny zestaw pól. To popularna metoda budowania stron firmowych bez kreatorów wizualnych. Alternatywą są bloki ACF — własne bloki edytora Gutenberg, których pola wypełnia się bezpośrednio w edytorze blokowym (o samym edytorze przeczytasz w poradniku Gutenberga).

Filtrowanie i sortowanie wpisów po polach ACF
Ponieważ ACF zapisuje wartości w wp_postmeta, możesz używać ich w WP_Query. Pole Date Picker zapisuje datę w bazie zawsze w formacie Ymd (np. 20261015), niezależnie od formatu wyświetlania. Lista nadchodzących wydarzeń, posortowana od najbliższego:
$wydarzenia = new WP_Query( [
'post_type' => 'wydarzenie',
'posts_per_page' => 10,
'meta_key' => 'data_wydarzenia',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => [
[
'key' => 'data_wydarzenia',
'value' => wp_date( 'Ymd' ),
'compare' => '>=',
],
],
] );
Pamiętaj, że zapytania po meta_query są wolniejsze niż po taksonomiach, bo kolumna meta_value nie jest dobrze indeksowana. Do kategoryzowania (np. „koncert”, „warsztat”) lepiej użyć taksonomii, a pól — do wartości indywidualnych, takich jak data czy cena.
Uwaga: Nie zmieniaj nazwy (klucza) pola, które ma już wypełnione dane. ACF zapisze nowe wartości pod nową nazwą, a stare pozostaną w bazie pod starą — szablon nagle przestanie je widzieć. Zmieniaj tylko etykietę albo przenieś dane skryptem.
Alternatywy dla ACF
- Natywny panel „Własne pola” — w edytorze blokowym włączysz go w menu ⋮ → Preferencje → Ogólne → Zaawansowane → Własne pola. Wystarczy do prostych, pojedynczych wartości.
register_post_meta()— rejestracja pól w kodzie z typem danych i widocznością w REST API, bez żadnej wtyczki.- Meta Box, Pods, Carbon Fields — inne frameworki pól. Pods dodatkowo zarządza typami treści i relacjami, Carbon Fields definiuje wszystko w kodzie PHP.
Jeśli dopiero zaczynasz z PHP i chcesz lepiej rozumieć kod szablonów, zajrzyj do wprowadzenia do PHP. A gdy dane z ACF mają trafić do aplikacji mobilnej lub frontendu w JavaScripcie, podstawy pracy z API znajdziesz w tekście REST API — jak zacząć.
Najczęściej zadawane pytania
Co to jest ACF w WordPressie?
Advanced Custom Fields to wtyczka, która pozwala dodawać do wpisów, stron, użytkowników czy kategorii własne pola formularza, np. cenę, datę wydarzenia albo galerię. Wartości pól wyświetlasz potem w motywie za pomocą funkcji PHP lub w kreatorach stron.
Czy ACF jest darmowy?
Podstawowa wersja ACF jest darmowa i zawiera kilkadziesiąt typów pól oraz rejestrowanie własnych typów wpisów. Płatna wersja ACF PRO dodaje m.in. pola Repeater, Flexible Content, Gallery, strony opcji i bloki ACF.
Czym różni się ACF od Secure Custom Fields?
Secure Custom Fields to fork ACF utworzony w 2024 roku przez zespół WordPress.org w trakcie sporu z firmą WP Engine, która rozwija ACF. Oba używają tego samego API, więc kod z get_field() działa w każdej z nich, ale wtyczki rozwijają się niezależnie.
Jak wyświetlić pole ACF w szablonie?
W pliku szablonu motywu użyj get_field('nazwa_pola') i wyświetl wynik z odpowiednim escapowaniem, np. echo esc_html( get_field('miejsce') ). Dla pola z innego wpisu podaj jego ID jako drugi argument.
Czy da się dodać własne pola bez wtyczki?
Tak. WordPress ma wbudowany panel Własne pola (włączasz go w preferencjach edytora) oraz funkcje register_post_meta() i add_meta_box(). ACF jest po prostu wygodniejszy, bo daje gotowe typy pól z walidacją i interfejsem.
Autor
Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.


