Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
E
ETH Embed Anchor.fm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
WP Plugins
ETH Embed Anchor.fm
Merge requests
!1
Initial release
Code
Review changes
Check out branch
Download
Patches
Plain diff
Merged
Initial release
develop
into
main
Overview
0
Commits
7
Pipelines
5
Changes
4
Merged
Erick Hitter
requested to merge
develop
into
main
2 years ago
Overview
0
Commits
7
Pipelines
5
Changes
4
Expand
0
0
Merge request reports
Compare
main
version 4
bda594ec
2 years ago
version 3
92b9e919
2 years ago
version 2
24496036
2 years ago
version 1
d6a4b862
2 years ago
main (base)
and
latest version
latest version
e2ed3de9
7 commits,
2 years ago
version 4
bda594ec
6 commits,
2 years ago
version 3
92b9e919
5 commits,
2 years ago
version 2
24496036
4 commits,
2 years ago
version 1
d6a4b862
3 commits,
2 years ago
4 files
+
220
−
1
Side-by-side
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
4
Search (e.g. *.vue) (Ctrl+P)
inc/class-plugin.php
0 → 100644
+
186
−
0
Options
<?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