Вопрос или проблема
Я использую фрагмент кода в functions.php
, чтобы изменить все встраивания youtube, добавляя дополнительные параметры плеера. До WordPress 5.6 youtube блоки можно было фильтровать с помощью
if( "core-embed/youtube" === $block['blockName']) { // сделай что-то }
Однако, начиная с WP 5.6, имя блока теперь core/embed
, а youtube
– это вариация.
Я попробовал if( "core/embed/youtube" === $block['blockName'])
, а также if($block['blockName'] == 'core/embed/youtube')
, но это не работает.
Мой полный оригинальный код (адаптирован из этой статьи) выглядит так:
function wpftw_modest_youtube_player( $block_content, $block ) {
if( "core-embed/youtube" === $block['blockName'] ) {
$block_content = str_replace( '?feature=oembed', '?feature=oembed&modestbranding=1&showinfo=0&rel=0&cc_load_policy=1', $block_content );
}
return $block_content;
}
add_filter( 'render_block', 'wpftw_modest_youtube_player', 10, 3);
Я относительно нов в WordPress и php, так что любая ясность будет оценена. Я пытался найти ответ в гугле и консультировался с руководством по блокам, но не могу разобраться в ответе.
Вся эта тема вариаций блоков – это полная чепуха, бесполезная погоня!
Но давайте просто следовать этому до конца, прежде чем я поделюсь настоящим решением, которое гораздо проще, чем вы думаете.
Вы не должны смотреть на саму вариацию, вариации устанавливают различные атрибуты, и именно атрибуты вы должны искать, а не вариацию.
Например, вот Twitter вариация, как определено в packages/block-library/src/embed/variations.js
:
{
name: 'twitter',
title: 'Twitter',
icon: embedTwitterIcon,
keywords: [ 'tweet', __( 'social' ) ],
description: __( 'Вставить твит.' ),
patterns: [ /^https?:\/\/(www\.)?twitter\.com\/.+/i ],
attributes: { providerNameSlug: 'twitter', responsive: true },
},
Вместо того, чтобы смотреть на вариацию блока, проверьте атрибут providerNameSlug
.
Но это все – ложный след
Это не то, как вы бы это сделали, на самом деле ваша проблема совершенно не связана с блоками и редактором!
Если вы хотите изменить OEmbed URL, не изменяйте блоки, которые отображают OEmbeds, измените OEmbed! В WordPress уже много лет есть фильтры для этого, задолго до введения редактора блоков.
К счастью, кто-то спросил, как это сделать в 2011 году, и ответ все еще должен работать:
Вариация YouTube имеет атрибут providerNameSlug
, который предоставляется во время вызова registerBlockVariation()
со значением youtube
. Этот атрибут доступен во втором аргументе фильтра блока под ключом atts
/providerNameSlug
. Исходя из этого, ваш фильтр должен выглядеть так:
function wpftw_modest_youtube_player( $block_content, $block ) {
if( "core/embed" === $block['blockName'] && ($block['atts']['providerNameSlug']??'') === 'youtube' ) {
// сделай свои дела...
}
return $block_content;
}
add_filter( 'render_block', 'wpftw_modest_youtube_player', 10, 3);
Но это довольно бессмысленно фильтровать все блоки, это просто снижает производительность и напрасно расходует ресурсы ЦП, так что лучший подход:
function wpftw_modest_youtube_player( $block_content, $block ) {
if( ($block['atts']['providerNameSlug']??'') === 'youtube' ) {
// сделай свои дела...
}
return $block_content;
}
add_filter( 'render_block_core/embed', 'wpftw_modest_youtube_player', 10, 3);
Этот фильтр применяется только к блокам встраивания.
Ответ или решение
Изменение параметров встраивания YouTube в WordPress 5.6: Пошаговое руководство
С выходом WordPress 5.6 произошли значительные изменения в архитектуре блока для встроенного содержимого. В частности, встраиваемые блоки YouTube больше не имеют отдельное имя блока, а теперь обрабатываются как вариации общего блока core/embed
. Это нововведение требует дополнительного внимания при работе с кодом, особенно при создании пользовательских фильтров для модификации встраиваемых видео.
Понимание изменений
В предыдущих версиях WordPress код для фильтрации YouTube-блоков выглядел следующим образом:
if( "core-embed/youtube" === $block['blockName'] ) {
// Выполнить действия
}
С изменениями, вступившими в силу в версии 5.6, имя блока изменилось на core/embed
, а YouTube теперь рассматривается как вариация с использованием следующего кода:
if( "core/embed/youtube" === $block['blockName'] ) {
// Выполнить действия
}
Однако код, который вы использовали, не сработал, потому что доступ к вариациям блоков происходит иначе. Вместо проверки имени блока, следует сосредоточиться на атрибутах.
Как правильно модифицировать встраивание
Ваши действия, связанные с изменением параметров встраиваемого видео на YouTube, должны учитывать следующее:
-
Атрибуты блока: Вместо проверки на основе
blockName
, необходимо использовать атрибутproviderNameSlug
. -
Фильтрация блока: Для оптимизации нужно использовать более целенаправленный фильтр.
Вот ваш обновленный код для фильтрации блока YouTube и изменения параметров плеера:
function wpftw_modest_youtube_player( $block_content, $block ) {
// Проверяем атрибут providerNameSlug
if( ("core/embed" === $block['blockName']) && (($block['attrs']['providerNameSlug'] ?? '') === 'youtube') ) {
$block_content = str_replace( '?feature=oembed',
'?feature=oembed&modestbranding=1&showinfo=0&rel=0&cc_load_policy=1',
$block_content
);
}
return $block_content;
}
add_filter( 'render_block', 'wpftw_modest_youtube_player', 10, 2 );
Оптимизация кода
Чтобы избежать дополнительной нагрузки на сервер и значительно улучшить производительность, вы можете использовать более узкий фильтр, который будет применяться только к встроенным блокам:
function wpftw_modest_youtube_player( $block_content, $block ) {
if( ($block['attrs']['providerNameSlug'] ?? '') === 'youtube' ) {
$block_content = str_replace( '?feature=oembed',
'?feature=oembed&modestbranding=1&showinfo=0&rel=0&cc_load_policy=1',
$block_content
);
}
return $block_content;
}
add_filter( 'render_block_core/embed', 'wpftw_modest_youtube_player', 10, 2 );
Итоги
Модификация встраиваемых блоков в Gutenberg в WordPress 5.6 требуют более новой методологии, сосредоточенной на атрибутах блоков, а не на их именах. Перенаправление вашего кода на использование providerNameSlug
позволит вам легче и эффективнее адаптировать блоки YouTube к вашим нуждам. Кроме того, целевая фильтрация поможет значительно снизить нагрузку на сервер, обеспечивая более плавную работу вашего сайта.