The wp_list_pages WordPress PHP filter modifies the HTML output of the pages to list.
Usage
add_filter( 'wp_list_pages', 'your_custom_function', 10, 3 );
function your_custom_function( $output, $parsed_args, $pages ) {
// your custom code here
return $output;
}
Parameters
$output(string) – The HTML output of the pages list.$parsed_args(array) – An array of page-listing arguments. Seewp_list_pages()for information on accepted arguments.$pages(WP_Post[]) – Array of the page objects.
More information
See WordPress Developer Resources: wp_list_pages
Examples
Add a custom class to all page links
This example adds a custom class to all page links in the list.
add_filter( 'wp_list_pages', 'add_custom_class_to_page_links', 10, 3 );
function add_custom_class_to_page_links( $output, $parsed_args, $pages ) {
$output = str_replace( '<a ', '<a class="your-custom-class" ', $output );
return $output;
}
Hide a specific page from the list
This example hides a specific page (ID: 42) from the list of pages.
add_filter( 'wp_list_pages', 'hide_specific_page', 10, 3 );
function hide_specific_page( $output, $parsed_args, $pages ) {
$page_to_remove = 42;
$output = preg_replace( '/<li class="page_item page-item-' . $page_to_remove . '">.*?<\/li>/', '', $output );
return $output;
}
Wrap page list items in a custom HTML tag
This example wraps each page list item in a <span> tag.
add_filter( 'wp_list_pages', 'wrap_page_list_items', 10, 3 );
function wrap_page_list_items( $output, $parsed_args, $pages ) {
$output = preg_replace( '/<li(.*?)>/', '<li$1><span>', $output );
$output = str_replace( '</li>', '</span></li>', $output );
return $output;
}
Add an icon before each page title
This example adds a custom icon (e.g., Font Awesome) before each page title.
add_filter( 'wp_list_pages', 'add_icon_before_page_title', 10, 3 );
function add_icon_before_page_title( $output, $parsed_args, $pages ) {
$icon = '<i class="fas fa-star"></i> ';
$output = preg_replace( '/(<a.*?>)/', '$1' . $icon, $output );
return $output;
}
Add an “active” class to the current page
This example adds an “active” class to the current page list item.
add_filter( 'wp_list_pages', 'add_active_class_to_current_page', 10, 3 );
function add_active_class_to_current_page( $output, $parsed_args, $pages ) {
global $post;
$current_page_id = $post->ID;
$output = preg_replace( '/<li class="page_item page-item-' . $current_page_id . '">/', '<li class="page_item page-item-' . $current_page_id . ' active">', $output );
return $output;
}
Add custom data attribute to page links
This example adds a custom data attribute to each page link in the list.
add_filter( 'wp_list_pages', 'add_data_attribute_to_page_links', 10, 3 );function add_data_attribute_to_page_links( $output, $parsed_args, $pages ) { $output = preg_replace( '/<a(.*?)>/', '<a$1 data-custom="your-data">', $output ); return $output; }Add a "no-follow" attribute to external page links
This example adds a "no-follow" attribute to external page links in the list.
add_filter( 'wp_list_pages', 'add_nofollow_to_external_links', 10, 3 ); function add_nofollow_to_external_links( $output, $parsed_args, $pages ) { $home_url = home_url(); $output = preg_replace( '/<a href="(?!' . preg_quote( $home_url, '/' ) . ')(.*?)>/', '<a href="$1" rel="nofollow">', $output ); return $output; }Replace the default list element with a custom element
This example replaces the default
<li>element with a custom<div>element for each page in the list.add_filter( 'wp_list_pages', 'replace_list_element_with_custom_element', 10, 3 ); function replace_list_element_with_custom_element( $output, $parsed_args, $pages ) { $output = preg_replace( '/<li(.*?)>/', '<div$1>', $output ); $output = str_replace( '</li>', '</div>', $output ); return $output; }Add the page excerpt below the page title
This example adds the page excerpt below each page title in the list.
add_filter( 'wp_list_pages', 'add_excerpt_below_page_title', 10, 3 ); function add_excerpt_below_page_title( $output, $parsed_args, $pages ) { foreach ( $pages as $page ) { $excerpt = apply_filters( 'the_excerpt', $page->post_excerpt ); $output = str_replace( '</a></li>', '</a><p>' . $excerpt . '</p></li>', $output ); } return $output; }