Add after_add_block and after_remove_block hooks, and logging
This commit is contained in:
parent
229f262748
commit
e15bc6a13a
|
@ -39,23 +39,23 @@ trait BlockContainerTrait {
|
|||
}
|
||||
|
||||
$is_detached = method_exists( $this, 'is_detached' ) && $this->is_detached();
|
||||
if ( ! $is_detached ) {
|
||||
if ( $is_detached ) {
|
||||
BlockTemplateLogger::get_instance()->warning(
|
||||
'Block added to detached container. Block will not be included in the template, since the container will not be included in the template.',
|
||||
[
|
||||
'block' => $block,
|
||||
'container' => $this,
|
||||
'template' => $this->get_root_template(),
|
||||
]
|
||||
);
|
||||
} else {
|
||||
$this->get_root_template()->cache_block( $block );
|
||||
}
|
||||
|
||||
$this->inner_blocks[] = &$block;
|
||||
|
||||
/**
|
||||
* Action called after a block is added to a block container.
|
||||
*
|
||||
* This action can be used to perform actions after a block is added to the block container,
|
||||
* such as adding a dependent block.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*
|
||||
* @since 8.2.0
|
||||
*/
|
||||
do_action( 'woocommerce_block_template_after_add_block', $block );
|
||||
$this->do_after_add_block_action( $block );
|
||||
$this->do_after_add_specific_block_action( $block );
|
||||
|
||||
return $block;
|
||||
}
|
||||
|
@ -131,10 +131,6 @@ trait BlockContainerTrait {
|
|||
$block->remove_blocks();
|
||||
}
|
||||
|
||||
// Remove block from root template's cache.
|
||||
$root_template = $this->get_root_template();
|
||||
$root_template->uncache_block( $block->get_id() );
|
||||
|
||||
$parent = $block->get_parent();
|
||||
$parent->remove_inner_block( $block );
|
||||
}
|
||||
|
@ -158,16 +154,29 @@ trait BlockContainerTrait {
|
|||
* @param BlockInterface $block The block.
|
||||
*/
|
||||
public function remove_inner_block( BlockInterface $block ) {
|
||||
// Remove block from root template's cache.
|
||||
$root_template = $this->get_root_template();
|
||||
$root_template->uncache_block( $block->get_id() );
|
||||
|
||||
$this->inner_blocks = array_filter(
|
||||
$this->inner_blocks,
|
||||
function ( BlockInterface $inner_block ) use ( $block ) {
|
||||
return $inner_block !== $block;
|
||||
}
|
||||
);
|
||||
|
||||
BlockTemplateLogger::get_instance()->info(
|
||||
'Block removed from template.',
|
||||
[
|
||||
'block' => $block,
|
||||
'template' => $root_template,
|
||||
]
|
||||
);
|
||||
|
||||
$this->do_after_remove_block_action( $block );
|
||||
$this->do_after_remove_specific_block_action( $block );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the inner blocks sorted by order.
|
||||
*/
|
||||
|
@ -206,4 +215,141 @@ trait BlockContainerTrait {
|
|||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do the `woocommerce_block_template_after_add_block` action.
|
||||
* Handle exceptions thrown by the action.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*/
|
||||
private function do_after_add_block_action( BlockInterface $block ) {
|
||||
try {
|
||||
/**
|
||||
* Action called after a block is added to a block container.
|
||||
*
|
||||
* This action can be used to perform actions after a block is added to the block container,
|
||||
* such as adding a dependent block.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*
|
||||
* @since 8.2.0
|
||||
*/
|
||||
do_action( 'woocommerce_block_template_after_add_block', $block );
|
||||
} catch ( \Exception $e ) {
|
||||
$this->handle_exception_doing_action(
|
||||
'Error after adding block to template.',
|
||||
'woocommerce_block_template_after_add_block',
|
||||
$block,
|
||||
$e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do the `woocommerce_block_template_area_{template_area}_after_add_block_{block_id}` action.
|
||||
* Handle exceptions thrown by the action.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*/
|
||||
private function do_after_add_specific_block_action( BlockInterface $block ) {
|
||||
try {
|
||||
/**
|
||||
* Action called after a specific block is added to a template with a specific area.
|
||||
*
|
||||
* This action can be used to perform actions after a specific block is added to a template with a specific area,
|
||||
* such as adding a dependent block.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*
|
||||
* @since 8.2.0
|
||||
*/
|
||||
do_action( "woocommerce_block_template_area_{$this->get_root_template()->get_area()}_after_add_block_{$block->get_id()}", $block );
|
||||
} catch ( \Exception $e ) {
|
||||
$this->handle_exception_doing_action(
|
||||
'Error after adding block to template.',
|
||||
"woocommerce_block_template_area_{$this->get_root_template()->get_area()}_after_add_block_{$block->get_id()}",
|
||||
$block,
|
||||
$e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do the `woocommerce_block_template_after_remove_block` action.
|
||||
* Handle exceptions thrown by the action.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*/
|
||||
private function do_after_remove_block_action( BlockInterface $block ) {
|
||||
try {
|
||||
/**
|
||||
* Action called after a block is removed from a block container.
|
||||
*
|
||||
* This action can be used to perform actions after a block is removed from the block container,
|
||||
* such as removing a dependent block.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*
|
||||
* @since 8.2.0
|
||||
*/
|
||||
do_action( 'woocommerce_block_template_after_remove_block', $block );
|
||||
} catch ( \Exception $e ) {
|
||||
$this->handle_exception_doing_action(
|
||||
'Error after removing block from template.',
|
||||
'woocommerce_block_template_after_remove_block',
|
||||
$block,
|
||||
$e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do the `woocommerce_block_template_area_{template_area}_after_remove_block_{block_id}` action.
|
||||
* Handle exceptions thrown by the action.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*/
|
||||
private function do_after_remove_specific_block_action( BlockInterface $block ) {
|
||||
try {
|
||||
/**
|
||||
* Action called after a specific block is removed from a template with a specific area.
|
||||
*
|
||||
* This action can be used to perform actions after a specific block is removed from a template with a specific area,
|
||||
* such as removing a dependent block.
|
||||
*
|
||||
* @param BlockInterface $block The block.
|
||||
*
|
||||
* @since 8.2.0
|
||||
*/
|
||||
do_action( "woocommerce_block_template_area_{$this->get_root_template()->get_area()}_after_remove_block_{$block->get_id()}", $block );
|
||||
} catch ( \Exception $e ) {
|
||||
$this->handle_exception_doing_action(
|
||||
'Error after removing block from template.',
|
||||
"woocommerce_block_template_area_{$this->get_root_template()->get_area()}_after_remove_block_{$block->get_id()}",
|
||||
$block,
|
||||
$e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an exception thrown by an action.
|
||||
*
|
||||
* @param string $message The message.
|
||||
* @param string $action_tag The action tag.
|
||||
* @param BlockInterface $block The block.
|
||||
* @param \Exception $e The exception.
|
||||
*/
|
||||
private function handle_exception_doing_action( string $message, string $action_tag, BlockInterface $block, \Exception $e ) {
|
||||
BlockTemplateLogger::get_instance()->error(
|
||||
$message,
|
||||
[
|
||||
'exception' => $e,
|
||||
'action' => $action_tag,
|
||||
'container' => $this,
|
||||
'block' => $block,
|
||||
'template' => $this->get_root_template(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue