Woocommerce: сохраняйте все товары X раз в день

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
920
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлять: функция будет запускаться 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 вашей активной дочерней темы (или активной темы). Проверено и работает.

отличный. Еще один вопрос: можно ли заставить запускать эту функцию ТОЛЬКО 5 раз в день? Я имею в виду, что эта функция будет выполняться 5 раз в день, а затем перестанет выполняться до следующего дня.

JPashs 28.05.2019 22:19

@JPashs Обновлено… Это будет выполняться максимум 5 раз в день, то есть каждые 4,8 часа (или 4 часа 48 минут 00 секунд или 17280 секунд)… Протестировано и работает.

LoicTheAztec 28.05.2019 23:23

Другие вопросы по теме