Katalog
Popularne hooki
102 najczęściej używanych hooków WordPressa — każdy z opisem i działającym przykładem PHP.
initakcjaStrona hooka →
Odpala się po załadowaniu większości rdzenia WordPressa, ale zanim nagłówki HTTP zostaną wysłane. Idealne miejsce na rejestrację niestandardowych typów treści, taksonomii i shortcodeów.
add_action( 'init', 'wpdocs_register_book_post_type' );
function wpdocs_register_book_post_type() {
register_post_type( 'book', array(
'labels' => array( 'name' => __( 'Książki', 'wpdocs' ) ),
'public' => true,
'has_archive' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
) );
}Wskazówka — Rejestruj typy treści i taksonomie tutaj — są dostępne we wszystkich kontekstach, łącznie z REST API i WP-CLI.
wp_enqueue_scriptsakcjaStrona hooka →
Właściwe miejsce na wczytanie skryptów i arkuszy stylów na froncie witryny za pomocą wp_enqueue_script() i wp_enqueue_style().
add_action( 'wp_enqueue_scripts', 'wpdocs_enqueue_assets' );
function wpdocs_enqueue_assets() {
wp_enqueue_style(
'wpdocs-style',
get_stylesheet_directory_uri() . '/assets/style.css',
array(),
'1.0.0'
);
wp_enqueue_script(
'wpdocs-script',
get_stylesheet_directory_uri() . '/assets/main.js',
array(),
'1.0.0',
true // wczytaj w stopce
);
wp_localize_script( 'wpdocs-script', 'wpdocsData', array(
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
) );
}Wskazówka — Wartość true w ostatnim parametrze wp_enqueue_script() ładuje skrypt w stopce, przed </body>.
admin_enqueue_scriptsakcjaStrona hooka →
Służy do ładowania skryptów i stylów w panelu administracyjnym. Otrzymuje parametr $hook_suffix, dzięki któremu możesz ograniczyć ładowanie do konkretnej strony.
add_action( 'admin_enqueue_scripts', 'wpdocs_admin_styles' );
function wpdocs_admin_styles( $hook_suffix ) {
// ładuj tylko na stronie ustawień wtyczki
if ( 'settings_page_wpdocs-settings' !== $hook_suffix ) {
return;
}
wp_enqueue_style( 'wpdocs-admin', plugin_dir_url( __FILE__ ) . 'admin.css' );
wp_enqueue_script( 'wpdocs-admin', plugin_dir_url( __FILE__ ) . 'admin.js' );
}admin_menuakcjaStrona hooka →
Uruchamiany przy budowaniu menu panelu administracyjnego. Tutaj rejestrujesz nowe strony ustawień przez add_menu_page() i add_submenu_page().
add_action( 'admin_menu', 'wpdocs_register_settings_page' );
function wpdocs_register_settings_page() {
add_menu_page(
__( 'Moje ustawienia', 'wpdocs' ),
__( 'Moje ustawienia', 'wpdocs' ),
'manage_options',
'wpdocs-settings',
'wpdocs_render_settings_page',
'dashicons-admin-generic',
25
);
}
function wpdocs_render_settings_page() {
echo '<div class="wrap"><h1>' . esc_html__( 'Moje ustawienia', 'wpdocs' ) . '</h1></div>';
}admin_initakcjaStrona hooka →
Odpala się na każdej stronie panelu dla zalogowanego użytkownika, po załadowaniu rdzenia admina. Standardowe miejsce na register_setting() i add_settings_field().
add_action( 'admin_init', 'wpdocs_register_settings' );
function wpdocs_register_settings() {
register_setting( 'reading', 'wpdocs_display_option' );
add_settings_field(
'wpdocs_display_option',
__( 'Wyświetlaj notkę', 'wpdocs' ),
'wpdocs_render_field',
'reading'
);
}
function wpdocs_render_field() {
$value = get_option( 'wpdocs_display_option' );
echo '<input type="checkbox" name="wpdocs_display_option" value="1" ' . checked( 1, $value, false ) . '>';
}wp_headakcjaStrona hooka →
Dodaje kod do sekcji <head> witryny — meta tagi, preconnect, skrypty śledzące.
add_action( 'wp_head', 'wpdocs_add_meta_tags' );
function wpdocs_add_meta_tags() {
echo '<meta name="wpdocs-version" content="1.0">' . "\n";
echo '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . "\n";
}wp_footerakcjaStrona hooka →
Dodaje kod na samym końcu dokumentu, tuż przed znacznikiem </body>. Często używany do skryptów analitycznych.
add_action( 'wp_footer', 'wpdocs_print_analytics' );
function wpdocs_print_analytics() {
echo '<script>console.log("stopka załadowana");</script>' . "\n";
}wp_body_openakcjaStrona hooka →
Odpala się tuż po otwarciu znacznika <body>. Motyw musi wywoływać wp_body_open() w header.php — nowsze motywy robią to automatycznie.
add_action( 'wp_body_open', 'wpdocs_skip_link' );
function wpdocs_skip_link() {
echo '<a class="skip-link screen-reader-text" href="#content">' . esc_html__( 'Przejdź do treści', 'wpdocs' ) . '</a>';
}after_setup_themeakcjaStrona hooka →
Uruchamiany po inicjalizacji motywu, jeszcze przed hookiem init. Standardowe miejsce na add_theme_support() i register_nav_menus().
add_action( 'after_setup_theme', 'wpdocs_theme_setup' );
function wpdocs_theme_setup() {
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'html5', array( 'search-form', 'gallery', 'caption' ) );
register_nav_menus( array(
'primary' => __( 'Menu główne', 'wpdocs' ),
'footer' => __( 'Menu w stopce', 'wpdocs' ),
) );
}widgets_initakcjaStrona hooka →
Odpala się po zarejestrowaniu wbudowanych widgetów. Tutaj rejestrujesz własne obszary widgetów przez register_sidebar().
add_action( 'widgets_init', 'wpdocs_register_sidebar' );
function wpdocs_register_sidebar() {
register_sidebar( array(
'name' => __( 'Pasek boczny', 'wpdocs' ),
'id' => 'sidebar-1',
'description' => __( 'Widgety wyświetlane z boku treści.', 'wpdocs' ),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
) );
}save_postakcjaStrona hooka →
Uruchamiany po zapisaniu wpisu do bazy danych. Pozwala zapisać metadane, zareagować na publikację itp. Dostępne warianty: save_post_{$post_type} i save_post_{$post_id}.
add_action( 'save_post', 'wpdocs_save_book_meta', 10, 3 );
function wpdocs_save_book_meta( $post_id, $post, $update ) {
// nie działaj podczas autozapisu ani bez uprawnień
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( isset( $_POST['wpdocs_isbn'] ) ) {
update_post_meta(
$post_id,
'_wpdocs_isbn',
sanitize_text_field( wp_unslash( $_POST['wpdocs_isbn'] ) )
);
}
}Wskazówka — Zawsze sprawdzaj DOING_AUTOSAVE i current_user_can(), bo hook odpala się też przy autozapisie i importach.
save_post_{$post->post_type}akcjadynamicznyStrona hooka →
Odmiana hooka save_post ograniczona do konkretnego typu treści — np. save_post_book działa tylko dla wpisów typu book.
add_action( 'save_post_book', 'wpdocs_save_book', 10, 3 );
function wpdocs_save_book( $post_id, $post, $update ) {
// wykona się tylko dla wpisów typu book
error_log( 'Zapisano książkę: ' . $post_id );
}Wskazówka — Zamień {$post_type} na slug swojego typu treści, np. save_post_produkt.
pre_get_postsakcjaStrona hooka →
Modyfikuje obiekt WP_Query przed wykonaniem zapytania. Pozwala zmieniać listę wpisów na stronie głównej, w archiwach i wynikach wyszukiwania.
add_action( 'pre_get_posts', 'wpdocs_show_books_on_home' );
function wpdocs_show_books_on_home( $query ) {
// modyfikuj tylko główne zapytanie na stronie głównej
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'post_type', array( 'post', 'book' ) );
$query->set( 'posts_per_page', 10 );
}
}Wskazówka — Zawsze sprawdzaj is_main_query(), inaczej zmienisz też widgety, menu i inne pomocnicze zapytania.
parse_queryakcjaStrona hooka →
Uruchamiany po utworzeniu obiektu zapytania i przetworzeniu zmiennych zapytania, ale przed wykonaniem zapytania. Alternatywa dla pre_get_posts.
add_action( 'parse_query', 'wpdocs_parse_query' );
function wpdocs_parse_query( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
$query->set( 'posts_per_page', 12 );
}
}template_redirectakcjaStrona hooka →
Odpala się po ustaleniu, który szablon zostanie użyty. Idealne miejsce na przekierowania i blokowanie dostępu do treści.
add_action( 'template_redirect', 'wpdocs_require_login_for_books' );
function wpdocs_require_login_for_books() {
if ( is_singular( 'book' ) && ! is_user_logged_in() ) {
wp_safe_redirect( wp_login_url( get_permalink() ) );
exit;
}
}wp_loginakcjaStrona hooka →
Uruchamiany po pomyślnym zalogowaniu użytkownika. Otrzymuje login i obiekt użytkownika.
add_action( 'wp_login', 'wpdocs_log_login', 10, 2 );
function wpdocs_log_login( $user_login, $user ) {
error_log( sprintf( 'Zalogowano: %s (ID %d)', $user_login, $user->ID ) );
}wp_login_failedakcjaStrona hooka →
Uruchamiany przy nieudanej próbie logowania — przydatny do logowania i blokowania prób siłowych.
add_action( 'wp_login_failed', 'wpdocs_failed_login' );
function wpdocs_failed_login( $username ) {
error_log( 'Nieudane logowanie dla: ' . $username );
}wp_logoutakcjaStrona hooka →
Odpala się po wylogowaniu użytkownika.
add_action( 'wp_logout', 'wpdocs_after_logout' );
function wpdocs_after_logout() {
wp_safe_redirect( home_url() );
exit;
}user_registerakcjaStrona hooka →
Odpala się natychmiast po utworzeniu nowego użytkownika. Często używany do wysyłki e-maila powitalnego lub uzupełnienia metadanych.
add_action( 'user_register', 'wpdocs_welcome_new_user', 10, 2 );
function wpdocs_welcome_new_user( $user_id, $userdata ) {
$user = get_userdata( $user_id );
wp_mail(
$user->user_email,
__( 'Witaj na naszej stronie!', 'wpdocs' ),
__( 'Dziękujemy za rejestrację.', 'wpdocs' )
);
}profile_updateakcjaStrona hooka →
Odpala się po aktualizacji profilu użytkownika. Otrzymuje ID użytkownika i jego poprzednie dane.
add_action( 'profile_update', 'wpdocs_profile_update', 10, 2 );
function wpdocs_profile_update( $user_id, $old_user_data ) {
$user = get_userdata( $user_id );
error_log( 'Zaktualizowano profil: ' . $user->user_login );
}transition_post_statusakcjaStrona hooka →
Uruchamiany przy każdej zmianie statusu wpisu. Otrzymuje nowy status, stary status i obiekt wpisu — świetny do powiadomień o publikacji.
add_action( 'transition_post_status', 'wpdocs_notify_on_publish', 10, 3 );
function wpdocs_notify_on_publish( $new_status, $old_status, $post ) {
if ( 'publish' === $new_status && 'publish' !== $old_status ) {
error_log( 'Opublikowano wpis: ' . $post->post_title );
}
}wp_insert_postakcjaStrona hooka →
Uruchamiany po wstawieniu lub zaktualizowaniu wpisu przez wp_insert_post(). Trzeci parametr $update informuje, czy to aktualizacja.
add_action( 'wp_insert_post', 'wpdocs_after_post_created', 10, 3 );
function wpdocs_after_post_created( $post_id, $post, $update ) {
if ( $update ) {
return; // interesują nas tylko nowe wpisy
}
error_log( 'Utworzono wpis: ' . $post->post_title );
}delete_postakcjaStrona hooka →
Odpala się po usunięciu wpisu z bazy. Używany do sprzątania powiązanych danych — załączników, plików, wpisów w zewnętrznych systemach.
add_action( 'delete_post', 'wpdocs_remove_attached_files' );
function wpdocs_remove_attached_files( $post_id ) {
$attachments = get_posts( array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_parent' => $post_id,
'fields' => 'ids',
) );
foreach ( $attachments as $attachment_id ) {
wp_delete_attachment( $attachment_id, true );
}
}add_meta_boxesakcjaStrona hooka →
Rejestruje meta boxy na ekranie edycji wpisu za pomocą add_meta_box().
add_action( 'add_meta_boxes', 'wpdocs_add_book_metabox' );
function wpdocs_add_book_metabox() {
add_meta_box(
'wpdocs-book-details',
__( 'Szczegóły książki', 'wpdocs' ),
'wpdocs_render_book_metabox',
'book',
'side'
);
}
function wpdocs_render_book_metabox( $post ) {
$isbn = get_post_meta( $post->ID, '_wpdocs_isbn', true );
echo '<input type="text" name="wpdocs_isbn" value="' . esc_attr( $isbn ) . '" style="width:100%">';
}admin_noticesakcjaStrona hooka →
Wyświetla komunikaty w panelu administracyjnym. Do wyboru klasy: notice-info, notice-warning, notice-error, notice-success.
add_action( 'admin_notices', 'wpdocs_show_notice' );
function wpdocs_show_notice() {
printf(
'<div class="notice notice-info is-dismissible"><p>%s</p></div>',
esc_html__( 'Zaktualizuj ustawienia wtyczki.', 'wpdocs' )
);
}customize_registerakcjaStrona hooka →
Uruchamiany przy inicjalizacji customizera. Rejestrujesz tu własne ustawienia, sekcje i kontrolki.
add_action( 'customize_register', 'wpdocs_customize_register' );
function wpdocs_customize_register( $wp_customize ) {
$wp_customize->add_setting( 'wpdocs_accent_color', array(
'default' => '#0073aa',
) );
$wp_customize->add_control( new WP_Customize_Color_Control(
$wp_customize,
'wpdocs_accent_color',
array(
'label' => __( 'Kolor akcentu', 'wpdocs' ),
'section' => 'colors',
)
) );
}plugins_loadedakcjaStrona hooka →
Odpala się, gdy wszystkie aktywne wtyczki zostały załadowane. Dobry moment na load_plugin_textdomain() i uruchomienie głównej logiki wtyczki.
add_action( 'plugins_loaded', 'wpdocs_load_textdomain' );
function wpdocs_load_textdomain() {
load_plugin_textdomain(
'wpdocs',
false,
dirname( plugin_basename( __FILE__ ) ) . '/languages'
);
}admin_bar_menuakcjaStrona hooka →
Modyfikuje pasek narzędzi admina (WP_Admin_Bar). Dodajesz lub usuwasz węzły przez $wp_admin_bar->add_node() i remove_node().
add_action( 'admin_bar_menu', 'wpdocs_admin_bar_items', 999 );
function wpdocs_admin_bar_items( $wp_admin_bar ) {
$wp_admin_bar->add_node( array(
'id' => 'wpdocs-link',
'title' => __( 'Moja wtyczka', 'wpdocs' ),
'href' => admin_url( 'options-general.php?page=wpdocs-settings' ),
) );
}shutdownakcjaStrona hooka →
Odpala się na samym końcu wykonywania PHP, po wysłaniu odpowiedzi. Nadaje się do logowania, statystyk i sprzątania.
add_action( 'shutdown', 'wpdocs_log_memory' );
function wpdocs_log_memory() {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( 'Szczytowe zużycie pamięci: ' . round( memory_get_peak_usage() / 1024 / 1024, 2 ) . ' MB' );
}
}rest_api_initakcjaStrona hooka →
Inicjalizuje REST API. Rejestruje własne trasy przez register_rest_route().
add_action( 'rest_api_init', 'wpdocs_register_rest_route' );
function wpdocs_register_rest_route() {
register_rest_route( 'wpdocs/v1', '/books', array(
'methods' => 'GET',
'callback' => function () {
return get_posts( array(
'post_type' => 'book',
'posts_per_page' => -1,
) );
},
'permission_callback' => '__return_true',
) );
}wp_ajax_{$action}akcjadynamicznyStrona hooka →
Obsługuje żądania AJAX wysyłane do wp-admin/admin-ajax.php. {$action} zastępuje się nazwą akcji. Dla niezalogowanych użyj wp_ajax_nopriv_{$action}.
add_action( 'wp_ajax_wpdocs_heartbeat', 'wpdocs_ajax_handler' );
function wpdocs_ajax_handler() {
check_ajax_referer( 'wpdocs_nonce', 'nonce' );
$value = isset( $_POST['value'] )
? sanitize_text_field( wp_unslash( $_POST['value'] ) )
: '';
wp_send_json_success( array( 'echo' => $value ) );
}Wskazówka — Sprawdzaj nonce i uprawnienia w każdej funkcji AJAX — to częsta luka bezpieczeństwa we wtyczkach.
manage_{$post_type}_posts_columnsfiltrdynamicznyStrona hooka →
Pozwala dodać własne kolumny do listy wpisów w panelu — np. manage_book_posts_columns dla typu book.
add_filter( 'manage_book_posts_columns', 'wpdocs_book_columns' );
function wpdocs_book_columns( $columns ) {
$columns['isbn'] = __( 'ISBN', 'wpdocs' );
return $columns;
}manage_{$post->post_type}_posts_custom_columnakcjadynamicznyStrona hooka →
Renderuje zawartość własnych kolumn na liście wpisów w panelu. Współpracuje z filtrem manage_{$post_type}_posts_columns.
add_action( 'manage_book_posts_custom_column', 'wpdocs_book_columns_content', 10, 2 );
function wpdocs_book_columns_content( $column, $post_id ) {
if ( 'isbn' === $column ) {
echo esc_html( get_post_meta( $post_id, '_wpdocs_isbn', true ) );
}
}comment_postakcjaStrona hooka →
Uruchamiany po zapisaniu komentarza. Pozwala na wysyłanie powiadomień i dodatkową moderację.
add_action( 'comment_post', 'wpdocs_notify_on_comment', 10, 3 );
function wpdocs_notify_on_comment( $comment_id, $comment_approved, $commentdata ) {
if ( 1 !== $comment_approved ) {
return; // komentarz czeka na moderację
}
error_log( 'Nowy komentarz: ' . $commentdata['comment_content'] );
}after_switch_themeakcjaStrona hooka →
Odpala się po aktywacji motywu. Dobry moment na ustawienie opcji domyślnych.
add_action( 'after_switch_theme', 'wpdocs_on_theme_activate' );
function wpdocs_on_theme_activate() {
update_option( 'wpdocs_theme_version', wp_get_theme()->get( 'Version' ) );
}registered_post_typeakcjaStrona hooka →
Uruchamiany po zarejestrowaniu typu treści. Przydatny do modyfikacji typów rejestrowanych przez inne wtyczki.
add_action( 'registered_post_type', 'wpdocs_after_register_cpt', 10, 2 );
function wpdocs_after_register_cpt( $post_type, $post_type_object ) {
if ( 'book' === $post_type ) {
error_log( 'Zarejestrowano typ treści: ' . $post_type );
}
}add_attachmentakcjaStrona hooka →
Odpala się po dodaniu załącznika — np. po przesłaniu pliku do biblioteki mediów.
add_action( 'add_attachment', 'wpdocs_on_attachment_added' );
function wpdocs_on_attachment_added( $attachment_id ) {
$file = get_attached_file( $attachment_id );
error_log( 'Dodano załącznik: ' . $file );
}login_enqueue_scriptsakcjaStrona hooka →
Ładuje skrypty i style na stronie logowania wp-login.php.
add_action( 'login_enqueue_scripts', 'wpdocs_login_logo' );
function wpdocs_login_logo() {
$logo = plugin_dir_url( __FILE__ ) . 'assets/logo.png';
echo '<style>
#login h1 a {
background-image: url("' . esc_url( $logo ) . '");
background-size: 120px;
width: 120px;
}
</style>';
}wp_loadedakcjaStrona hooka →
Uruchamiany, gdy WordPress w pełni załadował rdzeń, wtyczki i motyw. Dobry moment na jednorazowe operacje, np. przebudowanie reguł linków.
add_action( 'wp_loaded', 'wpdocs_flush_rules_once' );
function wpdocs_flush_rules_once() {
if ( ! get_option( 'wpdocs_rules_flushed' ) ) {
flush_rewrite_rules();
update_option( 'wpdocs_rules_flushed', 1 );
}
}Wskazówka — Nigdy nie wywołuj flush_rewrite_rules() przy każdym ładowaniu strony — to kosztowna operacja.
update_option_{$option}akcjadynamicznyStrona hooka →
Odpala się po aktualizacji wartości konkretnej opcji — np. update_option_blogname.
add_action( 'update_option_blogname', 'wpdocs_blogname_changed', 10, 2 );
function wpdocs_blogname_changed( $old_value, $value ) {
error_log( 'Zmieniono nazwę witryny: ' . $old_value . ' -> ' . $value );
}template_includefiltrStrona hooka →
Pozwala podmienić plik szablonu, który ma zostać załadowany. Często używany do niestandardowych szablonów dla własnych typów treści.
add_filter( 'template_include', 'wpdocs_book_template' );
function wpdocs_book_template( $template ) {
if ( is_singular( 'book' ) ) {
return plugin_dir_path( __FILE__ ) . 'templates/single-book.php';
}
return $template;
}the_contentfiltrStrona hooka →
Filtruje treść wpisu przy wyświetlaniu. Wtyczki używają go do doklejania treści, boksów społecznościowych i notek.
add_filter( 'the_content', 'wpdocs_append_banner' );
function wpdocs_append_banner( $content ) {
if ( is_single() ) {
$content .= '<p class="banner">' . esc_html__( 'Dziękujemy za lekturę!', 'wpdocs' ) . '</p>';
}
return $content;
}Wskazówka — Nie dołączaj treści na stronach z excerptami (is_feed(), is_search()) — chyba że celowo.
the_titlefiltrStrona hooka →
Filtruje tytuł wpisu przy wyświetlaniu w pętli.
add_filter( 'the_title', 'wpdocs_title_prefix', 10, 2 );
function wpdocs_title_prefix( $title, $id ) {
if ( 'book' === get_post_type( $id ) ) {
$title = __( 'Książka', 'wpdocs' ) . ': ' . $title;
}
return $title;
}the_excerptfiltrStrona hooka →
Filtruje zajawkę wpisu przy wyświetlaniu.
add_filter( 'the_excerpt', 'wpdocs_excerpt_read_more' );
function wpdocs_excerpt_read_more( $excerpt ) {
return $excerpt . ' <a href="' . esc_url( get_permalink() ) . '">' . esc_html__( 'Czytaj dalej', 'wpdocs' ) . ' →</a>';
}excerpt_lengthfiltrStrona hooka →
Zmienia długość automatycznie generowanej zajawki (w słowach).
add_filter( 'excerpt_length', 'wpdocs_excerpt_length' );
function wpdocs_excerpt_length( $length ) {
return 20;
}excerpt_morefiltrStrona hooka →
Zmienia tekst „Czytaj dalej” dołączany do automatycznej zajawki.
add_filter( 'excerpt_more', 'wpdocs_excerpt_more' );
function wpdocs_excerpt_more( $more ) {
return '…';
}body_classfiltrStrona hooka →
Dodaje klasy do znacznika <body> na froncie witryny.
add_filter( 'body_class', 'wpdocs_body_class' );
function wpdocs_body_class( $classes ) {
if ( is_singular( 'book' ) ) {
$classes[] = 'typ-ksiazka';
}
return $classes;
}post_classfiltrStrona hooka →
Dodaje klasy do znacznika <article> w pętli.
add_filter( 'post_class', 'wpdocs_post_class', 10, 3 );
function wpdocs_post_class( $classes, $class, $post_id ) {
if ( has_post_thumbnail( $post_id ) ) {
$classes[] = 'ma-miniature';
}
return $classes;
}wp_nav_menu_itemsfiltrStrona hooka →
Modyfikuje elementy menu wyświetlanego przez wp_nav_menu().
add_filter( 'wp_nav_menu_items', 'wpdocs_nav_login_link', 10, 2 );
function wpdocs_nav_login_link( $items, $args ) {
if ( 'primary' !== $args->theme_location ) {
return $items;
}
$link = is_user_logged_in() ? wp_logout_url( home_url() ) : wp_login_url( home_url() );
$label = is_user_logged_in() ? __( 'Wyloguj', 'wpdocs' ) : __( 'Zaloguj', 'wpdocs' );
return $items . '<li class="menu-item"><a href="' . esc_url( $link ) . '">' . esc_html( $label ) . '</a></li>';
}wp_nav_menu_objectsfiltrStrona hooka →
Filtruje obiekty elementów menu przed renderowaniem — pozwala ukrywać pozycje dla wybranych użytkowników.
add_filter( 'wp_nav_menu_objects', 'wpdocs_hide_menu_items', 10, 2 );
function wpdocs_hide_menu_items( $items, $args ) {
if ( is_user_logged_in() ) {
return $items;
}
return array_filter( $items, function ( $item ) {
return ! in_array( 'tylko-zalogowani', $item->classes, true );
} );
}upload_mimesfiltrStrona hooka →
Zmienia listę dozwolonych typów MIME w bibliotece mediów — np. aby pozwolić na upload SVG.
add_filter( 'upload_mimes', 'wpdocs_allow_svg' );
function wpdocs_allow_svg( $mimes ) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}Wskazówka — Pozwolenie na SVG wymaga dodatkowej sanitizacji — pliki SVG mogą zawierać skrypty.
jpeg_qualityfiltrStrona hooka →
Ustawia jakość kompresji obrazów JPEG generowanych przez WordPress.
add_filter( 'jpeg_quality', 'wpdocs_jpeg_quality' );
function wpdocs_jpeg_quality( $quality ) {
return 82;
}wp_mail_fromfiltrStrona hooka →
Zmienia adres nadawcy (From) w e-mailach wysyłanych przez wp_mail().
add_filter( 'wp_mail_from', 'wpdocs_mail_from' );
function wpdocs_mail_from( $email ) {
$host = wp_parse_url( home_url(), PHP_URL_HOST );
return 'noreply@' . $host;
}wp_mail_from_namefiltrStrona hooka →
Zmienia nazwę nadawcy w e-mailach wysyłanych przez wp_mail().
add_filter( 'wp_mail_from_name', 'wpdocs_mail_from_name' );
function wpdocs_mail_from_name( $name ) {
return get_bloginfo( 'name' );
}wp_mail_content_typefiltrStrona hooka →
Zmienia typ zawartości e-maili — np. text/html, aby wysyłać wiadomości w formacie HTML.
add_filter( 'wp_mail_content_type', 'wpdocs_html_emails' );
function wpdocs_html_emails() {
return 'text/html';
}wp_mailfiltrStrona hooka →
Filtruje parametry wiadomości przed wysłaniem — tablicę z kluczami to, subject, message, headers i attachments.
add_filter( 'wp_mail', 'wpdocs_force_reply_to' );
function wpdocs_force_reply_to( $atts ) {
$atts['headers'][] = 'Reply-To: ' . get_bloginfo( 'admin_email' );
return $atts;
}login_redirectfiltrStrona hooka →
Zmienia adres docelowy po zalogowaniu użytkownika.
add_filter( 'login_redirect', 'wpdocs_login_redirect', 10, 3 );
function wpdocs_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( is_wp_error( $user ) ) {
return $redirect_to;
}
if ( in_array( 'subscriber', $user->roles, true ) ) {
return home_url();
}
return $redirect_to;
}comment_form_fieldsfiltrStrona hooka →
Zmienia kolejność i zawartość pól formularza komentarzy.
add_filter( 'comment_form_fields', 'wpdocs_comment_fields_order' );
function wpdocs_comment_fields_order( $fields ) {
// przenieś pole komentarza na koniec formularza
$comment = $fields['comment'];
unset( $fields['comment'] );
$fields['comment'] = $comment;
return $fields;
}comment_textfiltrStrona hooka →
Filtruje treść komentarza przy wyświetlaniu.
add_filter( 'comment_text', 'wpdocs_comment_text' );
function wpdocs_comment_text( $text ) {
return '<div class="comment-body">' . $text . '</div>';
}sanitize_file_namefiltrStrona hooka →
Filtruje nazwę pliku podczas uploadu — przydatne do usuwania polskich znaków diakrytycznych.
add_filter( 'sanitize_file_name', 'wpdocs_latinize_filename', 10, 2 );
function wpdocs_latinize_filename( $filename, $filename_raw ) {
return remove_accents( $filename );
}script_loader_tagfiltrStrona hooka →
Modyfikuje tag <script> generowany przez WordPress — pozwala dodać atrybuty async lub defer.
add_filter( 'script_loader_tag', 'wpdocs_defer_scripts', 10, 3 );
function wpdocs_defer_scripts( $tag, $handle, $src ) {
if ( 'wpdocs-script' !== $handle ) {
return $tag;
}
return str_replace( ' src', ' defer src', $tag );
}cron_schedulesfiltrStrona hooka →
Rejestruje własne interwały zadań cyklicznych WP-Cron.
add_filter( 'cron_schedules', 'wpdocs_cron_interval' );
function wpdocs_cron_interval( $schedules ) {
$schedules['co_tydzien'] = array(
'interval' => WEEK_IN_SECONDS,
'display' => __( 'Raz w tygodniu', 'wpdocs' ),
);
return $schedules;
}Wskazówka — Nowy interwał pojawi się w harmonogramie dopiero po zapisaniu zadania: wp_schedule_event( time(), "co_tydzien", "wpdocs_weekly_task" ).
get_avatarfiltrStrona hooka →
Podmienia lub modyfikuje awatar użytkownika.
add_filter( 'get_avatar', 'wpdocs_default_avatar', 10, 5 );
function wpdocs_default_avatar( $avatar, $id_or_email, $size, $default, $alt ) {
if ( empty( $default ) ) {
$avatar = sprintf(
'<img src="%s" width="%d" height="%d" alt="%s">',
esc_url( plugin_dir_url( __FILE__ ) . 'avatar.png' ),
$size,
$size,
esc_attr( $alt )
);
}
return $avatar;
}user_contactmethodsfiltrStrona hooka →
Dodaje własne pola do profilu użytkownika w panelu.
add_filter( 'user_contactmethods', 'wpdocs_contact_methods' );
function wpdocs_contact_methods( $methods ) {
$methods['twitter'] = __( 'Konto X (Twitter)', 'wpdocs' );
$methods['phone'] = __( 'Telefon', 'wpdocs' );
return $methods;
}document_title_partsfiltrStrona hooka →
Modyfikuje części tytułu strony generowanego w <title>.
add_filter( 'document_title_parts', 'wpdocs_title_parts' );
function wpdocs_title_parts( $title ) {
if ( empty( $title['tagline'] ) ) {
$title['tagline'] = __( 'Wszystko o WordPressie', 'wpdocs' );
}
return $title;
}document_title_separatorfiltrStrona hooka →
Zmienia separator w tytule dokumentu (domyślnie „-”).
add_filter( 'document_title_separator', 'wpdocs_title_separator' );
function wpdocs_title_separator() {
return '|';
}wp_kses_allowed_htmlfiltrStrona hooka →
Rozszerza listę dozwolonych tagów i atrybutów HTML w treści dla konkretnego kontekstu.
add_filter( 'wp_kses_allowed_html', 'wpdocs_allow_data_attrs', 10, 2 );
function wpdocs_allow_data_attrs( $allowed, $context ) {
if ( 'post' !== $context ) {
return $allowed;
}
$allowed['div']['data-animate'] = true;
return $allowed;
}allowed_block_types_allfiltrStrona hooka →
Ogranicza lub rozszerza listę dozwolonych bloków w edytorze Gutenberg.
add_filter( 'allowed_block_types_all', 'wpdocs_limit_blocks', 10, 2 );
function wpdocs_limit_blocks( $allowed_blocks, $editor_context ) {
if ( 'book' !== $editor_context->post->post_type ) {
return $allowed_blocks;
}
return array( 'core/paragraph', 'core/heading', 'core/image' );
}render_blockfiltrStrona hooka →
Filtruje wyrenderowany HTML pojedynczego bloku Gutenberga.
add_filter( 'render_block', 'wpdocs_wrap_blocks', 10, 2 );
function wpdocs_wrap_blocks( $block_content, $block ) {
if ( 'core/paragraph' === $block['blockName'] ) {
$block_content = '<div class="proza">' . $block_content . '</div>';
}
return $block_content;
}register_post_type_argsfiltrStrona hooka →
Modyfikuje argumenty rejestracji typu treści — pozwala zmieniać typy rejestrowane przez inne wtyczki.
add_filter( 'register_post_type_args', 'wpdocs_modify_cpt_args', 10, 2 );
function wpdocs_modify_cpt_args( $args, $post_type ) {
if ( 'book' === $post_type ) {
$args['show_in_rest'] = true;
}
return $args;
}plugin_action_linksfiltrStrona hooka →
Dodaje linki (np. „Ustawienia”) w wierszu wtyczki na liście wtyczek w panelu.
add_filter( 'plugin_action_links', 'wpdocs_plugin_links', 10, 2 );
function wpdocs_plugin_links( $links, $plugin_file ) {
if ( 'wpdocs/wpdocs.php' !== $plugin_file ) {
return $links;
}
$settings = '<a href="' . esc_url( admin_url( 'options-general.php?page=wpdocs-settings' ) ) . '">' . __( 'Ustawienia', 'wpdocs' ) . '</a>';
array_unshift( $links, $settings );
return $links;
}gettextfiltrStrona hooka →
Filtruje każdy przetłumaczony ciąg tekstowy — pozwala podmieniać teksty w panelu bez edycji plików tłumaczeń.
add_filter( 'gettext', 'wpdocs_rename_posts', 10, 3 );
function wpdocs_rename_posts( $translation, $text, $domain ) {
if ( 'default' === $domain && 'Posts' === $text ) {
return __( 'Artykuły' );
}
return $translation;
}localefiltrStrona hooka →
Zmienia lokalizację witryny — np. w zależności od użytkownika lub kontekstu.
add_filter( 'locale', 'wpdocs_admin_locale' );
function wpdocs_admin_locale( $locale ) {
if ( is_admin() ) {
return 'en_US';
}
return $locale;
}wp_insert_post_datafiltrStrona hooka →
Filtruje dane wpisu tuż przed zapisem do bazy danych.
add_filter( 'wp_insert_post_data', 'wpdocs_force_post_title', 10, 2 );
function wpdocs_force_post_title( $data, $postarr ) {
if ( empty( $data['post_title'] ) ) {
$data['post_title'] = __( 'Bez tytułu', 'wpdocs' );
}
return $data;
}option_{$option}filtrdynamicznyStrona hooka →
Filtruje wartość konkretnej opcji przy odczycie — np. option_blogname.
add_filter( 'option_blogname', 'wpdocs_filter_blogname' );
function wpdocs_filter_blogname( $value ) {
return $value . ' — Blog o WordPressie';
}the_generatorfiltrStrona hooka →
Zmienia lub usuwa meta generator (wersja WordPressa) — ukrycie go utrudnia ataki na znane luki.
add_filter( 'the_generator', 'wpdocs_hide_generator' );
function wpdocs_hide_generator() {
return '';
}wp_robotsfiltrStrona hooka →
Modyfikuje dyrektywy meta robots generowane przez WordPress.
add_filter( 'wp_robots', 'wpdocs_noindex_search' );
function wpdocs_noindex_search( $robots ) {
if ( is_search() ) {
$robots['noindex'] = true;
}
return $robots;
}robots_txtfiltrStrona hooka →
Modyfikuje zawartość wirtualnego pliku robots.txt.
add_filter( 'robots_txt', 'wpdocs_robots_txt' );
function wpdocs_robots_txt( $output ) {
return $output . "\nDisallow: /szczegoly/\n";
}authenticatefiltrStrona hooka →
Filtruje wynik uwierzytelniania — pozwala dodać własne kroki walidacji logowania lub je całkowicie zablokować.
add_filter( 'authenticate', 'wpdocs_log_login_attempts', 30, 3 );
function wpdocs_log_login_attempts( $user, $username, $password ) {
if ( ! empty( $username ) ) {
error_log( 'Próba logowania: ' . $username );
}
return $user;
}auth_cookie_expirationfiltrStrona hooka →
Zmienia czas ważności ciasteczka sesji logowania.
add_filter( 'auth_cookie_expiration', 'wpdocs_session_length', 10, 3 );
function wpdocs_session_length( $length, $user_id, $remember ) {
return $remember ? 30 * DAY_IN_SECONDS : $length;
}get_search_formfiltrStrona hooka →
Podmienia domyślny formularz wyszukiwania.
add_filter( 'get_search_form', 'wpdocs_search_form' );
function wpdocs_search_form( $form ) {
return '<form role="search" method="get" action="' . esc_url( home_url( '/' ) ) . '">'
. '<input type="search" name="s" value="' . esc_attr( get_search_query() ) . '">'
. '<button type="submit">' . esc_html__( 'Szukaj', 'wpdocs' ) . '</button>'
. '</form>';
}nav_menu_link_attributesfiltrStrona hooka →
Dodaje atrybuty do linków w menu — np. aria-label, target czy klasy.
add_filter( 'nav_menu_link_attributes', 'wpdocs_menu_link_attrs', 10, 4 );
function wpdocs_menu_link_attrs( $atts, $item, $args, $depth ) {
$atts['aria-label'] = $item->title;
return $atts;
}wp_get_attachment_image_attributesfiltrStrona hooka →
Modyfikuje atrybuty tagu <img> generowanego przez wp_get_attachment_image().
add_filter( 'wp_get_attachment_image_attributes', 'wpdocs_image_attrs', 10, 3 );
function wpdocs_image_attrs( $attr, $attachment, $size ) {
$attr['data-caption'] = get_post_field( 'post_excerpt', $attachment->ID );
return $attr;
}query_varsfiltrStrona hooka →
Rejestruje własne zmienne zapytania (query vars) dostępne w URL.
add_filter( 'query_vars', 'wpdocs_query_vars' );
function wpdocs_query_vars( $vars ) {
$vars[] = 'rok_wydania';
return $vars;
}wp_trim_excerptfiltrStrona hooka →
Filtruje generowaną zajawkę — np. aby dołączyć informację o czasie czytania.
add_filter( 'wp_trim_excerpt', 'wpdocs_excerpt_with_time' );
function wpdocs_excerpt_with_time( $excerpt ) {
$words = str_word_count( wp_strip_all_tags( get_the_content() ) );
$minutes = (int) ceil( $words / 200 );
return $excerpt . ' <small>Czytanie: ' . $minutes . ' min</small>';
}post_linkfiltrStrona hooka →
Zmienia permalink wpisu — np. własna struktura linków dla niestandardowego typu treści.
add_filter( 'post_link', 'wpdocs_book_permalink', 10, 3 );
function wpdocs_book_permalink( $permalink, $post, $leavename ) {
if ( 'book' === $post->post_type ) {
return home_url( '/ksiazki/' . $post->post_name . '/' );
}
return $permalink;
}term_linkfiltrStrona hooka →
Zmienia permalink termu taksonomii.
add_filter( 'term_link', 'wpdocs_term_link', 10, 3 );
function wpdocs_term_link( $termlink, $term, $taxonomy ) {
if ( 'gatunek' === $taxonomy ) {
return home_url( '/gatunki/' . $term->slug . '/' );
}
return $termlink;
}block_categories_allfiltrStrona hooka →
Dodaje własne kategorie bloków w inserterze edytora Gutenberga.
add_filter( 'block_categories_all', 'wpdocs_block_category', 10, 2 );
function wpdocs_block_category( $categories, $context ) {
return array_merge( $categories, array(
array(
'slug' => 'wpdocs',
'title' => __( 'Moja wtyczka', 'wpdocs' ),
),
) );
}admin_footer_textfiltrStrona hooka →
Zmienia tekst w stopce panelu administracyjnego.
add_filter( 'admin_footer_text', 'wpdocs_admin_footer' );
function wpdocs_admin_footer() {
return 'Dziękujemy za korzystanie z wtyczki WPDocs.';
}post_updated_messagesfiltrStrona hooka →
Zmienia komunikaty wyświetlane po zapisaniu wpisu w panelu.
add_filter( 'post_updated_messages', 'wpdocs_book_messages' );
function wpdocs_book_messages( $messages ) {
$messages['book'] = array(
1 => __( 'Książka zaktualizowana.', 'wpdocs' ),
6 => __( 'Książka opublikowana.', 'wpdocs' ),
);
return $messages;
}wp_headersfiltrStrona hooka →
Modyfikuje nagłówki HTTP wysyłane przez WordPress.
add_filter( 'wp_headers', 'wpdocs_extra_headers' );
function wpdocs_extra_headers( $headers ) {
$headers['X-Content-Type-Options'] = 'nosniff';
return $headers;
}kses_allowed_protocolsfiltrStrona hooka →
Rozszerza listę dozwolonych protokołów w linkach — np. skype: czy tel:.
add_filter( 'kses_allowed_protocols', 'wpdocs_allow_skype' );
function wpdocs_allow_skype( $protocols ) {
$protocols[] = 'skype';
return $protocols;
}get_the_archive_titlefiltrStrona hooka →
Modyfikuje tytuł strony archiwum — np. usuwa prefiks „Kategoria:”.
add_filter( 'get_the_archive_title', 'wpdocs_archive_title' );
function wpdocs_archive_title( $title ) {
return preg_replace( '/^.*?: /', '', $title );
}user_has_capfiltrStrona hooka →
Filtruje uprawnienia użytkownika przy sprawdzaniu current_user_can().
add_filter( 'user_has_cap', 'wpdocs_grant_librarian_cap', 10, 4 );
function wpdocs_grant_librarian_cap( $allcaps, $caps, $args, $user ) {
if ( in_array( 'manage_books', $caps, true ) && in_array( 'bibliotekarz', $user->roles, true ) ) {
$allcaps['manage_books'] = true;
}
return $allcaps;
}registration_errorsfiltrStrona hooka →
Dodaje własną walidację do formularza rejestracji użytkownika.
add_filter( 'registration_errors', 'wpdocs_validate_username', 10, 3 );
function wpdocs_validate_username( $errors, $sanitized_user_login, $user_email ) {
if ( 'admin' === strtolower( $sanitized_user_login ) ) {
$errors->add( 'forbidden_name', __( 'Ta nazwa użytkownika jest niedozwolona.', 'wpdocs' ) );
}
return $errors;
}xmlrpc_methodsfiltrStrona hooka →
Rejestruje własne metody XML-RPC.
add_filter( 'xmlrpc_methods', 'wpdocs_xmlrpc_method' );
function wpdocs_xmlrpc_method( $methods ) {
$methods['wpdocs.echo'] = 'wpdocs_xmlrpc_echo';
return $methods;
}
function wpdocs_xmlrpc_echo( $args ) {
return sanitize_text_field( $args[0] );
}shortcode_atts_{$shortcode}filtrdynamicznyStrona hooka →
Filtruje domyślne atrybuty konkretnego shortcode’a — np. shortcode_atts_gallery.
add_filter( 'shortcode_atts_gallery', 'wpdocs_gallery_atts' );
function wpdocs_gallery_atts( $out ) {
$out['columns'] = 3;
return $out;
}embed_oembed_htmlfiltrStrona hooka →
Modyfikuje HTML osadzonej treści oEmbed — np. aby owinąć osadzenie w responsywny kontener.
add_filter( 'embed_oembed_html', 'wpdocs_wrap_oembed', 10, 4 );
function wpdocs_wrap_oembed( $html, $url, $attr, $post_id ) {
return '<div class="osadzenie">' . $html . '</div>';
}upload_dirfiltrStrona hooka →
Zmienia katalog docelowy uploadów.
add_filter( 'upload_dir', 'wpdocs_upload_dir' );
function wpdocs_upload_dir( $upload ) {
$upload['subdir'] = '/custom/' . gmdate( 'Y/m' );
$upload['path'] = $upload['basedir'] . $upload['subdir'];
$upload['url'] = $upload['baseurl'] . $upload['subdir'];
return $upload;
}post_thumbnail_htmlfiltrStrona hooka →
Modyfikuje HTML miniaturki wpisu renderowanej przez the_post_thumbnail().
add_filter( 'post_thumbnail_html', 'wpdocs_thumbnail_wrapper', 10, 5 );
function wpdocs_thumbnail_wrapper( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
return '<div class="post-thumbnail">' . $html . '</div>';
}pre_http_requestfiltrStrona hooka →
Pozwala przechwycić żądanie HTTP przed jego wykonaniem — do blokowania, mockowania lub cache’owania odpowiedzi.
add_filter( 'pre_http_request', 'wpdocs_block_external', 10, 3 );
function wpdocs_block_external( $preempt, $args, $url ) {
if ( false === strpos( $url, home_url() ) ) {
return new WP_Error( 'blocked', __( 'Żądania zewnętrzne są zablokowane.', 'wpdocs' ) );
}
return $preempt;
}rest_authentication_errorsfiltrStrona hooka →
Kontroluje dostęp do endpointów REST API.
add_filter( 'rest_authentication_errors', 'wpdocs_rest_auth' );
function wpdocs_rest_auth( $result ) {
$uri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
if ( ! is_user_logged_in() && str_contains( $uri, '/wp-json/wpdocs/' ) ) {
return new WP_Error(
'rest_forbidden',
__( 'Wymagane logowanie.', 'wpdocs' ),
array( 'status' => 401 )
);
}
return $result;
}