php woocommerce:动态更改WC渲染块的属性/参数

mpgws1up  于 2022-12-25  发布在  PHP
关注(0)|答案(1)|浏览(119)

我使用Woocommerce "精选产品"块WordPress古腾堡创建一个展示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类HandpickedProducts,AbstractProductGrid,AbstractDynamicBlock等中,我没有看到动态改变Render参数的钩子。
所以我找到了一个可行的解决方案:为了直接替换WordPress Post本身的产品属性,因此我实现了这个钩子:

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/handpicked-products段落中被替换,但没有生效。为什么Woocommerce不考虑新的产品ID作为渲染块的参数?
谢谢!

lx0bsm1f

lx0bsm1f1#

而不是修改“块”输入通过页面编辑器在页面加载在头版-我想出了一个更好和更干净的选项IMHO -通过简单地呈现这样一个块在客户短代码。
下面的代码首先包含我从数据库中随机挑选3个产品的部分,这些产品的产品标签设置为“Featured”,以便用户可以自己决定哪些产品可供选择......然后我创建“Handpicked Products”块并呈现它:

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);
});

相关问题