BP_Activity_Feed
Create a RSS feed using the activity component.
Description Description
You should only construct a new feed when you’ve validated that you’re on the appropriate screen.
Parameters Parameters
- $args
-
(Required)
- 'id'
(string) Required. Internal id for the feed; should be alphanumeric only. - 'title'
(string) Optional. RSS feed title. - 'link'
(string) Optional. Relevant link for the RSS feed. - 'description'
(string) Optional. RSS feed description. - 'ttl'
(string) Optional. Time-to-live. (see inline doc in constructor) - 'update_period'
(string) Optional. Part of the syndication module. (see inline doc in constructor for more info) - 'update_frequency'
(string) Optional. Part of the syndication module. (see inline doc in constructor for more info) - 'max'
(string) Optional. Number of feed items to display. - 'activity_args'
(array) Optional. Arguments passed to bp_has_activities()
- 'id'
Source Source
File: bp-activity/classes/class-bp-activity-feed.php
class BP_Activity_Feed { /** * Holds our custom class properties. * * These variables are stored in a protected array that is magically * updated using PHP 5.2+ methods. * * @see BP_Feed::__construct() This is where $data is added. * * @since 1.8.0 * @var array */ protected $data; /** * Magic method for checking the existence of a certain data variable. * * @since 1.8.0 * * @param string $key Property to check. * @return bool Whether or not data variable exists. */ public function __isset( $key ) { return isset( $this->data[$key] ); } /** * Magic method for getting a certain data variable. * * @since 1.8.0 * * @param string $key Property to get. * @return mixed Data in variable if available or null. */ public function __get( $key ) { return isset( $this->data[$key] ) ? $this->data[$key] : null; } /** * Magic method for setting a certain data variable. * * @since 2.4.0 * * @param string $key The property to set. * @param mixed $value The value to set. */ public function __set( $key, $value ) { $this->data[$key] = $value; } /** * Constructor. * * @since 1.8.0 * * @param array $args Optional. */ public function __construct( $args = array() ) { /** * Filters if BuddyPress should consider feeds enabled. If disabled, it will return early. * * @since 1.8.0 * * @param bool true Default true aka feeds are enabled. */ if ( false === (bool) apply_filters( 'bp_activity_enable_feeds', true ) ) { global $wp_query; // Set feed flag to false. $wp_query->is_feed = false; return false; } // Setup data. $this->data = wp_parse_args( $args, array( // Internal identifier for the RSS feed - should be alphanumeric only. 'id' => '', // RSS title - should be plain-text. 'title' => '', // Relevant link for the RSS feed. 'link' => '', // RSS description - should be plain-text. 'description' => '', // Time-to-live - number of minutes to cache the data before an aggregator // requests it again. This is only acknowledged if the RSS client supports it // // See: http://www.rssboard.org/rss-profile#element-channel-ttl. // See: http://www.kbcafe.com/rss/rssfeedstate.html#ttl. 'ttl' => '30', // Syndication module - similar to ttl, but not really supported by RSS // clients // // See: http://web.resource.org/rss/1.0/modules/syndication/#description. // See: http://www.kbcafe.com/rss/rssfeedstate.html#syndicationmodule. 'update_period' => 'hourly', 'update_frequency' => 2, // Number of items to display. 'max' => 50, // Activity arguments passed to bp_has_activities(). 'activity_args' => array() ) ); /** * Fires before the feed is setup so plugins can modify. * * @since 1.8.0 * * @param BP_Activity_Feed $this Current instance of activity feed. Passed by reference. */ do_action_ref_array( 'bp_activity_feed_prefetch', array( &$this ) ); // Setup class properties. $this->setup_properties(); // Check if id is valid. if ( empty( $this->id ) ) { _doing_it_wrong( 'BP_Activity_Feed', __( "RSS feed 'id' must be defined", 'buddypress' ), 'BP 1.8' ); return false; } /** * Fires after the feed is setup so plugins can modify. * * @since 1.8.0 * * @param BP_Activity_Feed $this Current instance of activity feed. Passed by reference. */ do_action_ref_array( 'bp_activity_feed_postfetch', array( &$this ) ); // Setup feed hooks. $this->setup_hooks(); // Output the feed. $this->output(); // Kill the rest of the output. die(); } /** SETUP ****************************************************************/ /** * Setup and validate the class properties. * * @since 1.8.0 */ protected function setup_properties() { $this->id = sanitize_title( $this->id ); $this->title = strip_tags( $this->title ); $this->link = esc_url_raw( $this->link ); $this->description = strip_tags( $this->description ); $this->ttl = (int) $this->ttl; $this->update_period = strip_tags( $this->update_period ); $this->update_frequency = (int) $this->update_frequency; $this->activity_args = wp_parse_args( $this->activity_args, array( 'max' => $this->max, 'per_page' => $this->max, 'display_comments' => 'stream' ) ); } /** * Setup some hooks that are used in the feed. * * Currently, these hooks are used to maintain backwards compatibility with * the RSS feeds previous to BP 1.8. * * @since 1.8.0 */ protected function setup_hooks() { add_action( 'bp_activity_feed_rss_attributes', array( $this, 'backpat_rss_attributes' ) ); add_action( 'bp_activity_feed_channel_elements', array( $this, 'backpat_channel_elements' ) ); add_action( 'bp_activity_feed_item_elements', array( $this, 'backpat_item_elements' ) ); } /** BACKPAT HOOKS ********************************************************/ /** * Fire a hook to ensure backward compatibility for RSS attributes. * * @since 1.8.0 */ public function backpat_rss_attributes() { /** * Fires inside backpat_rss_attributes method for backwards compatibility related to RSS attributes. * * This hook was originally separated out for individual components but has since been abstracted into the BP_Activity_Feed class. * * @since 1.0.0 */ do_action( 'bp_activity_' . $this->id . '_feed' ); } /** * Fire a hook to ensure backward compatibility for channel elements. * * @since 1.8.0 */ public function backpat_channel_elements() { /** * Fires inside backpat_channel_elements method for backwards compatibility related to RSS channel elements. * * This hook was originally separated out for individual components but has since been abstracted into the BP_Activity_Feed class. * * @since 1.0.0 */ do_action( 'bp_activity_' . $this->id . '_feed_head' ); } /** * Fire a hook to ensure backward compatibility for item elements. * * @since 1.8.0 */ public function backpat_item_elements() { switch ( $this->id ) { // Sitewide and friends feeds use the 'personal' hook. case 'sitewide' : case 'friends' : $id = 'personal'; break; default : $id = $this->id; break; } /** * Fires inside backpat_item_elements method for backwards compatibility related to RSS item elements. * * This hook was originally separated out for individual components but has since been abstracted into the BP_Activity_Feed class. * * @since 1.0.0 */ do_action( 'bp_activity_' . $id . '_feed_item' ); } /** HELPERS **************************************************************/ /** * Output the feed's item content. * * @since 1.8.0 */ protected function feed_content() { bp_activity_content_body(); switch ( $this->id ) { // Also output parent activity item if we're on a specific feed. case 'favorites' : case 'friends' : case 'mentions' : case 'personal' : if ( 'activity_comment' == bp_get_activity_action_name() ) : ?> <strong><?php _e( 'In reply to', 'buddypress' ) ?></strong> - <?php bp_activity_parent_content() ?> <?php endif; break; } } /** * Sets various HTTP headers related to Content-Type and browser caching. * * Most of this class method is derived from {@link WP::send_headers()}. * * @since 1.9.0 */ protected function http_headers() { // Set up some additional headers if not on a directory page // this is done b/c BP uses pseudo-pages. if ( ! bp_is_directory() ) { global $wp_query; $wp_query->is_404 = false; status_header( 200 ); } // Set content-type. @header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true ); send_nosniff_header(); // Cache-related variables. $last_modified = mysql2date( 'D, d M Y H:i:s O', bp_activity_get_last_updated(), false ); $modified_timestamp = strtotime( $last_modified ); $etag = md5( $last_modified ); // Set cache-related headers. @header( 'Last-Modified: ' . $last_modified ); @header( 'Pragma: no-cache' ); @header( 'ETag: ' . '"' . $etag . '"' ); // First commit of BuddyPress! (Easter egg). @header( 'Expires: Tue, 25 Mar 2008 17:13:55 GMT'); // Get ETag from supported user agents. if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) { $client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] ); // Remove quotes from ETag. $client_etag = trim( $client_etag, '"' ); // Strip suffixes from ETag if they exist (eg. "-gzip"). $etag_suffix_pos = strpos( $client_etag, '-' ); if ( ! empty( $etag_suffix_pos ) ) { $client_etag = substr( $client_etag, 0, $etag_suffix_pos ); } // No ETag found. } else { $client_etag = false; } // Get client last modified timestamp from supported user agents. $client_last_modified = empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ? '' : trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ); $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; // Set 304 status if feed hasn't been updated since last fetch. if ( ( $client_last_modified && $client_etag ) ? ( ( $client_modified_timestamp >= $modified_timestamp ) && ( $client_etag == $etag ) ) : ( ( $client_modified_timestamp >= $modified_timestamp ) || ( $client_etag == $etag ) ) ) { $status = 304; } else { $status = false; } // If feed hasn't changed as reported by the user agent, set 304 status header. if ( ! empty( $status ) ) { status_header( $status ); // Cached response, so stop now! if ( $status == 304 ) { exit(); } } } /** OUTPUT ***************************************************************/ /** * Output the RSS feed. * * @since 1.8.0 */ protected function output() { $this->http_headers(); echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?'.'>'; ?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" <?php /** * Fires at the end of the opening RSS tag for feed output so plugins can add extra attributes. * * @since 1.8.0 */ do_action( 'bp_activity_feed_rss_attributes' ); ?> > <channel> <title><?php echo $this->title; ?></title> <link><?php echo $this->link; ?></link> <atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" /> <description><?php echo $this->description ?></description> <lastBuildDate><?php echo mysql2date( 'D, d M Y H:i:s O', bp_activity_get_last_updated(), false ); ?></lastBuildDate> <generator>https://buddypress.org/?v=<?php bp_version(); ?></generator> <language><?php bloginfo_rss( 'language' ); ?></language> <ttl><?php echo $this->ttl; ?></ttl> <sy:updatePeriod><?php echo $this->update_period; ?></sy:updatePeriod> <sy:updateFrequency><?php echo $this->update_frequency; ?></sy:updateFrequency> <?php /** * Fires at the end of channel elements list in RSS feed so plugins can add extra channel elements. * * @since 1.8.0 */ do_action( 'bp_activity_feed_channel_elements' ); ?> <?php if ( bp_has_activities( $this->activity_args ) ) : ?> <?php while ( bp_activities() ) : bp_the_activity(); ?> <item> <guid isPermaLink="false"><?php bp_activity_feed_item_guid(); ?></guid> <title><?php echo stripslashes( bp_get_activity_feed_item_title() ); ?></title> <link><?php bp_activity_thread_permalink() ?></link> <pubDate><?php echo mysql2date( 'D, d M Y H:i:s O', bp_get_activity_feed_item_date(), false ); ?></pubDate> <?php if ( bp_get_activity_feed_item_description() ) : ?> <content:encoded><![CDATA[<?php $this->feed_content(); ?>]]></content:encoded> <?php endif; ?> <?php if ( bp_activity_can_comment() ) : ?> <slash:comments><?php bp_activity_comment_count(); ?></slash:comments> <?php endif; ?> <?php /** * Fires at the end of the individual RSS Item list in RSS feed so plugins can add extra item elements. * * @since 1.8.0 */ do_action( 'bp_activity_feed_item_elements' ); ?> </item> <?php endwhile; ?> <?php endif; ?> </channel> </rss><?php } }
Changelog Changelog
Version | Description |
---|---|
1.8.0 | Introduced. |
Methods Methods
- __construct — Constructor.
- __get — Magic method for getting a certain data variable.
- __isset — Magic method for checking the existence of a certain data variable.
- __set — Magic method for setting a certain data variable.
- backpat_channel_elements — Fire a hook to ensure backward compatibility for channel elements.
- backpat_item_elements — Fire a hook to ensure backward compatibility for item elements.
- backpat_rss_attributes — Fire a hook to ensure backward compatibility for RSS attributes.
- feed_content — Output the feed's item content.
- http_headers — Sets various HTTP headers related to Content-Type and browser caching.
- output — Output the RSS feed.
- setup_hooks — Setup some hooks that are used in the feed.
- setup_properties — Setup and validate the class properties.