【问题标题】:Improve WC_Product_Query on Woocommerce products with variations改进具有变体的 Woocommerce 产品的 WC_Product_Query
【发布时间】:2019-06-23 21:04:00
【问题描述】:

我编写了一个函数来遍历所有产品,查找缺货的变体,然后删除变体和可变产品相关属性,这样任何产品过滤器插件在缺货时都不会显示特定的变体.

我的功能在我的测试网站上运行良好,但我正在寻找一些建议以提高它的效率,因为我担心在一个有数百种产品且每种产品大约 15 种变体的实时网站上运行它。

这是我的功能代码:

function wpmad_purge_variations_not_in_stock(){

    echo 'Purging products...<br><br>';

    $args = array( 'status' => 'publish', 'limit' => -1 );
    $products = wc_get_products( $args );

    foreach ( $products as $product ){

        if ( $product->is_type( 'variable' ) ){

            $product_id = $product->id;
            // Get all available product variations for current product/item
            $variations = $product->get_available_variations();

            // Loop through each of the available variations
            foreach ( $variations as $variation ){

                // Check if variation is no longer in stock
                if ( $variation['is_in_stock'] == '' ){

                    $variation_id = $variation['variation_id'];

                    // Attribute counter
                    $count = 1;

                    // For each variation attribute
                    foreach ( $variation['attributes'] as $att_name => $att_value ){

                        $atts[$count]['name'] = str_replace( 'attribute_', '', $att_name );
                        $atts[$count]['value'] = $att_value;

                        $count++; // Increase counter for each loop

                    }

                    // Delete product variation post
                    echo 'Deleted product variation ID #' . $variation_id . '<br>';
                    wp_delete_post( $variation_id, true );

                    // For each attribute
                    foreach ( $atts as $att ){
                        // Remove attribute from main product
                        echo 'Deleted product attribute (' . $att['name'] . ' - ' . $att['value'] . ') for product ID #' . $product_id . '<br><br>';
                        wp_remove_object_terms( $product_id, $att['value'], $att['name'] );
                    }

                }

            }

        }
    }

    echo 'Product variations have now been purged if out of stock';

}

是否可以使用函数wc_get_products() 仅返回可变产品,是否可以对我的代码进行任何效率/性能改进?

提前致谢!

【问题讨论】:

    标签: php loops woocommerce product variations


    【解决方案1】:

    使用WC_Product_Query when using wc_get_products(),您可以使用“type”参数仅定位可变产品,例如:

    $products = wc_get_products( array( 'status' => 'publish', 'limit' => -1, 'type' => 'variable' ) );
    

    这将提高代码的效率/性能。

    注意:$atts 变量应该在第二个 foreach 循环之后初始化,例如:$atts = array();

    【讨论】:

    • 太好了,谢谢。我在一些示例中看到了参数'type =&gt; 'variable',但在文档中找不到任何内容。我现在就去实现它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2019-03-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2019-01-23
    相关资源
    最近更新 更多