заменить все фреймы YouTube до принятия согласия на использование файлов cookie
Это для политики файлов cookie GDPR. Поскольку YouTube использует файлы cookie, я должен блокировать видео на YouTube и предоставлять доступ только в том случае, если принимается политика файлов cookie.
поэтому мне нужно что-то вроде:
if(!isset($_COOKIE['consentaccept'])) {
// replace all iframes from https://www.youtube.com/ with:
//<div class="youtubeblock">you must enable cookies to view this video</div>
}
или, может быть, у вас есть лучшее решение
Есть идеи?
Это WordPress.
1 ответ
Используя template_redirect
, у вас есть доступ ко всему HTML, который будет отображаться на странице. Вы можете использовать этот хук, чтобы включить буферизацию вывода, найти и заменить все, что вы хотите, а затем вернуть результат обратно, независимо от того, был он изменен или нет.
Имейте в виду, что это не касается каких-либо iframe, которые загружаются динамически с отложенной загрузкой, запросами AJAX и т.д., но все, что загружается в HTML во время выполнения, будет здесь.
add_action( 'template_redirect', 'global_find_replace', 99 );
function global_find_replace(){
ob_start( function( $buffer ){
/**
*`$buffer` contains your entire markup for this page, at run time.
* anything dynamically loaded with JS/Ajax, etc won't be in here
*/
// Did they accept the GDPR cookie?
if( !isset($_COOKIE['gdpr_consent']) ){
// Nope. Build a simple "accept cookies" notice
$notice = '<div class="accept-cookies">You must accept cookies to see this content</div>';
// Replace all youtube iframes regardless of class, id, other attributes, with our notice
$buffer = preg_replace( '/<iframe.+src="https?:\/\/(?:www.)?youtu\.?be(?:\.com)?.+<\/iframe>/i', $notice, $buffer );
}
// Always return the buffer, wither it was modified or not.
return $buffer;
});
}
Вот регулярное выражение, которое я создал для видео на YouTube, не стесняйтесь изменять его, если я что-то пропустил: https://regex101.com/r/2ZQOvk/2/
Однако этого должно быть более чем достаточно, чтобы вы начали!