函数文档

get_adjacent_post_link()

💡 云策文档标注

概述

get_adjacent_post_link() 函数用于检索相邻文章的链接,可以是上一篇或下一篇。它接受多个参数来控制链接的格式、分类限制和方向,并返回链接的 HTML 字符串。

关键要点

  • 函数返回相邻文章(上一篇或下一篇)的链接 URL,基于当前文章。
  • 参数包括 $format(链接锚点格式)、$link(链接永久链接格式)、$in_same_term(是否在同一分类术语中)、$excluded_terms(排除的术语 ID)、$previous(是否为上一篇)和 $taxonomy(分类法)。
  • 内部使用 get_adjacent_post() 获取相邻文章,并应用过滤器如 the_title 和 {$adjacent}_post_link 进行自定义。
  • 支持动态 Hook,如 next_post_link 和 previous_post_link,用于过滤输出。

代码示例

function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
    if ( $previous && is_attachment() ) {
        $post = get_post( get_post()->post_parent );
    } else {
        $post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );
    }

    if ( ! $post ) {
        $output = '';
    } else {
        $title = $post->post_title;

        if ( empty( $post->post_title ) ) {
            $title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );
        }

        /** This filter is documented in wp-includes/post-template.php */
        $title = apply_filters( 'the_title', $title, $post->ID );

        $date = mysql2date( get_option( 'date_format' ), $post->post_date );
        $rel  = $previous ? 'prev' : 'next';

        $string = '';
        $inlink = str_replace( '%title', $title, $link );
        $inlink = str_replace( '%date', $date, $inlink );
        $inlink = $string . $inlink . '';

        $output = str_replace( '%link', $inlink, $format );
    }

    $adjacent = $previous ? 'previous' : 'next';

    /**
     * Filters the adjacent post link.
     *
     * The dynamic portion of the hook name, `$adjacent`, refers to the type
     * of adjacency, 'next' or 'previous'.
     *
     * Possible hook names include:
     *
     *  - `next_post_link`
     *  - `previous_post_link`
     *
     * @since 2.6.0
     * @since 4.2.0 Added the `$adjacent` parameter.
     *
     * @param string         $output   The adjacent post link.
     * @param string         $format   Link anchor format.
     * @param string         $link     Link permalink format.
     * @param WP_Post|string $post     The adjacent post. Empty string if no corresponding post exists.
     * @param string         $adjacent Whether the post is previous or next.
     */
    return apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post, $adjacent );
}

注意事项

  • 当 $previous 为 true 且当前页面是附件时,函数会获取附件的父文章作为相邻文章。
  • 如果文章标题为空,会使用默认的“Previous Post”或“Next Post”翻译文本。
  • 输出可通过 the_title 和 {$adjacent}_post_link 过滤器进行自定义,增强灵活性。

📄 原文内容

Retrieves the adjacent post link.

Description

Can be either next post link or previous.

Parameters

$formatstringrequired
Link anchor format.
$linkstringrequired
Link permalink format.
$in_same_termbooloptional
Whether link should be in the same taxonomy term.

Default:false

$excluded_termsint[]|stringoptional
Array or comma-separated list of excluded terms IDs.
Default empty.
$previousbooloptional
Whether to display link to previous or next post.

Default:true

$taxonomystringoptional
Taxonomy, if $in_same_term is true. Default 'category'.

Return

string The link URL of the previous or next post in relation to the current post.

Source

function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	if ( $previous && is_attachment() ) {
		$post = get_post( get_post()->post_parent );
	} else {
		$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );
	}

	if ( ! $post ) {
		$output = '';
	} else {
		$title = $post->post_title;

		if ( empty( $post->post_title ) ) {
			$title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );
		}

		/** This filter is documented in wp-includes/post-template.php */
		$title = apply_filters( 'the_title', $title, $post->ID );

		$date = mysql2date( get_option( 'date_format' ), $post->post_date );
		$rel  = $previous ? 'prev' : 'next';

		$string = '<a href="' . get_permalink( $post ) . '" rel="' . $rel . '">';
		$inlink = str_replace( '%title', $title, $link );
		$inlink = str_replace( '%date', $date, $inlink );
		$inlink = $string . $inlink . '</a>';

		$output = str_replace( '%link', $inlink, $format );
	}

	$adjacent = $previous ? 'previous' : 'next';

	/**
	 * Filters the adjacent post link.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `next_post_link`
	 *  - `previous_post_link`
	 *
	 * @since 2.6.0
	 * @since 4.2.0 Added the `$adjacent` parameter.
	 *
	 * @param string         $output   The adjacent post link.
	 * @param string         $format   Link anchor format.
	 * @param string         $link     Link permalink format.
	 * @param WP_Post|string $post     The adjacent post. Empty string if no corresponding post exists.
	 * @param string         $adjacent Whether the post is previous or next.
	 */
	return apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post, $adjacent );
}

Hooks

apply_filters( ‘the_title’, string $post_title, int $post_id )

Filters the post title.

apply_filters( “{$adjacent}_post_link”, string $output, string $format, string $link, WP_Post|string $post, string $adjacent )

Filters the adjacent post link.

Changelog

Version Description
3.7.0 Introduced.