WP HOOKS

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.

php
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().

php
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.

php
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().

php
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().

php
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.

php
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.

php
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.

php
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().

php
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().

php
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}.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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().

php
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.

php
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.

php
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.

php
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().

php
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.

php
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().

php
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}.

php
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.

php
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.

php
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ę.

php
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.

php
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.

php
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.

php
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.

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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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' ) . ' &rarr;</a>';
}
excerpt_lengthfiltrStrona hooka →

Zmienia długość automatycznie generowanej zajawki (w słowach).

php
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.

php
add_filter( 'excerpt_more', 'wpdocs_excerpt_more' );

function wpdocs_excerpt_more( $more ) {
	return '&hellip;';
}
body_classfiltrStrona hooka →

Dodaje klasy do znacznika <body> na froncie witryny.

php
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.

php
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().

php
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.

php
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.

php
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.

php
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().

php
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().

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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>.

php
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 „-”).

php
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.

php
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.

php
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.

php
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.

php
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.

php
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ń.

php
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.

php
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.

php
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.

php
add_filter( 'option_blogname', 'wpdocs_filter_blogname' );

function wpdocs_filter_blogname( $value ) {
	return $value . ' &mdash; Blog o WordPressie';
}
the_generatorfiltrStrona hooka →

Zmienia lub usuwa meta generator (wersja WordPressa) — ukrycie go utrudnia ataki na znane luki.

php
add_filter( 'the_generator', 'wpdocs_hide_generator' );

function wpdocs_hide_generator() {
	return '';
}
wp_robotsfiltrStrona hooka →

Modyfikuje dyrektywy meta robots generowane przez WordPress.

php
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.

php
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ć.

php
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.

php
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.

php
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.

php
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().

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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.

php
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:.

php
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:”.

php
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().

php
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.

php
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.

php
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.

php
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.

php
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.

php
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().

php
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.

php
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.

php
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;
}