У меня есть этот код, который обновляет все продукты. Это работает нормально. Но мне нужно изменить его.
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();
}
}
Приведенная выше функция помечает обновленные продукты как «обновленные». Тогда этот код сохранит все продукты только один раз.
Вопрос: Как изменить эту функцию, чтобы все продукты сохранялись каждый раз, когда функция выполняется, а не только один раз.
Обновлять: функция будет запускаться 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 вашей активной дочерней темы (или активной темы). Проверено и работает.
@JPashs Обновлено… Это будет выполняться максимум 5 раз в день, то есть каждые 4,8 часа (или 4 часа 48 минут 00 секунд или 17280 секунд)… Протестировано и работает.
отличный. Еще один вопрос: можно ли заставить запускать эту функцию ТОЛЬКО 5 раз в день? Я имею в виду, что эта функция будет выполняться 5 раз в день, а затем перестанет выполняться до следующего дня.