You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.5 KiB
PHP

<?php
/**
* Add Podcasts RSS feed.
*
* @since 3.0.17
* @package RankMath
* @subpackage RankMathPro\Schema
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro\Podcast;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Schema\DB;
defined( 'ABSPATH' ) || exit;
/**
* Publish_Podcast class.
*/
class Publish_Podcast {
use Hooker;
/**
* Has Podcast schema.
*
* @var string
*/
protected $has_podcast_schema = false;
/**
* The Constructor.
*/
public function __construct() {
$this->action( 'rank_math/schema/update', 'publish_podcast' );
$this->action( 'rank_math/pre_update_schema', 'has_podcast_schema' );
$this->action( 'rss2_podcast_head', 'add_hub_urls' );
}
/**
* Check if current post already have a Podcast schema.
*
* @param int $post_id Current Post ID.
*/
public function has_podcast_schema( $post_id ) {
$schema_types = DB::get_schema_types( $post_id );
$this->has_podcast_schema = ! empty( $schema_types ) && in_array( 'PodcastEpisode', explode( ', ', $schema_types ), true );
}
/**
* Publish podcast when a new post is published.
*
* @param int $post_id Current Post ID.
*/
public function publish_podcast( $post_id ) {
if ( $this->has_podcast_schema ) {
return;
}
$podcast = get_post_meta( $post_id, 'rank_math_schema_PodcastEpisode', true );
if ( empty( $podcast ) ) {
return;
}
$hub_urls = $this->get_hub_urls();
if ( empty( $hub_urls ) ) {
return;
}
$user_agent = $this->do_filter( 'podcast/useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ) );
$podcast_feed = esc_url( home_url( 'feed/podcast' ) );
$args = [
'timeout' => 100,
'user-agent' => "$user_agent; PubSubHubbub/WebSub",
'body' => "hub.mode=publish&hub.url={$podcast_feed}",
];
foreach ( $hub_urls as $hub_url ) {
wp_remote_post( $hub_url, $args );
}
}
/**
* Add Hub urls to podcast feed.
*/
public function add_hub_urls() {
$hub_urls = $this->get_hub_urls();
if ( empty( $hub_urls ) ) {
return;
}
foreach ( $hub_urls as $hub_url ) {
echo '<atom:link rel="hub" href="' . esc_url( $hub_url ) . '" />';
}
}
/**
* Get podcast Hub URLs.
*/
private function get_hub_urls() {
return $this->do_filter(
'podcast/hub_urls',
[
'https://pubsubhubbub.appspot.com',
'https://pubsubhubbub.superfeedr.com',
'https://websubhub.com/hub',
]
);
}
}