コアに含める前にGutenbergで遊んでいます。既存のギャラリーブロックを拡張して表示を変更する方法を知りたいです。たとえば、サムネイルのグリッドではなく、画像のスライドショーを表示したいです。出来ますか?もしそうなら、どのように?任意の助けをいただければ幸いです。
コアに含める前にGutenbergで遊んでいます。既存のギャラリーブロックを拡張して表示を変更する方法を知りたいです。たとえば、サムネイルのグリッドではなく、画像のスライドショーを表示したいです。出来ますか?もしそうなら、どのように?任意の助けをいただければ幸いです。
回答:
さて、私はこれを少しの間遊んでいますが、ギャラリーブロックの出力を変更することに成功しました。次の警告があります。
@wordpress/hooks
、Coreでどのフックシステムを使用するかについての議論が進行中に使用しています。最初に行う必要があるのは、スクリプトの登録です。これはで行われますwp_enqueue_scripts()
が、enqueue_block_editor_assets
フックで行われます。
スクリプトには、wp-blocks
スクリプトを依存関係として含める必要があります。ほぼ確実にエディターに既に読み込まれていますが、依存関係にすることで、スクリプトの前に確実に読み込まれます。
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は、ブロックのsave()
メソッドによって処理されます。このファイルでギャラリーブロックを確認できます。
この段階(2018年3月)では、Gutenbergはブロックの保存方法に関するフィルターをサポートしていますblocks.getSaveElement
。次のように、JavaScriptでこれにフックを追加できます。
wp.hooks.addFilter(
'blocks.getSaveElement',
'wpse-298225',
wpse298225GallerySaveElement
)
最初の引数はフック名、2番目の引数は-名前空間、最後の引数はコールバック関数です。
save()
ブロックのメソッドを置き換えるため、新しい要素を返す必要があります。ただし、これは返す必要がある通常のHTML要素ではありません。React要素を返す必要があります。
元のブロックのsave()
メソッドを見ると、JSXが見えます。Gutenbergが内部で使用するReactは、要素のレンダリング用にサポートしています。詳細については、この記事を参照してください。
通常、JSXにはビルドステップが必要ですが、この例ではビルドステップを紹介していないため、JSXなしで要素を作成する方法が必要です。Reactはこれを提供しcreateElement()
ます。WordPressは、この機能やその他の反応機能のラッパーをの形式で提供しwp.element
ます。したがって、使用するにcreateElement()
はを使用しますwp.element.createElement()
。
コールバック関数でblocks.getSaveElement
は、次を取得します。
element
ブロックによって作成された元の要素。blockType
使用されているブロックを表すオブジェクト。attributes
ブロックインスタンスのプロパティ。この例では、ギャラリーの画像と列数などの設定が含まれます。したがって、コールバック関数には次のことが必要です。
ここで単に出力完了例でul
、クラスとmy-gallery
、そしてli
クラスで各画像に対してだmy-gallery-item
とし、img
各一方のsrc
画像のURLへセットが。
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
}
注意するべきいくつかの事柄:
ul.wp-block-gallery .blocks-gallery-item
するため、ブロックを編集するにはこのマークアップとそれらのクラスが必要です。このマークアップは、デフォルトのスタイル設定にも使用されます。attributes.images.map
各画像をループし、子要素の配列をメイン要素のコンテンツとして返します。これらの要素の中には、画像自体の別の子要素があります。更新された答えを提供するためにここに。この投稿は、ギャラリーブロックを拡張する方法の質問に答えるのに非常に役立ちました。
つまり、既存のブロックを拡張するのではなく、新しいブロックを作成することをお勧めします。上記のリンクの投稿から:
[拡張することにより]ブロックのHTMLを変更すると、元のブロックとして認識されません。コアブロックを操作しようとするよりも、コアブロックの登録を解除し、代わりに新しい置換ブロックを登録する方が安全なアプローチになるようです。この方法により、サイトのユーザーが特定のカスタマイズされたギャラリーを使用するようになります。独自のHTML構造を定義します。
上記のリンクも参照しています は、ブロック作成を開始するために必要なすべてを生成するコマンドラインツールであるCreate-Guten_Blockプラグインしています。このツールは非常に使いやすく、セットアップも簡単です。
これらのリソースを使用して、カスタムギャラリーブロックを短時間で開発する方法を理解することができました