AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78501396
Accepted
JapeNZ
JapeNZ
Asked: 2024-05-19 09:47:51 +0800 CST2024-05-19 09:47:51 +0800 CST 2024-05-19 09:47:51 +0800 CST

Woocommerce - Crie um cron job personalizado para atualizar o status do estoque com base na comparação de datas

  • 772

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!

woocommerce
  • 1 1 respostas
  • 33 Views

1 respostas

  • Voted
  1. Best Answer
    LoicTheAztec
    2024-05-20T03:45:03+08:002024-05-20T03:45:03+08:00

    Existem muitos erros no seu código:

    • A variável $post_idnão está definida porque você não está passando nenhum argumento de ID de postagem para wp_next_scheduledfunções wp_schedule_event.
    • A variável $producttambé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:

    • sua categoria de produto atribuída com base em uma lista de slugs de termos
    • uma data de metadados personalizados emwoo_expiry_date
    • um valor de metadados personalizados emwoo_expiry_action

    Portanto, você precisa obter os IDs desses produtos por meio de um WP_Queryque 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):

    // Custom Cron hooked Function called by wp_schedule_event
    add_action( 'jape_pre_order_stock_update', 'update_pre_order_stock_status' );
    function update_pre_order_stock_status(){
        // Get all related product IDs to update via a WP_Query
        $products_ids = get_posts( [
            'post_type'   => 'product',
            'post_status' => 'publish',
            'numberposts' => -1, // <= the number of products to process (-1 is all)
            'fields'      => 'ids',
            'tax_query' => array( array(
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => array(
                    'comic-book-pre-orders',
                    'dc-comics-pre-orders',
                    'image-comics-pre-orders',
                    'manga-pre-orders',
                    'marvel-comics-pre-orders',
                    'other-publisher-pre-orders',
                ),
            ) ),
            'meta_query' => array( 
                'relation' => 'AND',
                array(
                    'key'     => 'woo_expiry_date',
                    'value'   => date('YYYY-mm-dd'),
                    'compare' => '<=',
                ),
                array(
                    'key'     => 'woo_expiry_action',
                    'value'   => 'out',
                    'compare' => '=',
                ),
            ),
        ] );
    
        foreach( $products_ids as $product_id ) {
            $product = wc_get_product($product_id);
    
            $product->set_stock_quantity(0); // Set stock quantity
            $product->set_stock_status('outofstock'); // Set stock status
            $product->save(); // Save updated product data
        }
    }
    
    // Cron schedule event function
    function cron_starter_hourly_products_update() {
        if ( ! wp_next_scheduled( 'jape_pre_order_stock_update' ) ) {
            wp_schedule_event( time(), 'hourly', 'jape_pre_order_stock_update' );
        }
    }
    
    cron_starter_hourly_products_update(); // Initiate cron schedule event
    

    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:

    • Use o objeto WooCommerce WC_Order com wp_schedule_event
    • Salve uma consulta ao banco de dados e atualize-a automaticamente a cada X horas. WordPress
    • Redefinir o limite de uso de cupom após um período especificado no WooCommerce
    • 0

relate perguntas

  • Use nomes de rótulos de atributos de produtos exibidos diferentes, com base em campos personalizados no WooCommerce

  • Sinalize pedidos do WooCommerce usando API REST usando metadados personalizados para que eu não os sincronize novamente

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve