*/ namespace RankMathPro\Podcast; use RankMath\Helper; use RankMath\Traits\Hooker; defined( 'ABSPATH' ) || exit; /** * Media_RSS class. */ class Podcast_RSS { use Hooker; /** * The Constructor. */ public function __construct() { $prefix = 'rss2_podcast'; if ( apply_filters( 'rank_math/podcast/enhance_all_feeds', true ) ) { $prefix = 'rss2'; } remove_action( 'rss2_head', 'rss2_site_icon' ); $this->action( "{$prefix}_ns", 'add_namespace' ); $this->action( "{$prefix}_head", 'add_channel_data' ); $this->action( "{$prefix}_item", 'add_podcast_data', 10, 1 ); } /** * Add namespace to RSS feed. */ public function add_namespace() { if ( apply_filters( 'rank_math/rss/add_podcasts_namespace', true ) ) { echo 'xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" '; } $this->filter( 'get_wp_title_rss', 'feed_title' ); $this->filter( 'bloginfo_rss', 'feed_description', 10, 2 ); } /** * Change the feed title. * * @param string $wp_title_rss The current blog title. */ public function feed_title( $wp_title_rss ) { $podcast_title = Helper::get_settings( 'general.podcast_title' ); if ( $podcast_title ) { return Helper::replace_vars( $podcast_title ); } return $wp_title_rss; } /** * Change the feed description. * * @param string $value RSS container for the blog information. * @param string $show The type of blog information to retrieve. */ public function feed_description( $value, $show ) { if ( 'description' !== $show ) { return $value; } $podcast_description = Helper::get_settings( 'general.podcast_description' ); if ( $podcast_description ) { return Helper::replace_vars( $podcast_description ); } return $value; } /** * Add Podcast channel data */ public function add_channel_data() { $category = Helper::get_settings( 'general.podcast_category' ); if ( $category ) { $this->newline( '', 1 ); } $author_name = Helper::get_settings( 'general.podcast_owner' ); $author_email = Helper::get_settings( 'general.podcast_owner_email' ); if ( $author_email ) { $this->newline( '' . esc_html( $author_name ) . '', 1 ); $this->newline( '', 1 ); if ( $author_email ) { $this->newline( '' . esc_html( $author_name ) . '', 2 ); } $this->newline( '' . esc_html( $author_email ) . '', 2 ); $this->newline( '', 1 ); } $image = Helper::get_settings( 'general.podcast_image' ); if ( $image ) { $this->newline( '', 1 ); $this->newline( '', 1 ); $this->newline( '' . get_wp_title_rss() . '', 2 ); $this->newline( '' . esc_url( $image ) . '', 2 ); $this->newline( '' . get_bloginfo_rss( 'url' ) . '', 2 ); $this->newline( '', 1 ); } $title = Helper::get_settings( 'general.podcast_title' ); if ( $title ) { $this->newline( '' . esc_html( Helper::replace_vars( $title ) ) . '', 1 ); } $summary = Helper::get_settings( 'general.podcast_description' ); if ( $summary ) { $this->newline( '' . esc_html( Helper::replace_vars( $summary ) ) . '', 1 ); } $is_explicit = Helper::get_settings( 'general.podcast_explicit' ) ? 'yes' : 'clean'; $this->newline( '' . $is_explicit . '', 1 ); $copyright = Helper::get_settings( 'general.podcast_copyright_text' ); if ( $copyright ) { $copyright = str_replace( '©', '©', $copyright ); $this->newline( '' . esc_html( $copyright ) . '', 1 ); } } /** * Add Podcast Data in RSS feed. * * @see https://support.google.com/podcast-publishers/answer/9889544 * @see https://podcasters.apple.com/support/823-podcast-requirements */ public function add_podcast_data() { global $post; $podcast = get_post_meta( $post->ID, 'rank_math_schema_PodcastEpisode', true ); if ( empty( $podcast ) ) { return; } $title = ! empty( $podcast['name'] ) ? Helper::replace_vars( $podcast['name'], $post ) : ''; $description = ! empty( $podcast['description'] ) ? Helper::replace_vars( $podcast['description'], $post ) : ''; $audio_file = $podcast['associatedMedia']['contentUrl']; $duration = ! empty( $podcast['timeRequired'] ) ? Helper::duration_to_seconds( $podcast['timeRequired'] ) : ''; $image = ! empty( $podcast['thumbnailUrl'] ) ? Helper::replace_vars( $podcast['thumbnailUrl'], $post ) : ''; $author = ! empty( $podcast['author'] ) ? Helper::replace_vars( $podcast['author']['name'], $post ) : ''; $is_explicit = empty( $podcast['isFamilyFriendly'] ) ? 'yes' : 'clean'; $episode_number = ! empty( $podcast['episodeNumber'] ) ? $podcast['episodeNumber'] : ''; $season_number = ! empty( $podcast['partOfSeason'] ) && ! empty( $podcast['partOfSeason']['seasonNumber'] ) ? $podcast['partOfSeason']['seasonNumber'] : ''; if ( $title ) { $this->newline( '' . wp_kses_post( $title ) . '' ); } if ( $description ) { $this->newline( '' . wp_kses_post( $description ) . '', 2 ); } if ( $image ) { $this->newline( '', 2 ); } if ( $duration ) { $this->newline( '' . $duration . '', 2 ); } if ( $author ) { $this->newline( '' . esc_html( $author ) . '', 2 ); } if ( $season_number ) { $this->newline( '' . esc_html( $season_number ) . '', 2 ); } if ( $episode_number ) { $this->newline( '' . esc_html( $episode_number ) . '', 2 ); } $this->newline( '' . $is_explicit . '', 2 ); $tracking_prefix = Helper::get_settings( 'general.podcast_tracking_prefix' ); $this->newline( '', 2 ); } /** * Write a newline with indent count. * * @param string $content Content to write. * @param integer $indent Count of indent. */ private function newline( $content, $indent = 0 ) { echo str_repeat( "\t", $indent ) . $content . "\n"; } }