Расширенные пользовательские поля – Проблема с Slick Slider в ACF v6 Block

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

У меня возникла проблема с Slick Slider в предварительном просмотре администратора с ACF 6, используя новый способ настройки блоков block.json.

Я следовал руководству ACF от Эллиота здесь: https://www.advancedcustomfields.com/blog/building-a-custom-slider-block-in-30-minutes-with-acf/

В ACF v5 с использованием старого метода добавления блоков всё работало отлично, но после обновления до ACF 6 и использования block.json блок выдает ошибку и говорит: ‘Этот блок столкнулся с ошибкой и не может быть просмотрен.’ если я пытаюсь его отредактировать. Если я проверяю и смотрю в консоль, я получаю следующее:

react-dom.min.js?ver=17.0.1:9 TypeError: Cannot read properties of null (reading 'add')
at e.initADA (slick.min.js?ver=6.1.1:1:19335)
at e.init (slick.min.js?ver=6.1.1:1:19101)
at new <anonymous> (slick.min.js?ver=6.1.1:1:2832)
at i.fn.slick (slick.min.js?ver=6.1.1:1:42781)
at initializeBlock (home-slider.js?ver=6.1.1:19:39)
at o (acf.min.js?ver=6.0.5:1:1417)
at Object.doAction (acf.min.js?ver=6.0.5:1:587)
at n.doAction (acf.min.js?ver=6.0.5:1:18745)
at G.renderBlockPreviewEvent (acf-pro-blocks.min.js?ver=6.0.5:1:31066)
at G.componentDidAppend (acf-pro-blocks.min.js?ver=6.0.5:1:30504)

Я использую очень похожий код на пример в руководстве для инициализации слайдера, и он работал нормально до обновления с ACF 5 до 6. Код выглядит так:

(function($){

var initializeBlock = function( $block ) {
    // $block.find('img').doSomething();

    $block.find('.home_banner_content').slick({
        fade: true,
        infinite: true,
        dots: false,
        prevArrow: $('.nav_prev'),
        nextArrow: $('.nav_next'),
        autoplay: true,
        autoplaySpeed: 8000,
        speed: 1500,
        pauseOnHover: false,
        pauseOnFocus: false,
    });
}

// Инициализация каждого блока при загрузке страницы (фронтенд).
$(document).ready(function(){
    $('.home_slider_block').each(function(){
        initializeBlock( $(this) );
    });
});

// Инициализация динамического предварительного просмотра блока (редактор).
if( window.acf ) {
    window.acf.addAction( 'render_block_preview/type=home-slider-block', initializeBlock );
} 
})(jQuery);

Мои блоки ACF зарегистрированы в my functions.php так:

function register_acf_blocks() {

    // Скрипты

    wp_register_script( 'slick', '//cdn.jsdelivr.net/npm/[email protected]/slick/slick.min.js', [ 'jquery', 'acf' ] );
    wp_register_script( 'home-slider-script', get_template_directory_uri() . '/template-parts/blocks/home-blocks/home-slider-block/home-slider.js', [ 'jquery', 'acf' ] );

    // Стили

    wp_register_style( 'slick-css', '//cdn.jsdelivr.net/npm/[email protected]/slick/slick.css' );

    // Блоки

    register_block_type( __DIR__ . '/template-parts/blocks/home-blocks/home-slider-block' );
    register_block_type( __DIR__ . '/template-parts/blocks/page-blocks/intro-block' );
    register_block_type( __DIR__ . '/template-parts/blocks/page-blocks/cottage-slider-block' );

}
add_action( 'init', 'register_acf_blocks', 5 );

А мой json файл для блока выглядит так:

{
    "name": "acf/home-slider-block",
    "title": "Блок на главной странице: Слайдер баннера",
    "description": "Блок для отображения основного баннера на главной странице.",
    "style": "slick-css",
    "script": ["home-slider-script", "slick"],
    "category": "custom",
    "icon": "format-gallery",
    "apiVersion": 2,
    "keywords": [],
    "acf": {
        "mode": "preview",
        "renderTemplate": "home-slider-block.php"
    },
    "align": "full",
    "styles": [],
    "supports": {
        "align": true,
        "anchor": true,
        "alignContent": false,
        "color": {
            "text": false,
            "background": true,
            "link": false
        },
        "alignText": false,
        "fullHeight": false
    },
    "attributes": {
    }
}

Попробуйте добавить "editorScript": [ "jquery", "slick", "app" ], в ваш файл block.json.

https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#editor-script

Замените массив на нужные скрипты, которые нужно загрузить в вашем редакторе.

Ответ или решение

При использовании Advanced Custom Fields (ACF) версии 6 вы, возможно, столкнулись с проблемой предварительного просмотра слайдера Slick в редакторе блоков WordPress. Данная проблема возникает после обновления ACF и перехода на новый способ создания блоков с использованием файла block.json. Этот процесс может быть непростым, но давайте разберемся с ним подробно.

Причины ошибки

Ошибка, с которой вы столкнулись, указывает на проблему инициализации и отсутствия необходимых свойств при попытке загрузки слайдера. В частности, из консоли мы видим сообщение:

TypeError: Cannot read properties of null (reading 'add')

Это говорит о том, что библиотека Slick не может корректно инициализировать слайдер из-за того, что целевой элемент не найден или не отвечает ожидаемым условиям.

Решение проблемы

Изменения в block.json

Для того чтобы правильно инициализировать скрипты в редакторе и избежать ошибок, вы можете добавить новую секцию в ваш файл block.json. В частности, замените текущую секцию скриптов, добавив "editorScript" для правильной загрузки всех нужных файлов:

{
    "name": "acf/home-slider-block",
    ...
    "script": ["home-slider-script", "slick"],
    "editorScript": [ "jquery", "slick", "home-slider-script" ],
    ...
}

Обратите внимание, что в массивеейчас содержится скрипт home-slider-script, а также зависимости, такие как jquery и slick. Это позволит корректно загружать необходимые библиотеки в редакторе.

Обновление инициализации скриптов

Также есть смысл убедиться, что инициализация вашего слайдера происходит корректно, как в редакторе, так и на клиентской стороне. Вы можете использовать следующую конструкцию для динамической инициализации:

(function($){

    var initializeBlock = function( $block ) {
        if ($block.find('.home_banner_content').length) {
            $block.find('.home_banner_content').slick({
                fade: true,
                infinite: true,
                dots: false,
                prevArrow: $block.find('.nav_prev'),
                nextArrow: $block.find('.nav_next'),
                autoplay: true,
                autoplaySpeed: 8000,
                speed: 1500,
                pauseOnHover: false,
                pauseOnFocus: false,
            });
        }
    }

    $(document).ready(function(){
        $('.home_slider_block').each(function(){
            initializeBlock( $(this) );
        });
    });

    if( window.acf ) {
        window.acf.addAction( 'render_block_preview/type=home-slider-block', initializeBlock );
    } 
})(jQuery);

Проверка подключения стилей и скриптов

Важно удостовериться, что вы успешно регистрируете свои скрипты и стили в функции register_acf_blocks. Сделайте свою функцию регистрации такой:

function register_acf_blocks() {
    wp_register_script( 
        'slick', 
        'https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js', 
        ['jquery', 'acf'] 
    );
    wp_register_script( 
        'home-slider-script', 
        get_template_directory_uri() . '/template-parts/blocks/home-blocks/home-slider-block/home-slider.js', 
        ['jquery', 'acf'] 
    );

    wp_register_style( 
        'slick-css', 
        'https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css' 
    );

    register_block_type( __DIR__ . '/template-parts/blocks/home-blocks/home-slider-block' );
}
add_action( 'init', 'register_acf_blocks', 5 );

При этом убедитесь, что путь к вашим скриптам и стилям верен и доступен.

Заключение

Соблюдение перечисленных выше рекомендаций поможет вам устранить проблемы с инициализацией слайдера Slick в ACF 6. Следуя этим шагам, вы сможете обеспечить корректную работу вашего блока, как в редакторе, так и на клиентской стороне. Помните о важности проверки совместимости и детальной отладки при внесении изменений в блоки ACF.

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

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