/**
* Adds a field to the WooCommerce product block editor.
*
* @see https://wpcodebook.com/woocommerce-add-field-product-block-editor/
*/
class WPCodebook_WC_Product_Block_Editor {
/**
* Field key.
*/
public $field_key = 'my_key';
/**
* Constructor.
*/
function __construct() {
// Check if product block editor is enabled
if (
! class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ||
! \Automattic\WooCommerce\Utilities\FeaturesUtil::feature_is_enabled( 'product_block_editor' )
) {
return;
}
// Add block
add_action( 'woocommerce_layout_template_after_instantiation', array( $this, 'add_block' ), 10, 3 );
// Save in REST
add_filter( 'woocommerce_rest_pre_insert_product_object', array( $this, 'save_field' ), 10, 3 );
add_filter( 'woocommerce_rest_pre_insert_product_variation_object', array( $this, 'save_field' ), 10, 3 );
// Add in REST
add_filter( 'woocommerce_rest_prepare_product_object', array( $this, 'get_field' ), 10, 3 );
add_filter( 'woocommerce_rest_prepare_product_variation_object', array( $this, 'get_field' ), 10, 3 );
}
/**
* Adds block to the "Inventory" tab.
*/
function add_block( $template_id, $template_area, $template ) {
if (
! ( $section = $template->get_section_by_id( 'product-inventory-section' ) ) &&
! ( $section = $template->get_section_by_id( 'product-variation-inventory-section' ) )
) {
return;
}
$section->add_block(
array(
'id' => $this->field_key,
'blockName' => 'woocommerce/product-text-field',
'order' => 10,
'attributes' => array(
'property' => $this->field_key,
'label' => esc_html__( 'My field' ),
),
)
);
}
/**
* Saves field value in meta.
*/
function save_field( $product, $request, $creating ) {
if ( isset( $request[ $this->field_key ] ) ) {
$product->update_meta_data( $this->field_key, wc_clean( $request[ $this->field_key ] ) );
}
return $product;
}
/**
* Gets field value from meta.
*/
function get_field( $response, $product, $request ) {
$response->data[ $this->field_key ] = $product->get_meta( $this->field_key );
return $response;
}
}
/**
* Init.
*/
add_action( 'plugins_loaded', function () {
new WPCodebook_WC_Product_Block_Editor();
} );