函数文档

feed_links_extra()

💡 云策文档标注

概述

feed_links_extra() 函数用于在 WordPress 网站中显示额外订阅源链接,如分类、标签、作者等特定内容的 RSS 或 Atom 订阅。它根据当前查询条件动态生成链接,并支持通过参数和过滤器进行自定义。

关键要点

  • 函数接受一个可选数组参数 $args,用于自定义链接标题和分隔符,默认值包括多种翻译字符串。
  • 通过条件判断(如 is_singular()、is_category() 等)检测当前页面类型,并生成相应的订阅链接。
  • 提供多个过滤器(如 feed_links_extra_args、feed_links_extra_show_category_feed 等)以控制链接显示和参数。
  • 输出链接时使用 printf 函数,包含 feed_content_type()、标题和 URL 的转义处理。

代码示例

function feed_links_extra( $args = array() ) {
    $defaults = array(
        'separator'     => _x( '»', 'feed link' ),
        'singletitle'   => __( '%1$s %2$s %3$s Comments Feed' ),
        'cattitle'      => __( '%1$s %2$s %3$s Category Feed' ),
        // 更多默认标题...
    );
    $args = wp_parse_args( $args, $defaults );
    $args = apply_filters( 'feed_links_extra_args', $args );
    // 条件逻辑生成链接...
    if ( isset( $title ) && isset( $href ) ) {
        printf(
            '<link rel="alternate" type="%s" title="%s" href="%s" />',
            feed_content_type(),
            esc_attr( $title ),
            esc_url( $href )
        );
    }
}

注意事项

  • 函数依赖于全局查询对象,使用 get_queried_object() 获取当前页面信息,避免直接依赖全局 $post。
  • 链接显示受多个过滤器控制,开发者可通过这些过滤器启用或禁用特定类型的订阅链接。
  • 输出链接时自动进行标题和 URL 的转义,确保 HTML 安全性。

📄 原文内容

Displays the links to the extra feeds such as category feeds.

Parameters

$argsarrayoptional
Optional arguments.

Default:array()

Source

function feed_links_extra( $args = array() ) {
	$defaults = array(
		/* translators: Separator between site name and feed type in feed links. */
		'separator'     => _x( '»', 'feed link' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Post title. */
		'singletitle'   => __( '%1$s %2$s %3$s Comments Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Category name. */
		'cattitle'      => __( '%1$s %2$s %3$s Category Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Tag name. */
		'tagtitle'      => __( '%1$s %2$s %3$s Tag Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Term name, 4: Taxonomy singular name. */
		'taxtitle'      => __( '%1$s %2$s %3$s %4$s Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Author name. */
		'authortitle'   => __( '%1$s %2$s Posts by %3$s Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Search query. */
		'searchtitle'   => __( '%1$s %2$s Search Results for “%3$s” Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Post type name. */
		'posttypetitle' => __( '%1$s %2$s %3$s Feed' ),
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the extra feed links arguments.
	 *
	 * @since 6.7.0
	 *
	 * @param array $args An array of extra feed links arguments.
	 */
	$args = apply_filters( 'feed_links_extra_args', $args );

	/*
	 * The template conditionals are referring to the global query, so the queried object is used rather than
	 * depending on a global $post being set.
	 */
	$queried_object = get_queried_object();
	if ( is_singular() && $queried_object instanceof WP_Post ) {
		$post = $queried_object;

		/** This filter is documented in wp-includes/general-template.php */
		$show_comments_feed = apply_filters( 'feed_links_show_comments_feed', true );

		/**
		 * Filters whether to display the post comments feed link.
		 *
		 * This filter allows to enable or disable the feed link for a singular post
		 * in a way that is independent of 'feed_links_show_comments_feed'
		 * (which controls the global comments feed). The result of that filter
		 * is accepted as a parameter.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show_comments_feed Whether to display the post comments feed link. Defaults to
		 *                                 the 'feed_links_show_comments_feed' filter result.
		 */
		$show_post_comments_feed = apply_filters( 'feed_links_extra_show_post_comments_feed', $show_comments_feed );

		if ( $show_post_comments_feed && ( comments_open( $post ) || pings_open( $post ) || (int) $post->comment_count > 0 ) ) {
			$title = sprintf(
				$args['singletitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				the_title_attribute(
					array(
						'echo' => false,
						'post' => $post,
					)
				)
			);

			$feed_link = get_post_comments_feed_link( $post->ID );

			if ( $feed_link ) {
				$href = $feed_link;
			}
		}
	} elseif ( is_post_type_archive() ) {
		/**
		 * Filters whether to display the post type archive feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the post type archive feed link. Default true.
		 */
		$show_post_type_archive_feed = apply_filters( 'feed_links_extra_show_post_type_archive_feed', true );

		if ( $show_post_type_archive_feed ) {
			$post_type = get_query_var( 'post_type' );

			if ( is_array( $post_type ) ) {
				$post_type = reset( $post_type );
			}

			$post_type_obj = get_post_type_object( $post_type );

			$title = sprintf(
				$args['posttypetitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				$post_type_obj->labels->name
			);

			$href = get_post_type_archive_feed_link( $post_type_obj->name );
		}
	} elseif ( is_category() ) {
		/**
		 * Filters whether to display the category feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the category feed link. Default true.
		 */
		$show_category_feed = apply_filters( 'feed_links_extra_show_category_feed', true );

		if ( $show_category_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$title = sprintf(
					$args['cattitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name
				);

				$href = get_category_feed_link( $term->term_id );
			}
		}
	} elseif ( is_tag() ) {
		/**
		 * Filters whether to display the tag feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the tag feed link. Default true.
		 */
		$show_tag_feed = apply_filters( 'feed_links_extra_show_tag_feed', true );

		if ( $show_tag_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$title = sprintf(
					$args['tagtitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name
				);

				$href = get_tag_feed_link( $term->term_id );
			}
		}
	} elseif ( is_tax() ) {
		/**
		 * Filters whether to display the custom taxonomy feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the custom taxonomy feed link. Default true.
		 */
		$show_tax_feed = apply_filters( 'feed_links_extra_show_tax_feed', true );

		if ( $show_tax_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$tax = get_taxonomy( $term->taxonomy );

				$title = sprintf(
					$args['taxtitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name,
					$tax->labels->singular_name
				);

				$href = get_term_feed_link( $term->term_id, $term->taxonomy );
			}
		}
	} elseif ( is_author() ) {
		/**
		 * Filters whether to display the author feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the author feed link. Default true.
		 */
		$show_author_feed = apply_filters( 'feed_links_extra_show_author_feed', true );

		if ( $show_author_feed ) {
			$author_id = (int) get_query_var( 'author' );

			$title = sprintf(
				$args['authortitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				get_the_author_meta( 'display_name', $author_id )
			);

			$href = get_author_feed_link( $author_id );
		}
	} elseif ( is_search() ) {
		/**
		 * Filters whether to display the search results feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the search results feed link. Default true.
		 */
		$show_search_feed = apply_filters( 'feed_links_extra_show_search_feed', true );

		if ( $show_search_feed ) {
			$title = sprintf(
				$args['searchtitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				get_search_query( false )
			);

			$href = get_search_feed_link();
		}
	}

	if ( isset( $title ) && isset( $href ) ) {
		printf(
			'<link rel="alternate" type="%s" title="%s" href="%s" />' . "n",
			feed_content_type(),
			esc_attr( $title ),
			esc_url( $href )
		);
	}
}

Hooks

apply_filters( ‘feed_links_extra_args’, array $args )

Filters the extra feed links arguments.

apply_filters( ‘feed_links_extra_show_author_feed’, bool $show )

Filters whether to display the author feed link.

apply_filters( ‘feed_links_extra_show_category_feed’, bool $show )

Filters whether to display the category feed link.

apply_filters( ‘feed_links_extra_show_post_comments_feed’, bool $show_comments_feed )

Filters whether to display the post comments feed link.

apply_filters( ‘feed_links_extra_show_post_type_archive_feed’, bool $show )

Filters whether to display the post type archive feed link.

apply_filters( ‘feed_links_extra_show_search_feed’, bool $show )

Filters whether to display the search results feed link.

apply_filters( ‘feed_links_extra_show_tag_feed’, bool $show )

Filters whether to display the tag feed link.

apply_filters( ‘feed_links_extra_show_tax_feed’, bool $show )

Filters whether to display the custom taxonomy feed link.

apply_filters( ‘feed_links_show_comments_feed’, bool $show )

Filters whether to display the comments feed link.

Changelog

Version Description
2.8.0 Introduced.