函数文档

get_pagenum_link()

💡 云策文档标注

概述

get_pagenum_link() 函数用于获取指定页码的链接 URL,支持处理固定链接和查询字符串参数,并可选择是否对 URL 进行转义。

关键要点

  • 函数接受两个参数:$pagenum(页码,默认 1)和 $escape(是否转义 URL,默认 true)。
  • 根据 WordPress 的固定链接设置(WP_Rewrite)动态构建 URL,处理分页基础路径和查询参数。
  • 返回字符串类型的链接 URL,可通过 apply_filters('get_pagenum_link', $result, $pagenum) 钩子进行过滤。
  • 内部使用 esc_url() 或 sanitize_url() 进行 URL 清理,确保安全性。

代码示例

function get_pagenum_link( $pagenum = 1, $escape = true ) {
    global $wp_rewrite;

    $pagenum = (int) $pagenum;

    $request = remove_query_arg( 'paged' );

    $home_root = parse_url( home_url() );
    $home_root = ( isset( $home_root['path'] ) ) ? $home_root['path'] : '';
    $home_root = preg_quote( $home_root, '|' );

    $request = preg_replace( '|^' . $home_root . '|i', '', $request );
    $request = preg_replace( '|^/+|', '', $request );

    if ( ! $wp_rewrite->using_permalinks() || is_admin() ) {
        $base = trailingslashit( get_bloginfo( 'url' ) );

        if ( $pagenum > 1 ) {
            $result = add_query_arg( 'paged', $pagenum, $base . $request );
        } else {
            $result = $base . $request;
        }
    } else {
        $qs_regex = '|?.*?$|';
        preg_match( $qs_regex, $request, $qs_match );

        $parts   = array();
        $parts[] = untrailingslashit( get_bloginfo( 'url' ) );

        if ( ! empty( $qs_match[0] ) ) {
            $query_string = $qs_match[0];
            $request      = preg_replace( $qs_regex, '', $request );
        } else {
            $query_string = '';
        }

        $request = preg_replace( "|$wp_rewrite->pagination_base/d+/?$|", '', $request );
        $request = preg_replace( '|^' . preg_quote( $wp_rewrite->index, '|' ) . '|i', '', $request );
        $request = ltrim( $request, '/' );

        if ( $wp_rewrite->using_index_permalinks() && ( $pagenum > 1 || '' !== $request ) ) {
            $parts[] = $wp_rewrite->index;
        }

        $parts[] = untrailingslashit( $request );

        if ( $pagenum > 1 ) {
            $parts[] = $wp_rewrite->pagination_base;
            $parts[] = $pagenum;
        }

        $result = user_trailingslashit( implode( '/', array_filter( $parts ) ), 'paged' );
        if ( ! empty( $query_string ) ) {
            $result .= $query_string;
        }
    }

    $result = apply_filters( 'get_pagenum_link', $result, $pagenum );

    if ( $escape ) {
        return esc_url( $result );
    } else {
        return sanitize_url( $result );
    }
}

注意事项

  • 函数内部依赖全局变量 $wp_rewrite 来判断固定链接设置,需确保 WordPress 环境已初始化。
  • 当 $escape 参数为 true 时,使用 esc_url() 转义 URL,适合前端显示;为 false 时使用 sanitize_url(),适合数据库存储或重定向。
  • 钩子 apply_filters('get_pagenum_link', $result, $pagenum) 允许开发者自定义生成的链接。

📄 原文内容

Retrieves the link for a page number.

Parameters

$pagenumintoptional
Page number.

Default:1

$escapebooloptional
Whether to escape the URL for display, with esc_url() .
If set to false, prepares the URL with sanitize_url() .

Default:true

Return

string The link URL for the given page number.

Source

function get_pagenum_link( $pagenum = 1, $escape = true ) {
	global $wp_rewrite;

	$pagenum = (int) $pagenum;

	$request = remove_query_arg( 'paged' );

	$home_root = parse_url( home_url() );
	$home_root = ( isset( $home_root['path'] ) ) ? $home_root['path'] : '';
	$home_root = preg_quote( $home_root, '|' );

	$request = preg_replace( '|^' . $home_root . '|i', '', $request );
	$request = preg_replace( '|^/+|', '', $request );

	if ( ! $wp_rewrite->using_permalinks() || is_admin() ) {
		$base = trailingslashit( get_bloginfo( 'url' ) );

		if ( $pagenum > 1 ) {
			$result = add_query_arg( 'paged', $pagenum, $base . $request );
		} else {
			$result = $base . $request;
		}
	} else {
		$qs_regex = '|?.*?$|';
		preg_match( $qs_regex, $request, $qs_match );

		$parts   = array();
		$parts[] = untrailingslashit( get_bloginfo( 'url' ) );

		if ( ! empty( $qs_match[0] ) ) {
			$query_string = $qs_match[0];
			$request      = preg_replace( $qs_regex, '', $request );
		} else {
			$query_string = '';
		}

		$request = preg_replace( "|$wp_rewrite->pagination_base/d+/?$|", '', $request );
		$request = preg_replace( '|^' . preg_quote( $wp_rewrite->index, '|' ) . '|i', '', $request );
		$request = ltrim( $request, '/' );

		if ( $wp_rewrite->using_index_permalinks() && ( $pagenum > 1 || '' !== $request ) ) {
			$parts[] = $wp_rewrite->index;
		}

		$parts[] = untrailingslashit( $request );

		if ( $pagenum > 1 ) {
			$parts[] = $wp_rewrite->pagination_base;
			$parts[] = $pagenum;
		}

		$result = user_trailingslashit( implode( '/', array_filter( $parts ) ), 'paged' );
		if ( ! empty( $query_string ) ) {
			$result .= $query_string;
		}
	}

	/**
	 * Filters the page number link for the current request.
	 *
	 * @since 2.5.0
	 * @since 5.2.0 Added the `$pagenum` argument.
	 *
	 * @param string $result  The page number link.
	 * @param int    $pagenum The page number.
	 */
	$result = apply_filters( 'get_pagenum_link', $result, $pagenum );

	if ( $escape ) {
		return esc_url( $result );
	} else {
		return sanitize_url( $result );
	}
}

Hooks

apply_filters( ‘get_pagenum_link’, string $result, int $pagenum )

Filters the page number link for the current request.

Changelog

Version Description
1.5.0 Introduced.