【问题标题】:ACF Gutenberg Block Not Rendering Slick Slider on BackendACF Gutenberg 块未在后端渲染光滑的滑块
【发布时间】:2019-08-28 16:23:17
【问题描述】:

我已经设置了 ACF Gutenberg Block 以在后端编辑器中呈现光滑的滑块,并且我放置了一个 console.log 以确保它是否加载,它确实加载了。但是,它不会像在前端那样渲染滑块。

我尝试过同时使用enqueue_block_assetsenqueue_block_editor_assets,但是这些都不起作用。

我的 JavaScript 排队:

    wp_enqueue_script(
        'slick',
        plugins_url('slick.js', __FILE__),
        ['wp-blocks', 'wp-element', 'wp-components', 'wp-i18n'],
        filemtime(plugin_dir_path(__FILE__) . 'slick.js')
    );

    wp_enqueue_script(
        'slick-init',
        plugins_url('init-slick.js', __FILE__),
        ['wp-blocks', 'wp-element', 'wp-components', 'wp-i18n'],
        filemtime(plugin_dir_path(__FILE__) . 'init-slick.js')
    );

我的 CSS 排队:

wp_enqueue_style(
   'slick-css',
   plugins_url( '/resources/slick.css', __FILE__),
   [  'wp-blocks', 'wp-element', 'wp-components', 'wp-i18n' ],
   filemtime( plugin_dir_path( __FILE__ ) . '/resources/slick.css')
);

wp_enqueue_style(
   'slick-theme-css',
   plugins_url( '/resources/slick-theme.css' __FILE__),
   [  'wp-blocks', 'wp-element', 'wp-components', 'wp-i18n' ],
   filemtime( plugin_dir_path( __FILE__ ) . '/resources/slick-theme.css')
);

我的 Init-slick.js 文件:

(function() {
  $(".slider").slick({
    dots: true,
    infinite: true,
    speed: 300,
    slidesToShow: 1,
    adaptiveHeight: true,
    rows: 0
  });
});

console.log("I'm loaded!");

总之:

function slider_block()
{

    wp_enqueue_script(
        'slick',
        plugins_url('slick.js', __FILE__),
        ['wp-blocks', 'wp-element', 'wp-components', 'wp-i18n'],
        filemtime(plugin_dir_path(__FILE__) . 'slick.js')
    );

    wp_enqueue_script(
        'slick-init',
        plugins_url('init-slick.js', __FILE__),
        ['wp-blocks', 'wp-element', 'wp-components', 'wp-i18n'],
        filemtime(plugin_dir_path(__FILE__) . 'init-slick.js')
    );

    wp_enqueue_style(
        'slick-css',
        get_stylesheet_directory_uri() . '/resources/slick.css',
        [  'wp-blocks', 'wp-element', 'wp-components', 'wp-i18n' ],
        filemtime(plugin_dir_path(__FILE__) . '/resources/slick.css')
    );

    wp_enqueue_style(
        'slick-theme-css',
        get_stylesheet_directory_uri() . '/resources/slick-theme.css',
        [  'wp-blocks', 'wp-element', 'wp-components', 'wp-i18n' ],
        filemtime(plugin_dir_path(__FILE__) . '/resources/slick-theme.css')
    );

}

add_action('enqueue_block_assets', 'slider_block');

最终结果应该是一个滑块,但是,即使选择了激活光滑滑块的单词,图像仍然显示堆叠在 acf gutenberg 块的后端。它永远不会在后端初始化添加 div 类 slick-initialized slick-slider 它仍然保留相同的 div 类 <div class="slider">

【问题讨论】:

    标签: javascript php wordpress advanced-custom-fields wordpress-gutenberg


    【解决方案1】:

    我在使用 Flickity 滑块时为同一个问题苦苦挣扎了很长时间,但我花在研究上的时间并没有浪费,我找到了答案并让它发挥了作用!

    我相信您的所有排队都是正确的,因为 console.log 正在显示通知,所以一切都很好。

    根据ACF documentation page on acf_register_block function 的最底部,您必须挂钩到“render_block_preview”操作并应用 JS 代码“就像块是新绘制的一样” - 这样做是因为块在加载时被多次渲染帖子编辑页面并实际编辑块。

    所以你的 Init-slick.js 代码应该是这样的:

    (function($){
    
        var initializeBlock = function( $block ) {
            $(".slider").slick({
              dots: true,
              infinite: true,
              speed: 300,
              slidesToShow: 1,
              adaptiveHeight: true,
              rows: 0
            });
        }
    
        // Initialize each block on page load (front end).
        $(document).ready(function(){
          initializeBlock();
        });
    
        // Initialize dynamic block preview (editor).
        if( window.acf ) {
            window.acf.addAction( 'render_block_preview', initializeBlock );
        }
    
    })(jQuery);
    

    我没有测试此代码,但类似的 Flickity 实现在网站的后端和前端都对我有用。

    希望这会有所帮助,如果它也适合你,请告诉我!

    【讨论】:

    • 非常感谢您!我真的很感激。
    • 感谢您强调这一点 - 我在文档中完全错过了它!
    【解决方案2】:

    我找到了一个非常有用的答案来解决这个问题: https://github.com/WordPress/gutenberg/issues/12603#issuecomment-513945557

    感谢 coderaaron

    1. 在块的编辑功能中:
    edit(props) {
    
        ...
    
        const customEvent = new Event( 'gutenbergSlick' );
    
        ...
    
        return ... {
    
            document.dispatchEvent( customEvent ),
    
            ...
    
        }
    
    }
    
    1. 在注册我的块的 PHP 文件中:
    wp_enqueue_script(
        'slick-carousel',
        plugin_dir_url( __FILE__ ) . ‘assets/slick/slick.js’,
        array( 'jquery' ),
        filemtime( plugin_dir_url( __FILE__ ) . ‘assets/slick/slick.js’ ),
        true
    );
    wp_enqueue_script(
        'carousel-frontend’,
        plugin_dir_url( __FILE__ ) . 'assets/slick/frontend.js',
        array( 'slick-carousel' ),
        filemtime( plugin_dir_url( __FILE__ ) . 'assets/slick/frontend.js' ),
        true
    );
    
    1. 在我的 frontend.js 中:
    jQuery( document ).ready( function() {
        createSlider();
    } );
    
    document.addEventListener( 'gutenbergSlick', function( e ) {
        window.setTimeout( createSlider, 1000 );
    }, false );
    
    const createSlider = function() {
        $(".slider").not(".slick-initialized").slick({
            dots: false,
            arrows: false,
            infinite: true,
            fade: true,
            autoplay: true,
            autoplaySpeed: 3000,
            slidesToShow: 1,
            adaptiveHeight: false,
            pauseOnHover: false,
        });
    };
    

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多