Cum să extinzi blocul de galerie în Gutenberg?

19 mar. 2018, 11:12:40
Vizualizări: 16.1K
Voturi: 17

Testez Gutenberg înainte de includerea sa în nucleu și aș dori să știu cum să extind blocul existent de galerie pentru a-i schimba afișarea. De exemplu, în loc de o grilă de thumbnail-uri, aș vrea să afișez un slideshow de imagini. Este posibil? Dacă da, cum? Orice ajutor ar fi apreciat.

3
Comentarii

Există un capitol despre Extensibilitate în Manualul Gutenberg, care ar putea fi primul pas pentru a vedea dacă acele filtre din secțiunea Modificarea Blocurilor pot fi utilizate în acest caz.

birgire birgire
19 mar. 2018 17:59:52

Se pare că acest capitol a fost adăugat recent. Nu l-am văzut înainte. În orice caz, fiind marcat ca experimental, această funcționalitate este supusă modificărilor. Voi aștepta până când va fi stabilă. Mulțumesc!

leemon leemon
20 mar. 2018 00:18:21

Următoarea documentație este mai actualizată: https://github.com/WordPress/gutenberg/blob/master/docs/extensibility.md

leemon leemon
20 mar. 2018 13:55:22
Toate răspunsurile la întrebare 2
1
21

OK, am experimentat cu asta pentru o vreme și am reușit să modific output-ul blocului Gallery, cu următoarele limitări:

  • Previzualizarea nu se potrivește cu output-ul. Cred că acest lucru este posibil, dar pare a fi mai complex.
  • Anumite clase și markup sunt necesare în output pentru ca blocul să poată analiza conținutul și să-l păstreze editabil. Aceste clase au stiluri pentru front-end care vor trebui gestionate. Nu sunt sigur în acest moment dacă există o modalitate de a filtra cum face blocul acest lucru. Chiar dacă ar fi posibil, s-ar putea să nu fie o idee bună dacă înseamnă că blocurile Gallery sunt stricate atunci când o temă sau un plugin este dezactivat. Un bloc complet nou ar fi probabil soluția pentru situațiile în care acest lucru ar fi necesar.
  • Nu sunt sigur cum funcționează dimensiunile imaginilor în acest stadiu.
  • Metoda de hook-uri JavaScript folosită s-ar putea să nu fie relevantă în versiunea finală. Gutenberg folosește @wordpress/hooks în timp ce discuția despre ce sistem de hook-uri să fie folosit în Core este în desfășurare.
  • Deoarece output-ul blocurilor este salvat ca HTML, nu ca shortcode sau meta, nu va fi posibil să modifici output-ul galeriilor existente fără să le editezi.

Primul lucru pe care trebuie să-l facem este să înregistrăm un script. Acest lucru se face cu wp_enqueue_scripts(), dar pe hook-ul enqueue_block_editor_assets.

Scriptul ar trebui să aibă wp-blocks ca dependință. Este aproape sigur că este deja încărcat în editor, dar marcându-l ca dependință asigurăm că este încărcat înaintea scriptului nostru.

function wpse_298225_enqueue_block_assets() {
    wp_enqueue_script(
        'wpse-298225-gallery-block',
        get_theme_file_uri( 'block.js' ),
        ['wp-blocks']
    );
}
add_action( 'enqueue_block_editor_assets', 'wpse_298225_enqueue_block_assets' );

HTML-ul pentru output-ul unui bloc este gestionat de metoda save() a blocului. Puteți vedea metoda pentru blocul Gallery în acest fișier.

În acest stadiu (martie 2018), Gutenberg suportă un filtru pe metoda save() a blocurilor, blocks.getSaveElement. Putem adăuga un hook pentru acesta în JavaScript astfel:

wp.hooks.addFilter(
    'blocks.getSaveElement',
    'wpse-298225',
    wpse298225GallerySaveElement
)

Primul argument este numele hook-ului, al doilea este - cred - un namespace, iar ultimul argument este funcția callback.

Deoarece înlocuim metoda save() a blocului, trebuie să returnăm un element nou. Totuși, acesta nu este un element HTML normal pe care trebuie să-l returnăm. Trebuie să returnăm un element React.

Când te uiți la metoda save() originală a blocului, vezi JSX. React, pe care Gutenberg îl folosește în spate, suportă JSX pentru randarea elementelor. Consultați acest articol pentru mai multe detalii.

JSX necesită în mod normal un pas de build, dar deoarece nu introduc un pas de build pentru acest exemplu, avem nevoie de o modalitate de a crea un element fără JSX. React oferă acest lucru cu createElement(). WordPress oferă un wrapper pentru această funcționalitate și alte funcționalități React sub forma wp.element. Deci, pentru a folosi createElement(), folosim wp.element.createElement().

În funcția callback pentru blocks.getSaveElement primim:

  • element Elementul original creat de bloc.
  • blockType Un obiect care reprezintă blocul folosit.
  • attributes Proprietățile instanței blocului. În exemplul nostru, acestea includ imaginile din galerie și setări precum numărul de coloane.

Deci, funcția noastră callback trebuie să:

  • Returneze elementul original pentru galeriile care nu sunt blocuri.
  • Preia atributele, în special imaginile, și creează un nou element React din ele reprezentând galeria.

Iată un exemplu complet care simplu afișează un ul cu o clasă, my-gallery, și li pentru fiecare imagine cu clasa my-gallery-item și un img în fiecare cu src setat la URL-ul imaginii.

function wpse298225GallerySaveElement( element, blockType, attributes ) {
    if ( blockType.name !== 'core/gallery' ) {
        return element;
    }

    var newElement = wp.element.createElement(
        'ul',
        {
            'className': 'wp-block-gallery my-gallery',
        },
        attributes.images.map(
            function( image ) {
                return wp.element.createElement(
                    'li',
                    {
                        'className': 'blocks-gallery-item my-gallery-item',
                    },
                    wp.element.createElement(
                        'img',
                        {
                            'src': image.url,
                        }
                    )
                )
            }
        )
    )

    return newElement
}

Câteva aspecte de remarcat:

  • Blocul original de galerie găsește imagini căutând ul.wp-block-gallery .blocks-gallery-item, deci acest markup și aceste clase sunt necesare pentru ca editarea blocului să fie posibilă. Acest markup este folosit și pentru stilizarea implicită.
  • attributes.images.map parcurge fiecare imagine și returnează un array de elemente copil ca conținut pentru elementul principal. În interiorul acestor elemente există un alt element copil pentru imaginea în sine.
21 mar. 2018 11:57:19
Comentarii

Toate fișierele legate returnează eroarea 404.

TCB13 TCB13
16 iun. 2020 14:29:14
2

Voi oferi un răspuns actualizat. Am găsit acest articol extrem de util pentru a răspunde la întrebarea cum să extindem Gallery Block.

Pe scurt, este recomandabil să creezi un bloc nou în loc să extinzi unul existent. Din articolul menționat mai sus:

dacă modifici HTML-ul unui bloc [prin extindere], acesta nu va fi recunoscut ca blocul original. Mai degrabă decât să încerci să manipulezi un bloc de bază, pare o abordare mai sigură să dezînregistrezi blocul de bază și să înregistrezi un nou bloc de înlocuire - astfel te asiguri că utilizatorii site-ului vor folosi galeria ta particularizată, care va fi validă deoarece definește propria structură HTML.

Articolul menționat face referire și la plugin-ul Create-Guten-Block, care este un instrument de linie de comandă ce generează tot ce ai nevoie pentru a începe crearea de blocuri. Instrumentul este foarte ușor de utilizat și simplu de configurat.

Cu aceste resurse, am reușit să înțeleg cum să dezvolt un bloc personalizat de galerie într-un timp scurt.

14 feb. 2019 01:50:44
Comentarii

Ai alte sfaturi despre crearea unui bloc de galerie? Mi se pare că există o cantitate semnificativă de muncă pe partea de editor pentru a suporta toate funcțiile CRUD necesare. Soluția din nucleul WP gestionează totul, de la încărcarea imaginilor până la sortarea lor, adăugarea de noi, ștergerea celor existente etc. Modul în care văd eu lucrurile este că este multă muncă să recreezi aceeași funcționalitate care vine predefinită doar pentru a personaliza partea de frontend.

phip phip
5 feb. 2020 04:06:47

@phip au trecut aproximativ 6 luni de când am fost profund implicat în blocuri Gutenberg și știu că multe s-au schimbat. Sunt de acord cu ceea ce spui, dacă te-am înțeles corect. Părea copleșitor să construiești interfețe personalizate pentru gestionarea operațiunilor CRUD.

Versiunea Pro a Advanced Custom Fields îți permite să creezi scheme de date personalizate pentru blocuri. Pentru mai multe informații, https://www.advancedcustomfields.com/resources/blocks/. Deși mi-a plăcut să învăț să folosesc React pentru a construi blocuri, folosirea ACF a fost un mare economisitor de timp.

Jeff Wilkerson Jeff Wilkerson
7 feb. 2020 23:29:45