Php woocommerce商店产品变化

Php woocommerce商店产品变化,php,wordpress,woocommerce,product,Php,Wordpress,Woocommerce,Product,我想在Wp/Woocommerce/shop/page上展示所有产品及其变体。(/woocommerce/archive product.php)。我在下面描述的过程是我试图让它发挥作用的过程。我们欢迎其他选择 标准是什么:产品A和产品B在网站上展示。产品A有“广告到购物车”按钮。产品B有“选择选项”按钮 我追求的是什么:产品A是一种“简单”的产品,显示在商店页面上 产品B是一种“可变”产品,有两种组合(黑色/蓝色)。“添加到购物车”按钮将此变体添加到购物车 我想在商店页面上展示3种产品,分别为

我想在Wp/Woocommerce/shop/page上展示所有产品及其变体。(/woocommerce/archive product.php)。我在下面描述的过程是我试图让它发挥作用的过程。我们欢迎其他选择

标准是什么:产品A和产品B在网站上展示。产品A有“广告到购物车”按钮。产品B有“选择选项”按钮

我追求的是什么:产品A是一种“简单”的产品,显示在商店页面上 产品B是一种“可变”产品,有两种组合(黑色/蓝色)。“添加到购物车”按钮将此变体添加到购物车

我想在商店页面上展示3种产品,分别为1*产品A和2*产品B

到目前为止,我已经拿出了一些关于这个产品变化的基本细节,但我似乎找不到缩略图

$postId = get_the_ID();
$args = array(
    'post_type'     => 'product_variation',
    'post_status'   => array( 'private', 'publish' ),
    'numberposts'   => -1,
    'orderby'       => 'menu_order',
    'order'         => 'asc',
    'post_parent'   => $postId
);
$variations = get_posts( $args );
//var_dump($variations);

//$p = get_post_meta($postId, '_product_attributes', true);  // return pa_flavor
//var_dump($p);

if(!empty($variations)) {
    foreach ($variations as $variation) {

        $vari = new WC_Product_Variation($variation->ID);
        $availableAttr = $vari->get_attribute('Flavour');
        $flavour = get_post_meta($variation->ID, 'attribute_pa_flavour', true);
因此,我可以获得'flavor'的属性,并查找为每个变体定义的缩略图。。。?如果您能提供任何帮助/指点,我们将不胜感激

$thumb_image = get_the_post_thumbnail($variable_id, $size);
而且[可能是我对Wordpress缺乏了解]我似乎无法在wc_get_template()中传递/访问变量。这可能是第二个问题,但仍然与在一个页面上显示单个产品和变体产品的基本问题有关

remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price_variation', 10 );

if ( ! function_exists( 'woocommerce_template_loop_price_variation' ) ) {
    function woocommerce_template_loop_price_variation($prodVar=array()) {

        if(empty($prodVar) || $prodVar['product_type'] == 'simple') {
            wc_get_template( 'loop/price.php' );
        }  else {
            wc_get_template( 'loop/price-variation.php' , $prodVar );
        }
    }
}
和in/price-variation.php(price.php的副本)

global$产品;
变量转储($prodVar);//生成未定义变量的通知???
我不想让它全球化。。。?还是这是唯一的办法

感谢您的帮助或建议

$thumb_image = get_the_post_thumbnail($variable_id, $size);
您可以覆盖循环的产品缩略图(在functions.php中)。如果变体_id在变体情况下全局设置,在简单产品情况下为空,则可以执行以下操作:

remove_action('woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10);
function own_woocommerce_thumbnail() {
    global $product, $woocommerce, $variable_id;

    $items_in_cart = array();

    if ($woocommerce->cart->get_cart() && is_array($woocommerce->cart->get_cart())) {
        foreach ($woocommerce->cart->get_cart() as $cart) {
            $items_in_cart[] = $cart['product_id'];
        }
    }

    $id = get_the_ID();
    $in_cart = in_array($id, $items_in_cart);
    $size = 'medium';
    if ($variable_id) {
        $thumb_image = get_the_post_thumbnail($variable_id, $size);
    } else {
        $thumb_image = get_the_post_thumbnail($id, $size);
    }

    echo '<span class="featured-image">';
    echo $thumb_image;
    echo '<span class="cart-loading" style="display: none">';
    if ($in_cart) {
        echo '<i class="fa fa-check-square-o"></i>';
    } else {
        echo '<i class="fa fa-spinner"></i>';
    }
    echo '</span></span>';
}
add_action('woocommerce_before_shop_loop_item_title', 'own_woocommerce_thumbnail', 10);
remove_action('woocommerce_在_shop_loop_项目_标题之前,'woocommerce_模板_loop_产品_缩略图',10);
函数自身\u商业\u缩略图(){
全球$product、$WOOCAMERCE、$variable\U id;
$items_in_cart=array();
if($woocommerce->cart->get_cart()&&is_数组($woocommerce->cart->get_cart())){
foreach($woocommerce->cart->get_cart()作为$cart){
$items_in_cart[]=$cart['product_id'];
}
}
$id=get_the_id();
$in_cart=in_数组($id,$items_in_cart);
$size=‘中’;
if($variable\u id){
$thumb\u image=获取\u post\u缩略图($variable\u id,$size);
}否则{
$thumb\u image=获取\u post\u缩略图($id,$size);
}
回声';
回波图像;
回声';
如果($in_cart){
回声';
}否则{
回声';
}
回声';
}
添加动作(“店铺前的woocommerce\u循环\u项目标题”,“自己的woocommerce\u缩略图”,10);
注意:这将阻止分页,因为一个产品将在产品页面上多次显示。 注意2:您需要为悬停操作编写一些jquery来修复“添加到购物车”

你找到解决这个问题的好办法了吗

我在这里发布了一个类似的问题,这可能会给你更多的见解:

编辑:有一个插件“Woocommerce Show Single Variations”可以运行。它过去是免费的,但现在不是了:
将此代码粘贴到theme functions.php中

/**
 * Replace add to cart button in the loop.
 */
function iconic_change_loop_add_to_cart() {
    remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
    add_action( 'woocommerce_after_shop_loop_item', 'iconic_template_loop_add_to_cart', 10 );
}

add_action( 'init', 'iconic_change_loop_add_to_cart', 10 );

/**
 * Use single add to cart button for variable products.
 */
function iconic_template_loop_add_to_cart() {
    global $product;

    if ( ! $product->is_type( 'variable' ) ) {
        woocommerce_template_loop_add_to_cart();
        return;
    }

    remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
    add_action( 'woocommerce_single_variation', 'iconic_loop_variation_add_to_cart_button', 20 );

    woocommerce_template_single_add_to_cart();
}

/**
 * Customise variable add to cart button for loop.
 *
 * Remove qty selector and simplify.
 */
function iconic_loop_variation_add_to_cart_button() {
    global $product;

    ?>
    <div class="woocommerce-variation-add-to-cart variations_button">
        <button type="submit" class="single_add_to_cart_button button"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>
        <input type="hidden" name="add-to-cart" value="<?php echo absint( $product->get_id() ); ?>" />
        <input type="hidden" name="product_id" value="<?php echo absint( $product->get_id() ); ?>" />
        <input type="hidden" name="variation_id" class="variation_id" value="0" />
    </div>
    <?php
}
/**
*替换循环中的“添加到购物车”按钮。
*/
功能图标\u更改\u循环\u添加到\u购物车(){
删除操作('woocommerce\u在商店\u循环\u项目之后,'woocommerce\u模板\u循环\u添加\u到购物车',10);
添加动作('woocommerce'u在'u shop'u loop'u项目之后,'Logic'u template'u loop'u add'u to'u cart',10);
}
添加动作('init'、'icogal_change_loop_add_to_cart',10);
/**
*对可变产品使用单个“添加到购物车”按钮。
*/
函数图标\u模板\u循环\u添加到\u购物车(){
全球$产品;
如果(!$product->是_类型('variable')){
woocommerce_模板_循环_添加_到_购物车();
返回;
}
删除操作('woocommerce\u single\u variation'、'woocommerce\u single\u variation\u add\u to\u cart\u button',20);
添加操作('woocommerce\u single\u variation'、'图标\u loop\u variation\u add\u to\u cart\u button',20);
woocommerce_模板_单个_添加_到_购物车();
}
/**
*为循环自定义变量“添加到购物车”按钮。
*
*移除数量选择器并简化。
*/
功能图标\循环\变化\添加\到\购物车\按钮(){
全球$产品;
?>
添加动作('woocommerce'u before'u shop'u loop'、'shangy'u胡须'u guy'u select'u variations')

功能帅哥胡子帅哥选择变体(){ 删除操作('woocommerce\u在商店\u循环\u项目之后,'woocommerce\u模板\u循环\u添加\u到购物车',10); 添加操作('woocommerce'u在商店购物后添加,'woocommerce'u循环购物项目','woocommerce'u模板\u单个\u添加到购物车',30); }


将它添加到functions.php文件中,您就完成了

$variation->get_image()
应该会得到一个variation对象的缩略图。另外,我认为您可以将
new WC_Product_variation
更改为
WC_get_Product()
。实际上,我一直在考虑构建一个插件来实现这一点,但我对多个属性会发生什么情况有点困惑。例如:如果它们有相同的缩略图,我不想显示黑色大和黑色小。好奇的是,您是否有任何想法,如何选择要添加到循环中的变体?它将如何工作最适合你?谢谢Helgatheviking。我在这个阶段没有多考虑这一点,因为我们走了另一条路线。最终我想重温一下,一个插件会很棒。谢谢你的回复。我可能会在有时间的时候继续修补它,但到目前为止,看起来一些复杂的自定义查询将不得不发生。No已找到解决方案。由于客户对当前的实现感到满意,我将其放在一边。感谢您的评论和建议。嘿,刚刚发现了您的修订。如果您仍然在-请您将链接更改为转到此处:CodeCanyon不再提供此链接:)请添加一些简短信息,说明您在代码中做了哪些特别的工作?嗨@farhana这是用于获取属性va的钩子