Skip to content
Snippets Groups Projects

Initial release

Merged Erick Hitter requested to merge develop into main
1 file
+ 1
1
Compare changes
  • Side-by-side
  • Inline
+ 186
0
<?php
/**
* Plugin functionality.
*
* @package ETH_Embed_Anchor_FM
*/
namespace ETH_Embed_Anchor_FM;
/**
* Class Plugin.
*/
class Plugin {
/**
* Regex pattern to match URL to be oEmbedded.
*
* @var string
*/
private const OEMBED_FORMAT = '#^https://anchor\.fm/(?!api)([^/]+)/episodes/([^/\s]+)/?#i';
/**
* Anchor oEmbed endpoint with placeholder.
*
* @var string
*/
private const OEMBED_ENDPOINT = 'https://anchor.fm/api/v3/episodes/__EPISODE_ID__/oembed';
/**
* Placeholder in self::OEMBED_ENDPOINT to be replaced with episode ID.
*
* @var string
*/
private const EPISODE_ID_PLACEHOLDER = '__EPISODE_ID__';
/**
* Shortcode tag.
*
* @var string
*/
private const SHORTCODE_TAG = 'eth_anchor_fm';
/**
* Singleton.
*
* @var Plugin
*/
private static $_instance = null;
/**
* Implement singleton.
*
* @return Plugin
*/
public static function get_instance(): Plugin {
if ( ! is_a( self::$_instance, __CLASS__ ) ) {
self::$_instance = new self();
self::$_instance->_setup();
}
return self::$_instance;
}
/**
* Silence is golden!
*/
private function __construct() {
// Add nothing here.
}
/**
* Register hooks.
*
* @return void
*/
private function _setup(): void {
add_action( 'init', [ $this, 'action_init' ] );
add_filter(
'oembed_fetch_url',
[ $this, 'filter_oembed_fetch_url' ],
10,
3
);
}
/**
* Register oEmbed handler.
*
* @return void
*/
public function action_init(): void {
wp_oembed_add_provider(
self::OEMBED_FORMAT,
self::OEMBED_ENDPOINT,
true
);
add_shortcode(
self::SHORTCODE_TAG,
[ $this, 'do_shortcode' ]
);
}
/**
* Filter oEmbed URL.
*
* Anchor.fm's oEmbed endpoint is specific to an episode ID, which must be
* extracted from the episode URL.
*
* @param string $provider URL of the oEmbed provider.
* @param string $url URL of the content to be embedded.
* @param array $args Optional. Additional arguments for retrieving
* embed HTML.
* @return string
*/
public function filter_oembed_fetch_url(
string $provider,
string $url,
array $args = []
): string {
if ( 0 !== stripos( $provider, self::OEMBED_ENDPOINT ) ) {
return $provider;
}
if ( ! preg_match( self::OEMBED_FORMAT, $url, $matches ) ) {
return '';
}
$episode_slug_parts = explode( '-', $matches[2] );
$id = array_pop( $episode_slug_parts );
$provider = str_replace(
self::EPISODE_ID_PLACEHOLDER,
$id,
self::OEMBED_ENDPOINT
);
// Anchor.fm's oEmbed endpoint offers limited support for arguments.
if ( isset( $args['width'], $args['height'] ) ) {
$provider = add_query_arg(
[
'maxwidth' => (int) $args['width'],
'maxheight' => (int) $args['height'],
],
$provider
);
}
return $provider;
}
/**
* Render Anchor.fm iframe embed via a shortcode.
*
* @param array $attrs Shortcode attributes.
* @return string
*/
public function do_shortcode( array $attrs ): string {
$attrs = shortcode_atts(
[
'src' => null,
'url' => null,
'width' => '400px',
'height' => '102px',
],
$attrs,
self::SHORTCODE_TAG
);
// Fallback in case one passes `url` rather than `src`.
if ( empty( $attrs['src'] ) && ! empty( $attrs['url'] ) ) {
$attrs['src'] = $attrs['url'];
}
if ( empty( $attrs['src'] ) ) {
return '';
}
return sprintf(
'<iframe src="%1$s" width="%2$s" height="%3$s" frameborder="0" scrolling="no"></iframe>',
esc_url( $attrs['src'] ),
esc_attr( $attrs['width'] ),
esc_attr( $attrs['height'] )
);
}
}
Loading