-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a shortcode for nocookie youtube embeds #651
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<?php | ||
/** | ||
* Add a shortcode for nocookie youtube embeds. | ||
* | ||
* These are not supported in the core embed block or shortcode. | ||
* See https://core.trac.wordpress.org/ticket/44610 | ||
*/ | ||
|
||
namespace WordPressdotorg\MU_Plugins\Plugin_Tweaks\Youtube_Shortcode; | ||
|
||
add_shortcode( 'youtube-nocookie', __NAMESPACE__ . '\render' ); | ||
|
||
/** | ||
* Render the youtube iframe. | ||
* | ||
* The shortcode content is the URL, checked against a safelist of | ||
* `youtube-nocookie` domains. Attributes can be `width`, `height`, | ||
* and `title. | ||
* | ||
* @param array $attr Shortcode attributes array, can be empty if the original arguments string cannot be parsed. | ||
* @param string $content Content inside shortcode tags. | ||
* @param string $tag Shortcode name. | ||
* | ||
* @return string HTML code for iframe embed. | ||
*/ | ||
function render( $attr, $content, $tag ) { | ||
// Short out early if the content is not a valid URL. | ||
// Returns null if content is not a URL at all. | ||
$host = wp_parse_url( $content, PHP_URL_HOST ); | ||
$valid_hosts = [ 'www.youtube-nocookie.com', 'youtube-nocookie.com' ]; | ||
if ( ! in_array( $host, $valid_hosts, true ) ) { | ||
return ''; | ||
} | ||
|
||
$defaults = array( | ||
'width' => '100%', | ||
'height' => false, | ||
'title' => 'YouTube video player', | ||
); | ||
$args = shortcode_atts( $defaults, $attr ); | ||
|
||
$html_attrs = ''; | ||
foreach ( $args as $name => $value ) { | ||
if ( $value ) { | ||
$html_attrs .= $name . '="' . esc_attr( $value ) . '" '; | ||
} | ||
} | ||
|
||
return sprintf( | ||
// `allow` settings copied from youtube-provided embed code. | ||
'<iframe style="aspect-ratio: 16/9;" src="%s" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen %s></iframe>', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor. Should this use numbered placeholders? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would enforcing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
esc_url( $content ), | ||
$html_attrs | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Core uses the parameter name
$shortcode
for this. Should we also follow that standard?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also don't see that parameter being used.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Core uses
$tag
elsewhere, so I don't think it's really a standard. This parameter is only useful if we're using the same callback for different shortcodes, which doesn't apply here. I'll remove it.