function podlove_jetpack_remove_rss_icon() { if (!method_exists('Jetpack_Site_Icon', 'init')) { return; } if (!($feed_slug = get_query_var('feed'))) { return; } if (!($feed = \Podlove\Model\Feed::find_one_by_slug($feed_slug))) { return; } remove_action('rss2_head', [Jetpack_Site_Icon::init(), 'rss2_icon']); }
public function __construct($feed_slug) { add_action('atom_ns', function () { echo 'xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"'; }); add_filter('feed_link', function ($output, $feed) use($feed_slug) { return get_bloginfo('url') . '/feed/' . $feed_slug . '/'; }, 10, 2); $podcast = Model\Podcast::get_instance(); $feed = Model\Feed::find_one_by_slug($feed_slug); $episode_asset = $feed->episode_asset(); $file_type = $episode_asset->file_type(); add_filter('podlove_feed_enclosure', function ($enclosure, $enclosure_url, $enclosure_file_size, $mime_type) { return sprintf('<link rel="enclosure" href="%s" length="%s" type="%s"/>', $enclosure_url, $enclosure_file_size, $mime_type); }, 10, 4); mute_feed_title(); override_feed_title($feed); override_feed_language($feed); override_feed_head('atom_head', $podcast, $feed, $file_type); override_feed_entry('atom_entry', $podcast, $feed, $file_type); add_action('atom_head', function () use($podcast, $feed, $file_type) { ?> <link rel="self" type="application/atom+xml" title="<?php echo $feed->title_for_discovery(); ?> " href="<?php echo $feed->get_subscribe_url(); ?> " /> <?php $feeds = Model\Feed::all(); foreach ($feeds as $other_feed) { if ($other_feed->id !== $feed->id) { ?> <link rel="alternate" type="application/atom+xml" title="<?php echo $other_feed->title_for_discovery(); ?> " href="<?php echo $other_feed->get_subscribe_url(); ?> " /> <?php } } }, 9); $this->do_feed($feed); }
public function __construct($feed_slug) { add_action('rss2_ns', function () { echo 'xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"'; }); $podcast = Model\Podcast::get_instance(); $feed = Model\Feed::find_one_by_slug($feed_slug); $episode_asset = $feed->episode_asset(); $file_type = $episode_asset->file_type(); add_filter('podlove_feed_enclosure', function ($enclosure, $enclosure_url, $enclosure_file_size, $mime_type) { return sprintf('<enclosure url="%s" length="%s" type="%s" />', $enclosure_url, $enclosure_file_size, $mime_type); }, 10, 4); mute_feed_title(); override_feed_title($feed); override_feed_language($feed); override_feed_head('rss2_head', $podcast, $feed, $file_type); override_feed_entry('rss2_item', $podcast, $feed, $file_type); $this->do_feed($feed); }
function override_feed_item_limit($limits) { global $wp_query; if (!is_feed()) { return $limits; } if (!($feed = \Podlove\Model\Feed::find_one_by_slug(get_query_var('feed_slug')))) { return $limits; } $custom_limit = (int) $feed->limit_items; if ($custom_limit > 0) { return "LIMIT {$custom_limit}"; } elseif ($custom_limit == 0) { return $limits; // WordPress default } else { return ''; // no limit } }
}); add_filter('query_vars', function ($qv) { $qv[] = 'show_slug'; $qv[] = 'feed_slug'; return $qv; }); } // Hooks: // parse_query => query vars available // wp => query_posts done add_action('wp', function () { global $wp_query; if (!($feed_slug = get_query_var('feed_slug'))) { return; } if (!($feed = \Podlove\Model\Feed::find_one_by_slug($feed_slug))) { return; } $is_feedburner_bot = preg_match("/feedburner|feedsqueezer/i", $_SERVER['HTTP_USER_AGENT']); $is_manual_redirect = !isset($_REQUEST['redirect']) || $_REQUEST['redirect'] != "no"; if (strlen($feed->redirect_url) > 0 && $is_manual_redirect && !$is_feedburner_bot) { header(sprintf("Location: %s", $feed->redirect_url), TRUE, 302); exit; } else { // make sure is_feed() returns true add_filter('the_content', function ($content) { global $wp_query; $wp_query->is_feed = true; return $content; }); if ($feed->format === "rss") {
function feed_head_contributors() { global $wp_query; $feed = \Podlove\Model\Feed::find_one_by_slug($wp_query->query_vars['feed']); if (!$feed) { return; } $contributor_xml = $this->prepare_contributions_for_feed(\Podlove\Modules\Contributors\Model\ShowContribution::all(), $feed); echo apply_filters('podlove_feed_head_contributors', $contributor_xml); }
public static function prepare_feed($feed_slug) { global $wp_query; add_action('rss2_ns', function () { echo 'xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" '; echo 'xmlns:psc="http://podlove.org/simple-chapters" '; echo 'xmlns:content="http://purl.org/rss/1.0/modules/content/" '; echo 'xmlns:fh="http://purl.org/syndication/history/1.0" '; }); $podcast = Model\Podcast::get(); if (!($feed = Model\Feed::find_one_by_slug($feed_slug))) { self::wp_404(); } if (!($episode_asset = $feed->episode_asset())) { self::wp_404(); } $file_type = $episode_asset->file_type(); add_filter('podlove_feed_enclosure', function ($enclosure, $enclosure_url, $enclosure_file_size, $mime_type, $media_file) { if ($enclosure_file_size < 0) { $enclosure_file_size = 0; } $dom = new \Podlove\DomDocumentFragment(); $element = $dom->createElement('enclosure'); $attributes = ['url' => $enclosure_url, 'length' => $enclosure_file_size, 'type' => $mime_type]; $attributes = apply_filters('podlove_feed_enclosure_attributes', $attributes, $media_file); foreach ($attributes as $k => $v) { $element->setAttribute($k, $v); } $dom->appendChild($element); return (string) $dom; }, 10, 5); override_feed_title($feed); override_feed_description($feed); override_feed_language($feed); override_feed_head('rss2_head', $podcast, $feed, $file_type); override_feed_entry('rss2_item', $podcast, $feed, $file_type); add_action('rss2_item', function () { if (apply_filters('podlove_feed_show_summary', true)) { echo "<description><![CDATA["; \Podlove\Feeds\the_description(); echo "]]></description>"; } }, 9); add_action('rss2_head', function () use($podcast, $feed) { global $wp_query; $current_page = get_query_var('paged') ? get_query_var('paged') : 1; $feed_url_for_page = function ($page) use($feed) { $url = $feed->get_subscribe_url(); if ($page > 0) { $url .= '?paged=' . $page; } return $url; }; if ($current_page < $wp_query->max_num_pages) { echo "\n\t" . sprintf('<atom:link rel="next" href="%s" />', $feed_url_for_page($current_page + 1)); } if ($current_page > 2) { echo "\n\t" . sprintf('<atom:link rel="prev" href="%s" />', $feed_url_for_page($current_page - 1)); } elseif ($current_page == 2) { echo "\n\t" . sprintf('<atom:link rel="prev" href="%s" />', $feed_url_for_page(0)); } echo "\n\t" . sprintf('<atom:link rel="first" href="%s" />', $feed_url_for_page(0)); if ($wp_query->max_num_pages > 1) { echo "\n\t" . sprintf('<atom:link rel="last" href="%s" />', $feed_url_for_page($wp_query->max_num_pages)); } if ($podcast->language) { echo "\n\t" . '<language>' . $podcast->language . '</language>'; } do_action('podlove_rss2_head', $feed); }, 9); $posts_per_page = $feed->limit_items == 0 ? get_option('posts_per_rss') : $feed->limit_items; if ($posts_per_page == Model\Feed::ITEMS_GLOBAL_LIMIT) { $posts_per_page = $podcast->limit_items; } // now override the option so WP core functions accessing the option get the "correct" value add_filter('pre_option_posts_per_rss', function ($_) use($posts_per_page) { return $posts_per_page; }); $args = array('post_type' => 'podcast', 'post__in' => $feed->post_ids(), 'posts_per_page' => $posts_per_page); # The theme "getnoticed" globally overrides post_types in pre_get_posts. # Fix: hook in after the theme and override it again. # It's not bad practice because I *really* only want episodes in this feed. add_action('pre_get_posts', function ($query) { $query->set('post_type', 'podcast'); }, 20); /** * In feeds, WordPress ignores the 'posts_per_page' parameter * and overrides it with the 'posts_per_rss' option. So we need to * override that option. */ add_filter('post_limits', function ($limits) use($feed) { $page = get_query_var('paged') ? (int) get_query_var('paged') : 1; $max = $feed->get_post_limit_sql(); $start = $max * ($page - 1); if ($max > 0) { return 'LIMIT ' . $start . ', ' . $max; } else { return ''; } }); $args = array_merge($wp_query->query_vars, $args); query_posts($args); }