Доступ / Фильтрация вариаций блоков в Гутенберге, в WordPress 5.6

Вопрос или проблема

Я использую фрагмент кода в 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 году, и ответ все еще должен работать:

https://wordpress.stackexchange.com/a/14438/736

Вариация 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, должны учитывать следующее:

  1. Атрибуты блока: Вместо проверки на основе blockName, необходимо использовать атрибут providerNameSlug.

  2. Фильтрация блока: Для оптимизации нужно использовать более целенаправленный фильтр.

Вот ваш обновленный код для фильтрации блока 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 к вашим нуждам. Кроме того, целевая фильтрация поможет значительно снизить нагрузку на сервер, обеспечивая более плавную работу вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...