Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Criação de blocos para WordPress com JavaScript e React

Criação de blocos para WordPress com JavaScript e React

Introdução à criação de blocos para WordPress utilizando JavaScript e React.

Allyson Souza

February 26, 2024
Tweet

More Decks by Allyson Souza

Other Decks in Technology

Transcript

  1. Sou um dos fundadores do estúdio Haste, atuo como desenvolvimento

    e gestão de projetos. Contribuo sempre que possível com a comunidade do WordPress em São Paulo. Acredito que devemos buscar uma web livre, com software livre (de verdade). Dentre diversas coisas, gosto de design, programação e jogos. allysonsouza.com.br Allyson Souza
  2. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A A CHEGADA DO GUTENBERG Capítulo 1
  3. • Como implementar um layout com duas ou mais colunas?

    • Como inserir elementos de layout mais complexo, como textos sobre imagens? • Como reordenar esses elementos? Limitações do editor clássico
  4. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A ANATOMIA DO EDITOR 🔍
  5. JavaScript É importante estar familiarizado com a linguagem. Referências 🔗

    • JavaScript Tutorial for Beginners (1 hour): https:/ /www.youtube.com/watch?v=d 5ob3WAGeZE • JavaScript Beginners Microsoft: https:/ /www.youtube.com/watch?v=_ EDM5aPVLmo
  6. ES5 ou ESNext Nos referimos a EcmaScript 5 (ES5) como

    a especificação atual de JavaScript que os navegadores têm adotado. Quando falamos em EcmaScript Next (ESNext), é um apelido para a mais recente versão da especificação, seja ela qual for. O Felipe Elia tem um vídeo explicando muito melhor do que eu: https:/ /www.youtube.com/watch?v=H-NxmG1mN6c
  7. React • JSX • Componentes • Props (Mas se chegar

    a entender hooks, será ótimo!) Referências 🔗 • React Docs https:/ /pt-br.reactjs.org/
  8. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A AMBIENTE DE DESENVOLVIMENTO 🎠
  9. @wordpress/create-block npmjs.com/package/@wordpress/create-block Utilizando o pacote @wordpress/create-block nós teremos tudo que

    precisamos para criar um bloco com ESNext e React sem nos preocuparmos com configurações de compilação. Para criar blocos com ES5, você pode usar o @wordpress/blocks: npmjs.com/package/@wordpress/blocks
  10. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A CRIANDO UM BLOCO 🧱
  11. 1. Instalar o @wordpress/create-block npm install -g @wordpress/create-block Instale o

    @wordpress/create-block globalmente (com o parâmetro -g) usando o npm.
  12. 2. Criar o novo bloco cd wp-content/plugins/ npx @wordpress/create-block novo-bloco

    Navegue até o diretório de plugins e execute o comando de criação do novo bloco. Esse comando criará um plugin com o código base do nosso bloco. > Comandos npm start npm run build npm run format npm run lint:js npm run lint:css
  13. 3. Estrutura de pastas 📂 wp-content/ ├─ 📂 plugins/ ├─

    📂 novo-bloco/ ◀ ├─ 📂 build/ ├─ 📂 node_modules/ ├─ 📂 src/ ├─ .editorconfig ├─ .gitignore ├─ block.json ├─ novo-bloco.php ├─ package.json ├─ readme.txt A estrutura de pastas criada deve ser mais ou menos esta ao lado.
  14. 📂 wp-content/ ├─ 📂 plugins/ ├─ 📂 novo-bloco/ ├─ 📂

    build/ ├─ 📂 node_modules/ ├─ 📂 src/ ├─ .editorconfig ├─ .gitignore ├─ block.json ├─ novo-bloco.php ◀ ├─ package.json ├─ readme.txt 4. PHP Registro do plugin e registro do bloco com a função register_block_type()
  15. <?php /** * Plugin Name: Novo Bloco * Description: Example

    block with ESNext and JSX support. * Requires at least: 5.8 * Requires PHP: 7.0 * Version: 0.1.0 * Author: The WordPress Contributors * Text Domain: novo-bloco * @package create-block */ function create_block_novo_bloco_block_init() { register_block_type( __DIR__ ); } add_action( 'init', 'create_block_novo_bloco_block_init' ); novo-bloco.php
  16. { "apiVersion": 2, "name": "create-block/novo-bloco", "version": "0.1.0", "title": "Novo Bloco",

    "category": "widgets", "icon": "smiley", "description": "ESNext standard and JSX support.", "supports": { "html": false }, "textdomain": "novo-bloco", "editorScript": "file:./build/index.js", "editorStyle": "file:./build/index.css", "style": "file:./build/style-index.css" } block.json
  17. 5. Estrutura da pasta src 📂 wp-content/ ├─ 📂 plugins/

    ├─ 📂 novo-bloco/ ├─ 📂 build/ ├─ 📂 node_modules/ ├─ 📂 src/ ◀ └── edit.js └── editor.scss └── index.js └── save.js └── style.scss
  18. 6. index.js 📂 wp-content/ ├─ 📂 plugins/ ├─ 📂 novo-bloco/

    ├─ 📂 build/ ├─ 📂 node_modules/ ├─ 📂 src/ └── edit.js └── editor.scss └── index.js ◀ └── save.js └── style.scss No JavaScript é onde especificamos como o bloco será exibido.
  19. import { registerBlockType } from '@wordpress/blocks'; import './style.scss'; /** *

    Internal dependencies */ import Edit from './edit'; import save from './save'; registerBlockType( 'create-block/novo-bloco', { // @see ./edit.js edit: Edit, // @see ./save.js save, } ); src/index.js
  20. ... registerBlockType( 'create-block/novo-bloco', { edit: () => { }, save:

    () => { } } ); src/index.js Funções edit e save não precisam ser especificadas em arquivos separados
  21. 7. edit.js 📂 wp-content/ ├─ 📂 plugins/ ├─ 📂 novo-bloco/

    ├─ 📂 build/ ├─ 📂 node_modules/ ├─ 📂 src/ └── edit.js ◀ └── editor.scss └── index.js └── save.js └── style.scss O arquivo edit.js é onde fica a função edit, responsável pela renderização do bloco no editor.
  22. import { __ } from '@wordpress/i18n'; import { useBlockProps }

    from '@wordpress/block-editor'; import './editor.scss'; export default function Edit() { return ( <p { ...useBlockProps() }> { __( 'Novo Bloco! (Conteúdo no editor)', 'novo-bloco' ) } </p> ); } src/edit.js useBlockProps() Hook que dará saída a diversos atributos, como um className único para o bloco
  23. 8. save.js 📂 wp-content/ ├─ 📂 plugins/ ├─ 📂 novo-bloco/

    ├─ 📂 build/ ├─ 📂 node_modules/ ├─ 📂 src/ └── edit.js └── editor.scss └── index.js └── save.js ◀ └── style.scss O arquivo save.js é onde fica a função save, responsável pela “renderização” do bloco no site.
  24. import { __ } from '@wordpress/i18n'; import { useBlockProps }

    from '@wordpress/block-editor'; export default function save() { return ( <p { ...useBlockProps.save() }> { __( 'Novo Bloco! (Conteúdo salvo)' ) } </p> ); } src/save.js useBlockProps.save() Atenção, na função save nós precisamos usar useBlockProps.save() para dar saída nos atributos
  25. <!-- wp:create-block/novo-bloco --> <p class="wp-block-create-block-novo-bloco"> Novo Bloco – hello from

    the saved content! </p> <!-- /wp:create-block/novo-bloco --> Código salvo do bloco
  26. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A ATRIBUTOS 🎲
  27. Atributos // Exemplo 1 attributes: { conteudoDoParagrafo: { type: 'string',

    source: 'children', selector: 'p', }, } Atributos são uma forma de salvar estados de um bloco, permitindo, entre outras coisas, a edição de algumas de suas propriedades após o salvamento do post (em HTML) no banco de dados. https:/ /developer.wordpress.org/b lock-editor/reference-guides/bloc k-api/block-attributes/
  28. Atributos // Exemplo 2 attributes: { imageURL: { type: 'string',

    source: 'attribute', selector: 'img', attribute: ‘src’ }, } Atributos são uma forma de salvar estados de um bloco, permitindo, entre outras coisas, a edição de algumas de suas propriedades após o salvamento do post (em HTML) no banco de dados. https:/ /developer.wordpress.org/b lock-editor/reference-guides/bloc k-api/block-attributes/
  29. import { registerBlockType } from '@wordpress/blocks'; import { useBlockProps, RichText

    } from '@wordpress/block-editor'; registerBlockType( 'create-block/bloco-dinamico', { attributes: { richTextContent: { type: 'string', source: 'children', selector: 'p', }, }, edit: Edit, save, }); src/index.js
  30. export default function Edit( {attributes, setAttributes} ) { const blockProps

    = useBlockProps(); const onChangeContent = ( newContent ) => { setAttributes( { richTextContent: newContent } ); }; return ( <RichText { ...blockProps } onChange={ onChangeContent } tagName="p" value={ attributes.richTextContent } /> ); } src/edit.js
  31. export default function save( { attributes } ) { return

    ( <RichText.Content { ...useBlockProps.save() } tagName="p" value={ attributes.richTextContent } /> ); } src/save.js
  32. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A PARA CONTINUAR ESTUDANDO 🎓
  33. Componentes import { RichText } from '@wordpress/block-editor'; <RichText { ...blockProps

    } onChange={ onChangeContent } tagName="p" value={ attributes.richTextContent } formattingControls={ [ 'bold', 'italic' ] } /> Se aprofundar nas opções e possibilidades que o componente RichText oferece. https:/ /developer.wordpress.org/block-edit or/reference-guides/richtext/
  34. Supports registerBlockType( 'create-block/novo-bloco', { supports: { color: { gradients: true,

    } }, edit: Edit, save, } ); Supports é a API que permite que você declare que seu bloco dá suporte a recursos do editor, como seleção de cor de fundo, alinhamento, tamanho de fonte, entre outros. https:/ /developer.wordpress.org/block-edit or/reference-guides/block-api/block-supp orts/
  35. Apenas com isso já conseguimos ter suporte funcional ao seletor

    de gradiente de fundo do próprio editor.
  36. InnerBlocks import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; export default

    function Edit() { return ( <div { ...useBlockProps() }> <InnerBlocks allowedBlocks={['core/image', 'core/paragraph']} /> </div> ); } Crie blocos que aceitam outros blocos com o componente InnerBlocks. https:/ /developer.wordpress.org/block-edit or/how-to-guides/block-tutorial/nested-bl ocks-inner-blocks/
  37. Templates export default function Edit() { const MY_TEMPLATE = [

    [ 'core/image', {} ], [ 'core/heading', { placeholder: 'Book Title' } ], [ 'core/paragraph', { placeholder: 'Summary' } ], ]; //... return ( <InnerBlocks template={ MY_TEMPLATE } templateLock="all" /> ); } Especifique templates, um conjunto de blocos pré-definidos com os quais seu InnerBlocks virá preenchido. https:/ /developer.wordpress.org/block-edit or/how-to-guides/block-tutorial/nested-bl ocks-inner-blocks/#template
  38. Block Toolbar Utilizar e personalizar a toolbar do bloco. https:/

    /developer.wordpress.org/block-edit or/how-to-guides/block-tutorial/block-con trols-toolbar-and-sidebar/
  39. Settings Sidebar Criar opções e campos de configuração para seus

    blocos na sidebar. https:/ /developer.wordpress.org/block-edit or/how-to-guides/block-tutorial/block-cont rols-toolbar-and-sidebar/#settings-sidebar
  40. A S S U N T O D A PA

    L E S T R A A S S U N T O D A PA L E S T R A Considerações
  41. Para pensar... • Evolução acelerada da API • Novo paradigma

    no CMS • Full Site Editing • Headless
  42. WooCommerce: a plataforma mais popular de e-commerce do mundo O

    WooCommerce é um plugin gratuito para WordPress, que o transforma em uma plataforma de e-commerce. Para isso adiciona as funcionalidades necessárias para que pessoas efetuem compras online no site, como por exemplo: • Catálogo de produtos • Carrinho de compras para os clientes • Checkout • Ferramentas de gerenciamento da loja virtual
  43. "O WordPress é um CMS, um sistema de gerenciamento de

    conteúdo. É um software livre, open-source e gratuito. Fornece estrutura (banco de dados, templates de exibição, etc.) e uma interface amigável (painel do WordPress) para publicação de conteúdo na web, sem que seja necessário entrar em contato com o código." — Freire, Paulo. Comunicação e educação. 1980.
  44. Referências • Gerais • Teste o editor de blocos: https:/

    /wordpress.org/gutenberg/ [em inglês] • JavaScript • JS: A forma certa: https:/ /jstherightway.org/pt-br/ • JavaScript Tutorial for Beginners (1 hour): https:/ /www.youtube.com/watch?v=d5ob3WAGeZE • JavaScript Beginners Microsoft: https:/ /www.youtube.com/watch?v=_EDM5aPVLmo