Woocommerce: сохраняйте все товары по X раз в день - PullRequest
1 голос
/ 28 мая 2019

У меня есть этот код, который обновляет все продукты. Работает нормально. Но мне нужно это изменить.

    add_action( 'wp', 'update_products_by_x' );
function update_products_by_x(){

    $limit = 200;

    // getting all products
    $products_ids = get_posts( array(
        'post_type'        => 'product', // or ['product','product_variation'],
        'numberposts'      => $limit,
        'post_status'      => 'publish',
        'fields'           => 'ids',
        'meta_query'       => array( array(
            'key'     => '_sync_updated',
            'compare' => 'NOT EXISTS',
        ) )
    ) );

    // Loop through product Ids
    foreach ( $products_ids as $product_id ) {

        // Get the WC_Product object
        $product = wc_get_product($product_id);

        // Mark product as updated
        $product->update_meta_data( '_sync_updated', true );

        $product->save();
    }
}

Функция выше помечает обновленные продукты как «обновленные». Тогда этот код сохранит все продукты только один раз.

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

1 Ответ

1 голос
/ 28 мая 2019

Обновление: функция будет запускаться 5 раз в день (макс.).

Если у вас много продуктов, вы не можете обновить все продукты.

Следующее будет выполняться каждый раз, когда ваш веб-сайт просматривается, и будет обновлять определенное количество продуктов каждый раз, чтобы избежать проблем (оно будет работать вечно, если вы его удалите) :

add_action( 'wp', 'update_products_by_x' );
function update_products_by_x(){
    // Get next start time
    $start_time = (float) get_option('product_update_start_time');

    if ( $start_time <= time() ) {
        if ( empty($start_time) || $start_time == 0 ) {
            $start_time = time();
        }

        ## ----- SETTINGS (Below) ----- ##
        $next_time = $start_time + ( 4.8 * 60 * 60 ); // 5 times à day
        $limit     = 200; // Fix the number of products to update each time

        $offset    = (int) get_option('product_update_offset');

        // Get products
        $products_ids = get_posts( array(
            'post_type'        => 'product', // or ['product','product_variation'],
            'numberposts'      => $limit,
            'offset'           => $offset,
            'post_status'      => 'publish',
            'fields'           => 'ids',
        ) );

        $count = count($products_ids);

        if( $count > 0 ) {
            // Loop through product Ids
            foreach ( $products_ids as $product_id ) {
                // Get the WC_Product object
                $product = wc_get_product($product_id);
                $product->save();
            }
            update_option('product_update_offset', ( $count == $limit ? ( $count + $offset ) : 0 ) );
        }
        update_option('product_update_start_time', $next_time);
    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

...