我使用Wordpress Gutenberg中的Woocommerce " handpick products "块在我的Frontpage上创建了3个产品的展示。我看到Woocommerce没有使用短代码,但页面本身包含一个段落,看起来像这样:
<!-- wp:woocommerce/handpicked-products {"contentVisibility":{"image":true,"title":true,"price":false,"rating":false,"button":false},"orderby":"menu_order","products":[181,225,179]} /-->"
我想在页面加载时动态更改产品(随机洗牌)。不幸的是,在整个php类handpickproducts, AbstractProductGrid, AbstractDynamicBlock等,我没有看到一个钩子来动态地改变渲染参数…
所以我发现可能的解决方案是:为了直接替换Wordpress Post本身的product属性,因此我实现了这个钩子:
function my_the_post_action(&$pobj) {
$pobj->post_content = str_replace('[181,225,179]', '[225, 220, 222]', $pobj->post_content );
}
add_action('the_post', 'my_the_post_action' );
它实际上在wp:woocommerce/handpick -products段落中被替换,但不生效。为什么Woocommerce不考虑新的Product id作为他的渲染块的参数?
谢谢! !
不修改"在Frontpage的Pageload上通过页面编辑器输入-我提出了一个更好和更干净的选择-通过简单地在客户短代码中呈现这样的块。
下面的代码由以下部分组成:首先,我从数据库中随机选择3个具有Product-Tag "Featured"设置以便用户可以自行决定哪些产品可供选择…然后我创建了我的"精选产品"。阻塞并渲染:
add_shortcode('my_featured_prods', function($atts, $content = null)
{
// Get list of all Woocommerce products by Tag
$args = array(
'post_type' => 'product',
'posts_per_page' => 3,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => 'featured'
)
)
);
$products = new WP_Query($args);
$ids = [$fix];
foreach($products->posts as $p)
$ids[] = $p->ID;
// Shuffle array:
shuffle($ids);
// Output Hand Picked Products Widget with my settings ...
$args = (object) [
'editMode' => 0,
'contentVisibility' => (object) [
'image' => 1,
'title' => 1,
'price' => 0,
'rating' => 0,
'button' => 0,
],
'orderby' => 'random',
'products' => $ids,
'alignButtons' => 1,
];
$args = sprintf(
'<!-- wp:woocommerce/handpicked-products %s /-->',
json_encode( $args )
);
return do_blocks($args);
});