WordPress.org

Make WordPress Core

Opened 2 years ago

Last modified 6 months ago

#23692 assigned enhancement

feed_links should have a parameter to choose which feed to display

Reported by: Confridin Owned by: joostdevalk
Milestone: Awaiting Review Priority: normal
Severity: minor Version:
Component: Feeds Keywords: dev-feedback has-patch
Focuses: Cc:

Description

Hello,

feed_links is a function located in wp_includes/general_template.php. It displays 2 feeds in the header : the main feed and the comment feed. The function is activated along with feed_links_extra when automatic-feed-links support is activated.

Currently, developers can't choose if they want both feeds to be displayed, or just one of them. I think this function should be improved.

Here is the current function :

function feed_links( $args = array() ) {
	if ( !current_theme_supports('automatic-feed-links') )
		return;

	$defaults = array(
		/* translators: Separator between blog name and feed type in feed links */
		'separator'	=> _x('»', 'feed link'),
		/* translators: 1: blog title, 2: separator (raquo) */
		'feedtitle'	=> __('%1$s %2$s Feed'),
		/* translators: %s: blog title, 2: separator (raquo) */
		'comstitle'	=> __('%1$s %2$s Comments Feed'),
	);

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

	echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr(sprintf( $args['feedtitle'], get_bloginfo('name'), $args['separator'] )) . '" href="' . get_feed_link() . "\" />\n";
	echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr(sprintf( $args['comstitle'], get_bloginfo('name'), $args['separator'] )) . '" href="' . get_feed_link( 'comments_' . get_default_feed() ) . "\" />\n";
}

Currently, the only way to display only one feed (the main post feed or the main comment feed) so is to deactivate feed_links with :

remove_action('wp_head', 'feed_links', 2);

and then to create our own function to only display one feed.

Do you think this should be improved ?

Regards,

Attachments (2)

general-template.patch (1.4 KB) - added by joostdevalk 9 months ago.
Patch
23692.patch (2.1 KB) - added by juliobox 9 months ago.
My patch :)

Download all attachments as: .zip

Change History (12)

comment:1 @alexvorn22 years ago

to improve:

  1. to choose what to show: blog feed or/and comments feed
  1. to include a filter for each feed: maybe someone wants a custom feed like a feedburner url...
Last edited 2 years ago by alexvorn2 (previous) (diff)

comment:2 @alexvorn22 years ago

  • Keywords needs-patch added

comment:3 @Confridin2 years ago

I think it could be improved this way :

// Default :
add_theme_support( 'automatic-feed-links');
// only main feed
add_theme_support( 'automatic-feed-links', true, false );
// only comment feed
add_theme_support( 'automatic-feed-links', false, true);
// new url for main feed
add_theme_support( 'automatic-feed-links', 'http://website.com/new-feed-url', true);
// new url for comment feed
add_theme_support( 'automatic-feed-links', true, 'http://website.com/new-feed-url');

What do you think ?

comment:4 @juliobox2 years ago

Hello i propose a simple filter :

function feed_links( $args = array() ) {
	if ( !current_theme_supports('automatic-feed-links') )
		return;

	$defaults = array(
		/* translators: Separator between blog name and feed type in feed links */
		'separator'	=> _x('&raquo;', 'feed link'),
		/* translators: 1: blog title, 2: separator (raquo) */
		'feedtitle'	=> __('%1$s %2$s Feed'),
		/* translators: %s: blog title, 2: separator (raquo) */
		'comstitle'	=> __('%1$s %2$s Comments Feed'),
	);

	$args = wp_parse_args( $args, $defaults );
	$feed_and_coms = apply_filters( 'feed_links_types', 3 ); // 1 = feed, 2 = coms, 3 = both
	if( $feed_and_coms==1 || $feed_and_coms==3 )
		echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr(sprintf( $args['feedtitle'], get_bloginfo('name'), $args['separator'] )) . '" href="' . get_feed_link() . "\" />\n";
	if( $feed_and_coms==2 || $feed_and_coms==3 )
	echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr(sprintf( $args['comstitle'], get_bloginfo('name'), $args['separator'] )) . '" href="' . get_feed_link( 'comments_' . get_default_feed() ) . "\" />\n";
}

To show only feed :

add_filter( 'feed_links_types', 'baw_show_only_feed' );
function baw_show_only_feed(){
  return 1;
}

To show only coms :

add_filter( 'feed_links_types', 'baw_show_only_coms' );
function baw_show_only_feed(){
  return 2;
}

To show both, do nothing ;)

Last edited 2 years ago by SergeyBiryukov (previous) (diff)

comment:5 @Confridin2 years ago

Great solution Julio ;)

comment:6 follow-up: @SergeyBiryukov2 years ago

The filter makes sense, however the values to check should be actual words (I'd suggest 'posts', 'comments', and 'all'), rather than numbers.

comment:7 in reply to: ↑ 6 @nacin2 years ago

Replying to SergeyBiryukov:

The filter makes sense, however the values to check should be actual words (I'd suggest 'posts', 'comments', and 'all'), rather than numbers.

Or it should filter an actual array of arguments, so one could set 'comments' => false. Or each feed can have its own filter.

comment:8 @juliobox2 years ago

  • Cc juliobosk@… added

@nacin : yes much better to filter an $args var. So, maybe 3.7 ? :]

@joostdevalk9 months ago

Patch

comment:9 @joostdevalk9 months ago

  • Keywords has-patch added; needs-patch removed
  • Owner set to joostdevalk
  • Status changed from new to assigned

Just added a patch, with each feed having its own filter. Would appreciate a review :)

@juliobox9 months ago

My patch :)

comment:10 @jrf6 months ago

My two pennies: I'd prefer Joost's patch as it'll be simpler in practical usage. See the below comparison of code needed to disable the comments feed.

Joost's patch:

add_filter( 'automatic_feed_links_show_comments_feed', '__return_false' );

Julio's patch:

add_filter( 'feed_links_types', 'my_feed_filter_function' );
function my_feed_filter_function( $array ) {
	$array['comments'] = false;
	return $array;
}

Note: See TracTickets for help on using tickets.