Estou tentando criar um cron job que compare uma data definida como metadados do produto com a data atual e, em seguida, atualize o estoque do produto se a data definida como metadados do produto tiver passado.
Aqui está o que tenho até agora, mas não funciona:
// Custom CRON Function
function update_pre_order_stock_status($post_id){
$current_date = date( 'YYYY-mm-dd' );
$expiryDate = $product->get_meta('woo_expiry_date');
$woo_expiry_action = $product->get_meta('woo_expiry_action');
$product_category = array( 'comic-book-pre-orders', 'dc-comics-pre-orders', 'image-comics-pre-orders', 'manga-pre-orders', 'marvel-comics-pre-orders', 'other-publisher-pre-orders');
if(( is_product_category( $product_category )) && ( $expiryDate <= $current_date ) && ( $woo_expiry_action == 'out' )) {
// 1. Updating the stock quantity
update_post_meta( $post_id, '_stock', 0);
// 2. Updating the stock quantity
update_post_meta( $post_id, '_stock_status', wc_clean( 'outofstock' ) );
// 3. Updating post term relationship
wp_set_post_terms( $post_id, 'outofstock', 'product_visibility', true );
}
}
if ( ! wp_next_scheduled( 'my_pre_order_stock_update' ) ) {
wp_schedule_event( time(), 'hourly', 'my_pre_order_stock_update' );
}
add_action( 'my_pre_order_stock_update', 'update_pre_order_stock_status' );
O evento Cron 'my_pre_order_stock_update' aparece na lista cron, mas executá-lo não faz nada.
Qualquer recomendação seria muito apreciada!
Existem muitos erros no seu código:
$post_id
não está definida porque você não está passando nenhum argumento de ID de postagem parawp_next_scheduled
funçõeswp_schedule_event
.$product
também não está definida (e não pode ser definida na verdade).Presumo que você esteja tentando atualizar alguns produtos específicos com base em:
woo_expiry_date
woo_expiry_action
Portanto, você precisa obter os IDs desses produtos por meio de um
WP_Query
que será a maneira mais simples.Agora, como o WooCommerce está migrando para tabelas personalizadas desde a versão 3, e como alguns dados do produto são armazenados em cache, você não deve mais usar metafunções de postagem do WordPress.
Tente o seguinte (não testado):
O código vai no arquivo functions.php do seu tema filho (ou em um plugin). Poderia funcionar.
Cuidado: O número de produtos a serem processados deve ser ajustado na
'numberposts'
argumentação, pois se houver muitos produtos para processar, poderá travar o evento agendado ou até mesmo o site.Relacionado: