fictioneer/rss-rss-story.php

224 lines
7.1 KiB
PHP
Raw Normal View History

2023-01-21 01:31:34 +01:00
<?php
/**
* RSS2 Feed Template to display chapters in a story
*
* Compiles an RSS feed for a given story ID with chapters up to the maximum
* defined under Settings > Reading > "Syndication feeds show the most recent"
* (posts_per_rss). The feed will not work if a password is required unless
* the viewer has entered the password.
*
* @package WordPress
* @subpackage Fictioneer
* @since 4.7
* @link https://github.com/WordPress/WordPress/blob/master/wp-includes/feed-rss2.php
*/
// Get ID from parameter
2023-06-13 11:26:34 +02:00
$story_id = fictioneer_validate_id( $_GET[ 'story_id' ] ?? 0, 'fcn_story' );
$is_hidden = fictioneer_get_field( 'fictioneer_story_hidden', $story_id ?: 0 ) ?: 0;
2023-01-21 01:31:34 +01:00
// Abort if not a valid story ID or password protected
2023-06-13 11:26:34 +02:00
if ( ! $story_id || $is_hidden || post_password_required( $story_id ) ) {
2023-01-21 01:31:34 +01:00
wp_redirect( home_url() );
exit();
}
// Get story data
$story = fictioneer_get_story_data( $story_id, false ); // Does not refresh comment count!
2023-01-21 01:31:34 +01:00
$chapters = fictioneer_get_field( 'fictioneer_story_chapters', $story_id );
// Feed title
$title = sprintf(
_x( '%1$s - %2$s Chapters', 'Story Feed: [Site] - [Story] Chapters.', 'fictioneer' ),
get_bloginfo_rss( 'name' ),
get_the_title( $story_id )
);
// Feed description
$description = sprintf(
_x( 'Recent chapters of %s.', 'Story Feed: Recent chapters of [Story].', 'fictioneer' ),
get_the_title( $story_id )
);
// Updated time (story)
$date = mysql2date( 'D, d M Y H:i:s +0000', get_post_modified_time( 'Y-m-d H:i:s', true, $story_id ), false );
// Cover image
$cover = fictioneer_get_seo_image( $story_id );
// Set header
header( 'Content-Type: ' . feed_content_type( 'rss-http' ) . '; charset=' . get_option( 'blog_charset' ), true );
// Echo XML version
echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?>';
// Fire default action
do_action( 'rss_tag_pre', 'rss2' );
?>
<rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
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/"
xmlns:webfeeds="http://webfeeds.org/rss/1.0"
<?php do_action( 'rss2_ns' ); ?>
>
<channel>
<title><?php echo $title; ?></title>
<description><?php echo $description; ?></description>
<language><?php echo bloginfo_rss( 'language' ); ?></language>
<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
<link><?php echo esc_url( get_permalink( $story_id ) ); ?></link>
<lastBuildDate><?php echo $date; ?></lastBuildDate>
<sy:updatePeriod><?php echo apply_filters( 'rss_update_period', 'hourly' ); ?></sy:updatePeriod>
<sy:updateFrequency><?php echo apply_filters( 'rss_update_frequency', '1' ); ?></sy:updateFrequency>
<?php if ( $cover && is_array( $cover ) ) : ?>
<webfeeds:cover image="<?php echo $cover['url']; ?>" />
<?php endif; ?>
<?php if ( has_site_icon() ) : ?>
<webfeeds:icon><?php echo get_site_icon_url(); ?></webfeeds:icon>
<?php endif; ?>
<?php if ( get_option( 'site_icon', false ) ) : ?>
<image>
<url><?php echo get_site_icon_url( 32 ); ?></url>
<title><?php echo $title; ?></title>
<link><?php bloginfo_rss( 'url' ); ?></link>
<width>32</width>
<height>32</height>
</image>
<?php endif; ?>
<?php
if ( $story['fandoms'] ) {
foreach ( $story['fandoms'] as $fandom ) {
echo '<category>' . $fandom->name . '</category>';
}
}
if ( $story['genres'] ) {
foreach ( $story['genres'] as $genre ) {
echo '<category>' . $genre->name . '</category>';
}
}
if ( $story['characters'] ) {
foreach ( $story['characters'] as $character ) {
echo '<category>' . $character->name . '</category>';
}
}
if ( $story['tags'] ) {
foreach ( $story['tags'] as $tag ) {
echo '<category>' . $tag->name . '</category>';
}
}
?>
<?php
if ( ! empty( $chapters ) ) {
2023-01-21 01:31:34 +01:00
// Reverse to get latest first
$chapters = array_reverse( $chapters );
// Limit items
$terminator = get_option( 'posts_per_rss' );
2023-08-08 22:58:51 +02:00
// Query
$query_args = array(
'post_type' => 'fcn_chapter',
'post_status' => 'publish',
'post__in' => $chapters,
'orderby' => 'post__in',
'posts_per_page' => get_option( 'posts_per_rss' ) + 4, // Buffer for hidden items
'no_found_rows' => true // Improve performance
);
$chapter_query = new WP_Query( $query_args );
2023-01-21 01:31:34 +01:00
// Loop over chapters
2023-08-08 22:58:51 +02:00
foreach ( $chapter_query->posts as $post ) {
2023-01-21 01:31:34 +01:00
// Setup
setup_postdata( $post );
// Terminate?
if ( $terminator < 1 ) break;
// Skip invisible chapters
2023-08-08 22:58:51 +02:00
if ( fictioneer_get_field( 'fictioneer_chapter_hidden' ) ) {
2023-01-21 01:31:34 +01:00
continue;
}
// Decrement terminator
$terminator--;
// Data
$pub_date = mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false );
$og_image = fictioneer_get_seo_image( $post->ID );
// <-- Start HTML
?>
<item>
<title><?php the_title_rss(); ?></title>
<link><?php the_permalink_rss(); ?></link>
<pubDate><?php echo $pub_date; ?></pubDate>
<dc:creator><?php the_author(); ?></dc:creator>
<guid isPermaLink="false"><?php the_guid(); ?></guid>
2023-09-16 14:25:26 +02:00
<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
2023-01-21 01:31:34 +01:00
<?php if ( $og_image ) : ?>
<webfeeds:featuredImage
url="<?php echo $og_image['url']; ?>"
width="<?php echo $og_image['width']; ?>"
height="<?php echo $og_image['height']; ?>"
/>
<?php endif; ?>
<?php
if ( $chapter_fandoms = get_the_terms( get_the_ID(), 'fcn_fandom' ) ) {
foreach ( $chapter_fandoms as $fandom ) {
echo '<category>' . $fandom->name . '</category>';
}
}
if ( $chapter_genres = get_the_terms( get_the_ID(), 'fcn_genre' ) ) {
foreach ( $chapter_genres as $genre ) {
echo '<category>' . $genre->name . '</category>';
}
}
if ( $chapter_characters = get_the_terms( get_the_ID(), 'fcn_character' ) ) {
foreach ( $chapter_characters as $character ) {
echo '<category>' . $character->name . '</category>';
}
}
if ( $chapter_tags = get_the_tags( get_the_ID() ) ) {
foreach ( $chapter_tags as $tag ) {
echo '<category>' . $tag->name . '</category>';
}
}
rss_enclosure();
do_action( 'rss2_item' );
?>
</item>
<?php // <-- End HTML
}
wp_reset_postdata();
}
?>
</channel>
</rss>