Creé un complemento de bloque personalizado con @wordpress/create-block ( https://developer.wordpress.org/block-editor/reference-guides/packages/packages-create-block/ )
Funciona como un complemento, pero cuando lo muevo al tema, el "editorScript" en el archivo block.json devuelve la ruta incorrecta.
themeDirectory/blocks/mycustomblock/block.json { "name": "create-block/mycustomblock", "title": "Mycustomblock", "description": "Example block written with ESNext standard and JSX support – build step required.", "category": "text", "icon": "smiley", "supports": { "html": false }, "attributes":{ "backgroundColor": { "type": "string", "default": "red" } }, "editorScript": "file:./build/index.js" }
Ruta devuelta desde editorScript:
404 | http://localhost:8888/wordpress-test/wp-content/plugins/Users/jonrose/Dropbox/htdocs/wordpress-test/wp-content/themes/mytheme/blocks/mycustomblock/build/index.js?ver=4f45658ee3212a45c5d5367f6fbdfeba
Si registro el script dentro de la función register_block_type, funciona bien
wp_register_script( 'mycustomblock-js', get_template_directory_uri() . '/blocks/mycustomblock/build/index.js', array( 'wp-blocks' )); register_block_type( __DIR__, array( 'editor_script' => 'mycustomblock-js' ) );
Registrar un tipo de bloque con block.json
usa register_block_script_handle
bajo el capó para registrar todos los scripts de bloque relevantes. Esa función usa plugins_url
para generar URL si el script usa el patrón file:<path>
.
Pasar un identificador ya existente (por ejemplo, mycustomblock-js
) funciona porque register_block_script_handle
ve que no es file:<path>
y solo usa ese identificador (y la URL correspondiente) tal cual.
edavis es correcto y se llama al método plugins_url()
cuando se colocan en cola las editorScript
, editorStyle
y style
.
Aunque puede pasar otros argumentos a register_block_type
para declarar lo que necesita, me gusta la idea de mantener un archivo block.json
simple. Para hacer que esto funcione dentro de un tema, utilicé un enlace de filtro para plugins_url
para corregir la URL si detecta que la ruta del tema está incluida en la URL.
add_filter( 'plugins_url', function ( $url, $path, $plugin ) { if ( strpos( $url, get_template_directory() ) !== false ) { $url = str_replace( 'wp-content/plugins' . get_home_path(), '', $url ); } return $url; }, 10, 3 );