Skip to content
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

Merged
merged 2 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions mu-plugins/plugin-tweaks/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
require_once __DIR__ . '/stream.php';
require_once __DIR__ . '/incompatible-plugins.php';
require_once __DIR__ . '/gutenberg.php';
require_once __DIR__ . '/youtube-shortcode.php';
54 changes: 54 additions & 0 deletions mu-plugins/plugin-tweaks/youtube-shortcode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?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.
*
* @return string HTML code for iframe embed.
*/
function render( $attr, $content ) {
// 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>',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor. Should this use numbered placeholders?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would enforcing 16/9 but allowing users to set width/height be an issue for editors?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question— I assumed you would only ever really set one of them, but you can set both and it will override the aspect ratio.

For example, [youtube-nocookie height=300 width=300… is square:

Screenshot 2024-09-11 at 11 27 22 AM

esc_url( $content ),
$html_attrs
);
}
Loading