Tworzenie własnych hooków
Jak dodawać własne do_action() i apply_filters(), aby Twoja wtyczka lub motyw były rozszerzalne.
Własne hooki sprawiają, że Twój kod staje się rozszerzalny — inne wtyczki i motywy mogą go modyfikować bez ingerencji w pliki.
Akcja: do_action()
Dodajesz punkt, w którym inni mogą wykonać własny kod:
function wpdocs_wyslij_zamowienie( $zamowienie ) {
// przetwarzanie zamówienia...
// powiadom inne wtyczki — przekaż obiekt zamówienia
do_action( 'wpdocs_po_zamowieniu', $zamowienie );
}
Konsument:
add_action( 'wpdocs_po_zamowieniu', 'zapisz_do_crm', 10, 1 );
function zapisz_do_crm( $zamowienie ) {
// zarejestruj zamówienie w zewnętrznym CRM
}
Filtr: apply_filters()
Umożliwiasz innym modyfikację wartości:
$cena = apply_filters( 'wpdocs_cena_zamowienia', $cena, $zamowienie );
Konsument:
add_filter( 'wpdocs_cena_zamowienia', 'dodaj_znizke', 10, 2 );
function dodaj_znizke( $cena, $zamowienie ) {
if ( 'VIP' === $zamowienie['typ_klienta'] ) {
return $cena * 0.9;
}
return $cena;
}
Warianty z tablicą argumentów
Gdy argumentów jest wiele lub chcesz uniknąć błędu z kolejnością:
do_action_ref_array( 'wpdocs_po_zamowieniu', array( $zamowienie, $klient ) );
$wynik = apply_filters_ref_array( 'wpdocs_dane', array( $dane, $kontekst ) );
Dokumentowanie hooków
Konwencja WordPressa wymaga bloku docblock nad do_action / apply_filters — tak dokumentujesz argumenty i wersję:
/**
* Odpala się po utworzeniu zamówienia.
*
* @since 1.2.0
*
* @param array $zamowienie Dane zamówienia.
* @param int $klient_id ID klienta.
*/
do_action( 'wpdocs_po_zamowieniu', $zamowienie, $klient_id );
Dzięki temu narzędzia takie jak wp-hooks generator wygenerują z Twojego kodu dokumentację w formacie JSON — tak jak ta witryna dla rdzenia WordPressa.
Dobre praktyki
- Prefiksuj nazwy (
wpdocs_, niepo_zamowieniu) — unikniesz kolizji z rdzeniem i innymi wtyczkami. - Udostępniaj kontekst — przekazuj obiekty, z których konsument wyciągnie, co potrzebuje.
- Utrzymuj stabilność — zmiana nazwy hooka lub argumentów psuje kompatybilność wsteczną.
- Dokumentuj argumenty w docblocku — bez tego nikt nie będzie wiedział, co odbiera callback.
- Zastanów się nad wariantami dynamicznymi (
wpdocs_zamowienie_{$status}), gdy hook ma dotyczyć konkretnych przypadków.