Block Hooks APIで既存の記事にブロック突っ込む
シェアボタンつくってみたはこれ。これを既存記事に突っ込んでいく。
まず読みます
カスタムブロック作ってそれを特定のブロック(本文エリアの下とか)に入れるのなら block.json に書いたうえで hooked_block_types
を書く
んー、でも別の記述見るとシンプルにただ置きたいだけなら block.json だけでいいのかなあ。
既存のブロックを使うのならこのあたりが参考になるのかな……
作ったカスタムブロックといえば…と思ってiapi-tabsでやってみたけど、インナーブロック含めるならblock.json だけじゃだめっぽいな〜。内容がないから編集画面でエラーが出る。今回作ったやつだとidつけたりなんやかんやしたりをやってるからそもそもブロックフックを前提にして作らないと厳しかったかも?
とりあえず決め打ちのテキストを出してみるか
タブのときみたいにブロック自体の作り込みはすまい………!!!!!
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "chiilog-blocks/copyright-use-hook",
"version": "0.1.0",
"title": "Chiilog Copyright",
"category": "text",
"icon": "smiley",
"description": "Example block scaffolded with Create Block tool.",
"example": {},
"supports": {
"html": false
},
"textdomain": "chiilog-copyright-use-hook",
"editorScript": "file:./index.js",
"editorStyle": "file:./index.css",
"style": "file:./style-index.css",
"viewScript": "file:./view.js",
"blockHooks": {
"core/post-content": "after"
}
}
とりあえずblockHooksだけ入れてみる。
出ないな????と思ってテンプレート編集画面見るとブロックこわれてた
エラー文はこれ
Block validation: Block validation failed for `chiilog-blocks/copyright-use-hook` ({name: 'chiilog-blocks/copyright-use-hook', icon: {…}, keywords: Array(0), attributes: {…}, providesContext: {…}, …}).
Content generated by `save` function:
<p class="wp-block-chiilog-blocks-copyright-use-hook">Chiilog Copyright – hello from the saved content!</p>
Content retrieved from post body:
これはsaveがうまくいってないのかなあ。当然リカバリーしたらなおるし、core/post-content
のうしろに表示されるようになります。
function add_copyright_block_after_post_title_block( $hooked_block_types, $relative_position, $anchor_block_type, $context ) {
// Only hook the block on Single templates (posts).
if ( ! $context instanceof WP_Block_Template || ! property_exists( $context, 'slug' ) || 'single' !== $context->slug ) {
return $hooked_block_types;
}
// Hook the block after the Post Content block.
if ( 'after' === $relative_position && 'core/post-title' === $anchor_block_type ) {
$hooked_block_types[] = 'chiilog-blocks/copyright-use-hook';
}
return $hooked_block_types;
}
add_filter( 'hooked_block_types', 'add_copyright_block_after_post_title_block', 10, 4 );
これで投稿ページにある core/post-title
の下に差込できる
コピーライトなのになんで投稿タイトルの下に出すねんというツッコミはなしで
カスタムブロック作って自動挿入したいのならカスタムブロックのプラグインのphpに含めたらいいけど、これデフォルトブロック使う場合ちょっと悩ましい気がするな?
テーマの領分と言われたらそうだし、プラグインの領分と言われてもそうだよなあと思う。
でも、大体こういう差し込みしたいのってテーマ変わったらいらないってなる可能性のが高いよね…?ということはテーマに入れるかなあ…… 🤔
複数はいらないから複数あるときは消すぞーってやるときは、フィルターの対象を該当のブロックにしぼる。
function remove_hooked_like_button_block_after_post_content( $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context ) {
// Has the hooked block been suppressed by a previous filter?
if ( is_null( $parsed_hooked_block ) ) {
return $parsed_hooked_block;
}
// Remove any Like Button blocks hooked after Post Content.
if ( 'core/post-content' === $parsed_anchor_block['blockName'] ) {
return null;
}
return $parsed_hooked_block;
}
// Priority is set to 15.
add_filter( 'hooked_block_chiilog-blocks/copyright-use-hook', 'remove_hooked_like_button_block_after_post_content', 15, 5 );
それにしてもこの……ブロック壊れるのどうにかならんか……?壊れる理屈はわかるんだけど……
あー参考のやつ見る感じ、render.php じゃないとだめかな?
render.php で表示に変えたらでた!
'single' !== $context->slug
とかで絞らなければどのページでも出る