: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$output .= ( 1 === $i ) ? ' ' : $parsed_args['separator'];
$output .= $parsed_args['after'];
$output .= $parsed_args['before'];
$link = _wp_link_page( $prev ) . $parsed_args['link_before'] . $parsed_args['previouspagelink'] . $parsed_args['link_after'] . '</a>';
/** This filter is documented in wp-includes/post-template.php */
$output .= apply_filters( 'wp_link_pages_link', $link, $prev );
if ( $next <= $numpages ) {
$output .= $parsed_args['separator'];
$link = _wp_link_page( $next ) . $parsed_args['link_before'] . $parsed_args['nextpagelink'] . $parsed_args['link_after'] . '</a>';
/** This filter is documented in wp-includes/post-template.php */
$output .= apply_filters( 'wp_link_pages_link', $link, $next );
$output .= $parsed_args['after'];
* Filters the HTML output of page links for paginated posts.
* @param string $output HTML output of paginated posts' page links.
* @param array|string $args An array or query string of arguments. See wp_link_pages()
* for information on accepted arguments.
$html = apply_filters( 'wp_link_pages', $output, $args );
if ( $parsed_args['echo'] ) {
* Helper function for wp_link_pages().
* @global WP_Rewrite $wp_rewrite WordPress rewrite component.
* @param int $i Page number.
function _wp_link_page( $i ) {
if ( ! get_option( 'permalink_structure' ) || in_array( $post->post_status, array( 'draft', 'pending' ), true ) ) {
$url = add_query_arg( 'page', $i, get_permalink() );
} elseif ( 'page' === get_option( 'show_on_front' ) && (int) get_option( 'page_on_front' ) === $post->ID ) {
$url = trailingslashit( get_permalink() ) . user_trailingslashit( "$wp_rewrite->pagination_base/" . $i, 'single_paged' );
$url = trailingslashit( get_permalink() ) . user_trailingslashit( $i, 'single_paged' );
if ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) {
$query_args['preview_id'] = wp_unslash( $_GET['preview_id'] );
$query_args['preview_nonce'] = wp_unslash( $_GET['preview_nonce'] );
$url = get_preview_post_link( $post, $query_args, $url );
return '<a href="' . esc_url( $url ) . '" class="post-page-numbers">';
// Post-meta: Custom per-post fields.
* Retrieves post custom meta data field.
* @param string $key Meta data key name.
* @return array|string|false Array of values, or single value if only one element exists.
* False if the key does not exist.
function post_custom( $key = '' ) {
$custom = get_post_custom();
if ( ! isset( $custom[ $key ] ) ) {
} elseif ( 1 === count( $custom[ $key ] ) ) {
return $custom[ $key ][0];
* Displays a list of post custom fields.
* @deprecated 6.0.2 Use get_post_meta() to retrieve post meta and render manually.
_deprecated_function( __FUNCTION__, '6.0.2', 'get_post_meta()' );
$keys = get_post_custom_keys();
foreach ( (array) $keys as $key ) {
if ( is_protected_meta( $keyt, 'post' ) ) {
$values = array_map( 'trim', get_post_custom_values( $key ) );
$value = implode( ', ', $values );
"<li><span class='post-meta-key'>%s</span> %s</li>\n",
/* translators: %s: Post custom field name. */
esc_html( sprintf( _x( '%s:', 'Post custom field name' ), $key ) ),
* Filters the HTML output of the li element in the post custom fields list.
* @param string $html The HTML output for the li element.
* @param string $key Meta key.
* @param string $value Meta value.
$li_html .= apply_filters( 'the_meta_key', $html, $key, $value );
echo "<ul class='post-meta'>\n{$li_html}</ul>\n";
* Retrieves or displays a list of pages as a dropdown (select list).
* @since 4.2.0 The `$value_field` argument was added.
* @since 4.3.0 The `$class` argument was added.
* @param array|string $args {
* Optional. Array or string of arguments to generate a page dropdown. See get_pages() for additional arguments.
* @type int $depth Maximum depth. Default 0.
* @type int $child_of Page ID to retrieve child pages of. Default 0.
* @type int|string $selected Value of the option that should be selected. Default 0.
* @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1,
* or their bool equivalents. Default 1.
* @type string $name Value for the 'name' attribute of the select element.
* @type string $id Value for the 'id' attribute of the select element.
* @type string $class Value for the 'class' attribute of the select element. Default: none.
* Defaults to the value of `$name`.
* @type string $show_option_none Text to display for showing no pages. Default empty (does not display).
* @type string $show_option_no_change Text to display for "no change" option. Default empty (does not display).
* @type string $option_none_value Value to use when no page is selected. Default empty.
* @type string $value_field Post field used to populate the 'value' attribute of the option
* elements. Accepts any valid post field. Default 'ID'.
* @return string HTML dropdown list of pages.
function wp_dropdown_pages( $args = '' ) {
'show_option_none' => '',
'show_option_no_change' => '',
'option_none_value' => '',
$parsed_args = wp_parse_args( $args, $defaults );
$pages = get_pages( $parsed_args );
// Back-compat with old system where both id and name were based on $name argument.
if ( empty( $parsed_args['id'] ) ) {
$parsed_args['id'] = $parsed_args['name'];
if ( ! empty( $pages ) ) {
if ( ! empty( $parsed_args['class'] ) ) {
$class = " class='" . esc_attr( $parsed_args['class'] ) . "'";
$output = "<select name='" . esc_attr( $parsed_args['name'] ) . "'" . $class . " id='" . esc_attr( $parsed_args['id'] ) . "'>\n";
if ( $parsed_args['show_option_no_change'] ) {
$output .= "\t<option value=\"-1\">" . $parsed_args['show_option_no_change'] . "</option>\n";
if ( $parsed_args['show_option_none'] ) {
$output .= "\t<option value=\"" . esc_attr( $parsed_args['option_none_value'] ) . '">' . $parsed_args['show_option_none'] . "</option>\n";
$output .= walk_page_dropdown_tree( $pages, $parsed_args['depth'], $parsed_args );
$output .= "</select>\n";
* Filters the HTML output of a list of pages as a dropdown.
* @since 4.4.0 `$parsed_args` and `$pages` added as arguments.
* @param string $output HTML output for dropdown list of pages.
* @param array $parsed_args The parsed arguments array. See wp_dropdown_pages()
* for information on accepted arguments.
* @param WP_Post[] $pages Array of the page objects.
$html = apply_filters( 'wp_dropdown_pages', $output, $parsed_args, $pages );
if ( $parsed_args['echo'] ) {
* Retrieves or displays a list of pages (or hierarchical post type items) in list (li) format.
* @since 4.7.0 Added the `item_spacing` argument.
* @global WP_Query $wp_query WordPress Query object.
* @param array|string $args {
* Optional. Array or string of arguments to generate a list of pages. See get_pages() for additional arguments.
* @type int $child_of Display only the sub-pages of a single page by ID. Default 0 (all pages).
* @type string $authors Comma-separated list of author IDs. Default empty (all authors).
* @type string $date_format PHP date format to use for the listed pages. Relies on the 'show_date' parameter.
* Default is the value of 'date_format' option.
* @type int $depth Number of levels in the hierarchy of pages to include in the generated list.
* Accepts -1 (any depth), 0 (all pages), 1 (top-level pages only), and n (pages to
* the given n depth). Default 0.
* @type bool $echo Whether or not to echo the list of pages. Default true.
* @type string $exclude Comma-separated list of page IDs to exclude. Default empty.
* @type array $include Comma-separated list of page IDs to include. Default empty.
* @type string $link_after Text or HTML to follow the page link label. Default null.
* @type string $link_before Text or HTML to precede the page link label. Default null.
* @type string $post_type Post type to query for. Default 'page'.
* @type string|array $post_status Comma-separated list or array of post statuses to include. Default 'publish'.
* @type string $show_date Whether to display the page publish or modified date for each page. Accepts
* 'modified' or any other value. An empty value hides the date. Default empty.
* @type string $sort_column Comma-separated list of column names to sort the pages by. Accepts 'post_author',
* 'post_date', 'post_title', 'post_name', 'post_modified', 'post_modified_gmt',
* 'menu_order', 'post_parent', 'ID', 'rand', or 'comment_count'. Default 'post_title'.
* @type string $title_li List heading. Passing a null or empty value will result in no heading, and the list
* will not be wrapped with unordered list `<ul>` tags. Default 'Pages'.
* @type string $item_spacing Whether to preserve whitespace within the menu's HTML. Accepts 'preserve' or 'discard'.
* @type Walker $walker Walker instance to use for listing pages. Default empty which results in a
* Walker_Page instance being used.
* @return void|string Void if 'echo' argument is true, HTML list of pages if 'echo' is false.
function wp_list_pages( $args = '' ) {
'date_format' => get_option( 'date_format' ),
'title_li' => __( 'Pages' ),
'sort_column' => 'menu_order, post_title',
'item_spacing' => 'preserve',
$parsed_args = wp_parse_args( $args, $defaults );
if ( ! in_array( $parsed_args['item_spacing'], array( 'preserve', 'discard' ), true ) ) {
// Invalid value, fall back to default.
$parsed_args['item_spacing'] = $defaults['item_spacing'];
// Sanitize, mostly to keep spaces out.
$parsed_args['exclude'] = preg_replace( '/[^0-9,]/', '', $parsed_args['exclude'] );
// Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array).
$exclude_array = ( $parsed_args['exclude'] ) ? explode( ',', $parsed_args['exclude'] ) : array();
* Filters the array of pages to exclude from the pages list.
* @param string[] $exclude_array An array of page IDs to exclude.
$parsed_args['exclude'] = implode( ',', apply_filters( 'wp_list_pages_excludes', $exclude_array ) );
$parsed_args['hierarchical'] = 0;
$pages = get_pages( $parsed_args );
if ( ! empty( $pages ) ) {
if ( $parsed_args['title_li'] ) {
$output .= '<li class="pagenav">' . $parsed_args['title_li'] . '<ul>';
if ( is_page() || is_attachment() || $wp_query->is_posts_page ) {
$current_page = get_queried_object_id();
} elseif ( is_singular() ) {
$queried_object = get_queried_object();
if ( is_post_type_hierarchical( $queried_object->post_type ) ) {
$current_page = $queried_object->ID;
$output .= walk_page_tree( $pages, $parsed_args['depth'], $current_page, $parsed_args );
if ( $parsed_args['title_li'] ) {
* Filters the HTML output of the pages to list.
* @since 4.4.0 `$pages` added as arguments.
* @param string $output HTML output of the pages list.
* @param array $parsed_args An array of page-listing arguments. See wp_list_pages()
* for information on accepted arguments.
* @param WP_Post[] $pages Array of the page objects.
$html = apply_filters( 'wp_list_pages', $output, $parsed_args, $pages );
if ( $parsed_args['echo'] ) {
* Displays or retrieves a list of pages with an optional home link.
* The arguments are listed below and part of the arguments are for wp_list_pages() function.
* Check that function for more info on those arguments.
* @since 4.4.0 Added `menu_id`, `container`, `before`, `after`, and `walker` arguments.
* @since 4.7.0 Added the `item_spacing` argument.
* @param array|string $args {
* Optional. Array or string of arguments to generate a page menu. See wp_list_pages() for additional arguments.
* @type string $sort_column How to sort the list of pages. Accepts post column names.
* Default 'menu_order, post_title'.
* @type string $menu_id ID for the div containing the page list. Default is empty string.
* @type string $menu_class Class to use for the element containing the page list. Default 'menu'.
* @type string $container Element to use for the element containing the page list. Default 'div'.
* @type bool $echo Whether to echo the list or return it. Accepts true (echo) or false (return).
* @type int|bool|string $show_home Whether to display the link to the home page. Can just enter the text
* you'd like shown for the home link. 1|true defaults to 'Home'.
* @type string $link_before The HTML or text to prepend to $show_home text. Default empty.
* @type string $link_after The HTML or text to append to $show_home text. Default empty.
* @type string $before The HTML or text to prepend to the menu. Default is '<ul>'.
* @type string $after The HTML or text to append to the menu. Default is '</ul>'.
* @type string $item_spacing Whether to preserve whitespace within the menu's HTML. Accepts 'preserve'
* or 'discard'. Default 'discard'.
* @type Walker $walker Walker instance to use for listing pages. Default empty which results in a
* Walker_Page instance being used.
* @return void|string Void if 'echo' argument is true, HTML menu if 'echo' is false.
function wp_page_menu( $args = array() ) {
'sort_column' => 'menu_order, post_title',
'item_spacing' => 'discard',
$args = wp_parse_args( $args, $defaults );
if ( ! in_array( $args['item_spacing'], array( 'preserve', 'discard' ), true ) ) {
// Invalid value, fall back to default.
$args['item_spacing'] = $defaults['item_spacing'];
if ( 'preserve' === $args['item_spacing'] ) {
* Filters the arguments used to generate a page-based menu.
* @param array $args An array of page menu arguments. See wp_page_menu()
* for information on accepted arguments.
$args = apply_filters( 'wp_page_menu_args', $args );
// Show Home in the menu.
if ( ! empty( $args['show_home'] ) ) {
if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) {
$text = $args['show_home'];
if ( is_front_page() && ! is_paged() ) {
$class = 'class="current_page_item"';
$menu .= '<li ' . $class . '><a href="' . esc_url( home_url( '/' ) ) . '">' . $args['link_before'] . $text . $args['link_after'] . '</a></li>';
// If the front page is a page, add it to the exclude list.
if ( 'page' === get_option( 'show_on_front' ) ) {
if ( ! empty( $list_args['exclude'] ) ) {
$list_args['exclude'] .= ',';
$list_args['exclude'] = '';
$list_args['exclude'] .= get_option( 'page_on_front' );
$list_args['echo'] = false;
$list_args['title_li'] = '';
$menu .= wp_list_pages( $list_args );
$container = sanitize_text_field( $args['container'] );
// Fallback in case `wp_nav_menu()` was called without a container.
if ( empty( $container ) ) {
// wp_nav_menu() doesn't set before and after.
if ( isset( $args['fallback_cb'] ) &&
'wp_page_menu' === $args['fallback_cb'] &&