add_feed( string $feedname, callable $callback ): string

Adds a new feed type like /atom1/.

Parameters

$feednamestringrequired
Feed name.
$callbackcallablerequired
Callback to run on feed display.

Return

string Feed action name.

More Information

Requires one-time use of flush_rules() to take effect.

$feedname parameter should not start with ‘_‘. Please refer #59945.

Source

function add_feed( $feedname, $callback ) {
	global $wp_rewrite;

	if ( ! in_array( $feedname, $wp_rewrite->feeds, true ) ) {
		$wp_rewrite->feeds[] = $feedname;
	}

	$hook = 'do_feed_' . $feedname;

	// Remove default function hook.
	remove_action( $hook, $hook );

	add_action( $hook, $callback, 10, 2 );

	return $hook;
}

Changelog

VersionDescription
2.1.0Introduced.

User Contributed Notes

  1. Skip to note 5 content

    When a new custom feed is added, the endpoint will render using a `Content-Type: application/octet-stream; charset=UTF-8` by default. It would be useful to document working with content types in combination with add_feed() .

    For example either:

    function add_custom_feed() {
    	add_feed( 'custom', 'render_custom_feed' );
    }
    add_action( 'init', 'add_custom_feed' );
    
    function render_custom_feed() {
    	header( 'Content-Type: application/rss+xml' );
    	echo 'aye!';
    }

    or:

    function add_custom_feed() {
    	add_feed( 'custom', 'render_custom_feed' );
    }
    add_action( 'init', 'add_custom_feed' );
    
    
    function custom_feed_content_type( $content_type, $type ) {
    	if( 'custom' == $type ) {
    		$content_type = 'application/rss+xml';
    	}
    	return $content_type;
    }
    add_filter( 'feed_content_type', 'custom_feed_content_type', 10, 2 );
    
    function render_custom_feed() {
    	echo 'aye!';
    }

    will work.

    See: https://core.trac.wordpress.org/ticket/36334

  2. Skip to note 6 content

    Usage of add_feed()

    function wpdocs_add_mwb_feed() {
        add_feed( 'mwbfeed', 'wpdocs_makewebbetter_feed' );
    }
    add_action( 'init', 'wpdocs_add_mwb_feed' );
    
    function wpdocs_makewebbetter_feed() {
        add_filter( 'pre_option_rss_use_excerpt', '__return_zero' );
        load_template( PATHTEMPLATEFILE . '/feeds/a-feed-template.php' );
    }
  3. Skip to note 7 content

    RSS Feed based on custom WP Query with parameters

    add_action( 'init', 'wpdocs_custom_feed_rss2' );
    function wpdocs_custom_feed_rss2() {
    
        // Create your feed name like this : https://yoursite.com/wpdocs_custom?tag=test
        add_feed( 'wpdocs_custom', 'wpdocs_change_main_query' );
        function wpdocs_change_main_query() {
    
            // Set right headers for RSS Feed
            header( 'Content-Type: application/rss+xml' );
    
            // Get main WP Query
            global $wp_query;
    
            // Get parameters in url
            if ( ! empty( $_GET['tag'] ) ) :
                $tag = $_GET['tag'];
            endif;
    
            // Overwrite main WP Query with yours
            $wp_query = new WP_Query(
                array(
                    'post_type' => 'any',
                    'fields'    => 'ids',
                    'tag'       => $tag,
                )
            );
    
            // Use the basic template to load your custom RSS Feed
            get_template_part( 'feed', 'rss2' );
        }
    }
  4. Skip to note 8 content

    The Feed name Parameters $feedname(required) should not start with `_` if it start with this then we will recieve the wp_die error message.

    function feed2_callback( $is_comment_feed, $feed ) {
    	header( 'Content-Type: application/xml; charset=UTF-8', true );
    	echo '';
    ?>
    
    	Test
    
    <?php
    }
    
    add_feed( '_feed2', 'feed2_callback' );

    Next, update the rewrite rule and access http://localhost/_feed2, which will return wp_die with 404 status.

    This is not a problem with the code I tried, but because the “_” at the beginning of the feed name is removed in the do_feed function.

    function do_feed() {
    	global $wp_query;
    
    	$feed = get_query_var( 'feed' );
    
    	// Remove the pad, if present.
    	$feed = preg_replace( '/^_+/', '', $feed );

    This process results in an action name of 'do_feed_' . 'feed2' when $feed is '_feed2'.

    Since this is not done in the add_feed function and the action name specified in the add_action function is 'do_feed_' . '_feed2', since the two action names do not match, which resulting in the error indicated in the response.

You must log in before being able to contribute a note or feedback.