Tworzenie bloków Gutenberga za pomocą ACF Blocks

Jak tworzyć własne bloki za pomocą Advanced Custom Fields. Na co zwracać uwagę, na jakie problemy można natrafić i jak ułatwić sobie życie wplątując w to odrobinę Timbera.

Maciek Palmowski

HelloMaciek Palmowski

email m.palmowski@freshpixels.pl

wordpress.org profiles.wordpress.org/palmiak

github github.com/palmiak

Timber Collaborator github.com/timber/timber

WordPress Developer OsomStudio

Czym jest Gutenberg?

Czym jest Gutenberg?

  • nowy, blokowy edytor w WordPress 5.0
  • zmienia zupełnie sposób tworzenia elementów w panelu administratora (ReactJS)
  • zwiększa elastyczność przy tworzeniu treści

Czy łatwo jest stworzyć blok w Gutenbergu?

Czy łatwo jest stworzyć blok w Gutenbergu?

Użyjmy create-guten-block który wg. autora ma takie zalety jak:

  • zero konfiguracji
  • pozwala tworzyć bloki w minuty

Czy łatwo jest stworzyć blok w Gutenbergu?

Instalacja

                                    
npx create-guten-block my-block
cd my-block
npm start
                                    
                                

Czy łatwo jest stworzyć blok w Gutenbergu?

                                    ├── .gitignore
├── plugin.php
├── package.json
├── README.md
├── dist
|  ├── blocks.build.js
|  ├── blocks.editor.build.css
|  └── blocks.style.build.css
└── src
    ├── block
    |  ├── block.js
    |  ├── editor.scss
    |  └── style.scss
    ├── blocks.js
    ├── common.scss
    └── init.php
                                    
                                

Czy łatwo jest stworzyć blok w Gutenbergu?

Pozstają nam tylko dwa kroki:

  • nauczyć się Reacta
  • wykorzystać pozyskaną wiedzę i stworzyć blok
>

Czy warto?

TAK:

  • tylko tak wykorzystamy pełen potencjał Gutenberga
  • nie będziemy uzależnieni od różnych bibliotek z blokami

Ale czy to konieczne?

NIE:

  • większość bloków, które tworzymy ogranicza się do tego, że user wpisuje dane, a my je wyświetlamy

Jakie mamy wyjścia?

  • ACF Blocks
  • Carbon Fields
  • Lazy Blocks
  • Blocks Lab

ACF Blocks - możliwości

  • możemy tworzyć formularze (jak to w ACF)
  • możemy podejrzeć jak wygląda dany blok
  • zaspokoić potrzeby większości klientów

Wady

  • ACF Blocks ma ograniczenia w kwestii korzystania z natywnych elementów interface'u Gutenberga
  • Gutenberg ciągle się zmienia co nie ułatwia doprowadzenia wszystkiego do ładu

Nasz cel

Tworzymy blok

                                    add_action('acf/init', 'my_acf_init');
function my_acf_init() {
    if( function_exists('acf_register_block_type') ) {
        acf_register_block_type([
            'name'  => 'trips', // nazwa
            'title' => __('Trips'), // wyświetlany tytuł
            'description' => __('Promoted trips'), // opis
            'render_callback' => 'my_acf_block_render_callback', // nazwa funkcji renderującej
            'category' => 'layout', // kategoria
            'icon' => 'location-alt', // ikona
            'keywords' => [ 'trips', 'flights' ], // słowa kluczowe
        ]);
    }
}
                                

Tworzymy blok

                                    function my_acf_block_render_callback( $block, $content='', $is_preview ) {
    $context = Timber::get_context();
    // Wszystkie informacje o bloku
    $context['block'] = $block;
    // Wszystkie pola użyte w bloku
    $context['fields'] = get_fields(); 
    // Sprawdzamy czy to podgląd w panelu admina.
    $context['is_preview'] = $is_preview;
    // Renderujemy blok.
    Timber::render( 'views/blocks/trip-block.twig', $context );
}
                                

Ustawienia

Panel administratora

Działa :)

Są jednak dwa problemy:

  • Blok w panelu admina wygląda inaczej niż na froncie
  • W panelu nie działa nam Packery

Własne style i skrypty

                                function my_acf_block_editor_style() {
    wp_enqueue_style(
        'trips_css',
        get_template_directory_uri() .'/dist/css/editor.css'
    );
    wp_enqueue_script(
        'trips_js',
        get_template_directory_uri() .'/dist/js/editor.js'
    );
}
add_action( 'enqueue_block_editor_assets', 'my_acf_block_editor_style' );
                            

Własne style i skrypty

                                acf_register_block_type([
    'name'  => 'trips', // nazwa
    'title' => __('Trips'), // wyświetlany tytuł
    'description' => __('Promoted trips'), // opis
    'render_callback' => 'my_acf_block_render_callback', // nazwa funkcji renderującej
    'category' => 'layout', // kategoria
    'icon' => 'location-alt', // ikona
    'keywords' => [ 'trips', 'flights' ], // słowa kluczowe
    'enqueue_style' => get_template_directory_uri() .'/dist/css/editor.css',
    'enqueue_script' => get_template_directory_uri() .'/dist/js/editor.js',
]);
                            

Na co warto uważać

  • w przeciwieństwie do TinyMCE - tutaj nie ma iframe
  • trzeba ostrzożnie podchodzić do stylowania html, body, a etc
  • warto wyelminować w panelu admina możliwość klikania w URLe

Na co warto uważać

  • warto stworzyć sobie osobny styl tylko dla edytora, ale używający komponentów z frontu
                                        .gutenberg-sasquatch-block {
    @import "components/colors";
    @import "components/mixins";
    @import "components/standards";
    @import "components/typo";
    @import "components/buttons";

    @import "layouts/index";
}
                                

Na co warto uważać

  • warto blok owinąć w dodatkowy div z indywidualną klasą
                                        
...

Packery i inne JS

Nie działa, bo:

  • nie jest powiązany z eventem, który byłby odpalany po wyświetleniu podglądu

Packery i inne JS

                                    window.acf.addAction('render_block_preview', function( $el, attributes ){
    $.bridget( 'packery', Packery, $ );
    if ( $( '.offers-list').length ) {
        imagesLoaded( $( '.offers-list' ), function() {
            $( '.offers-list' ).each( function( i ) {
                $( '.offers-list' ).packery(
                    {
                        itemSelector: '.item',
                    }
                );
            });
        });
    }
});
                                

Teraz działa

Teraz działa

Wnioski

  • Bardzo intensywny rozwój Gutenberga w połączeniu z chorobami wieku dziecięcego ACF Blocks mogą napsuć nam trochę krwi
  • ACF Blocks ma ograniczenia jeśli chodzi o dodatkowe elementy interface'u (np. sidebar czy dodatkowe menu kontekstowe) - trzeba więc bardzo poważnie pomyśleć jak stworzyć wygodny interface

Pytania?

Zapraszamy na wordpressowka.pl