Улучшение WC_Product_Query для продуктов WooCommerce с вариациями - PullRequest
0 голосов
/ 30 января 2019

Я написал функцию для циклического просмотра всех продуктов, поиска вариантов, которых нет в наличии, а затем удаления варианта и атрибутов, связанных с переменными продуктами, чтобы любые плагины фильтров продуктов не отображали конкретные варианты, когда их нет в наличии..

Моя функция отлично работает на моем тестовом сайте, но я ищу несколько советов о том, как сделать это более эффективным, поскольку у меня есть некоторые опасения по поводу запуска его на живом сайте, который имеет сотни продуктов с примерно 15 вариантами вproduct.

Вот мой код функции:

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() только для того, чтобы возвращать переменные продукты, и есть ли какие-либо улучшения эффективности / производительности, которые могут быть сделаны длямой код?

Заранее спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

С помощью WC_Product_Query при использовании wc_get_products() вы можете использовать аргумент "type" для нацеливания только на переменные продукты, такие как:

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

Это повысит эффективность/ производительность вашего кода.

Примечание: Переменная $atts должна быть инициализирована сразу после 2-го цикла foreach, например: $atts = array();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...