* Pattern: fetch product id on the frontend side

* fix TS type
This commit is contained in:
Luigi Teschio 2023-10-05 09:30:50 +02:00 committed by GitHub
parent dec4e4fc75
commit ad80598ab8
3 changed files with 28 additions and 28 deletions

View File

@ -2,18 +2,19 @@
* External dependencies * External dependencies
*/ */
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useState } from '@wordpress/element'; import { useEffect, useState } from '@wordpress/element';
import { Placeholder, Button, PanelBody } from '@wordpress/components'; import { Placeholder, Button, PanelBody } from '@wordpress/components';
import { withProduct } from '@woocommerce/block-hocs'; import { withProduct } from '@woocommerce/block-hocs';
import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary'; import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
import EditProductLink from '@woocommerce/editor-components/edit-product-link'; import EditProductLink from '@woocommerce/editor-components/edit-product-link';
import { singleProductBlockPreview } from '@woocommerce/resource-previews';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
import { ProductResponseItem } from '@woocommerce/types'; import { ProductResponseItem } from '@woocommerce/types';
import ErrorPlaceholder, { import ErrorPlaceholder, {
ErrorObject, ErrorObject,
} from '@woocommerce/editor-components/error-placeholder'; } from '@woocommerce/editor-components/error-placeholder';
import { PRODUCTS_STORE_NAME, Product } from '@woocommerce/data';
import { useSelect } from '@wordpress/data';
/** /**
* Internal dependencies * Internal dependencies
*/ */
@ -52,9 +53,29 @@ const Editor = ( {
const [ isEditing, setIsEditing ] = useState( ! productId ); const [ isEditing, setIsEditing ] = useState( ! productId );
const blockProps = useBlockProps(); const blockProps = useBlockProps();
if ( isPreview ) { const productPreview = useSelect( ( select ) => {
return singleProductBlockPreview; if ( ! isPreview ) {
} return null;
}
return select( PRODUCTS_STORE_NAME ).getProducts< Array< Product > >( {
per_page: 1,
} );
} );
useEffect( () => {
const productPreviewId = productPreview
? productPreview[ 0 ]?.id
: null;
if ( ! productPreviewId ) {
return;
}
setAttributes( {
...attributes,
productId: productPreviewId,
} );
setIsEditing( false );
}, [ attributes, productPreview, setAttributes ] );
if ( error ) { if ( error ) {
return ( return (

View File

@ -4,20 +4,9 @@
* Slug: woocommerce-blocks/product-details-listing * Slug: woocommerce-blocks/product-details-listing
* Categories: WooCommerce * Categories: WooCommerce
*/ */
$query = new \WC_Product_Query(
array(
'limit' => 1,
'return' => 'ids',
'status' => array( 'publish' ),
)
);
$products = $query->get_products();
$product_id = $products ? $products[0] : null;
?> ?>
<!-- wp:woocommerce/single-product {"productId":<?php echo esc_attr( $product_id ); ?>} --> <!-- wp:woocommerce/single-product {"isPreview": true} -->
<div class="wp-block-woocommerce-single-product"> <div class="wp-block-woocommerce-single-product">
<!-- wp:columns --> <!-- wp:columns -->
<div class="wp-block-columns"> <div class="wp-block-columns">

View File

@ -5,19 +5,9 @@
* Categories: WooCommerce * Categories: WooCommerce
*/ */
$query = new \WC_Product_Query(
array(
'limit' => 1,
'return' => 'ids',
'status' => array( 'publish' ),
)
);
$products = $query->get_products();
$product_id = $products ? $products[0] : null;
?> ?>
<!-- wp:woocommerce/single-product {"productId":<?php echo esc_attr( $product_id ); ?>,"align":"wide"} --> <!-- wp:woocommerce/single-product {"isPreview":true, "align":"wide"} -->
<div class="wp-block-woocommerce-single-product alignwide"> <div class="wp-block-woocommerce-single-product alignwide">
<!-- wp:columns --> <!-- wp:columns -->
<div class="wp-block-columns"> <div class="wp-block-columns">