WooCommerce - Variabila globală $product returnează valoare null

26 nov. 2018, 12:21:40
Vizualizări: 14.2K
Voturi: 2

Codul meu este:

function sync_on_product_save($new_status, $old_status, $post) {
     global $post;
     global $product;

 if( 
        $old_status != 'publish' 
        && $new_status == 'publish' 
        && !empty($post->ID) 
        && in_array( $post->post_type, 
            array( 'product') 
            )
        ) {         

        print_R($product);
}
}

add_action('transition_post_status', 'sync_on_product_save', 10, 3);

Vreau să transmit prețul produsului, SKU, descrierea și numele către un API terț.

Vă rog să mă ajutați.

2
Comentarii

De ce ai nevoie de el? Al treilea argument al funcției tale conține datele postării.

Jacob Peattie Jacob Peattie
26 nov. 2018 12:23:09

Așa cum a menționat Jacob, obiectul $post este transmis prin acțiune și prin acesta ai acces la aproape tot ce ai nevoie. Totuși, pentru a răspunde la întrebarea despre obiectul $product în mod specific, trebuie să-i dai un ID de produs (care este ID-ul postării) pentru a conține informații atunci când încerci să-l accesezi. Vezi răspunsul meu de mai jos care oferă o soluție folosind obiectul produs.

butlerblog butlerblog
26 nov. 2018 15:33:39
Toate răspunsurile la întrebare 1
4

Problema este că obiectul $product nu există în momentul în care încerci să-l accesezi (când apeși "publică" în editor).

După cum a menționat Jacob Peattie în comentarii, probabil ai putea obține toate informațiile din obiectul $post. Dar, poți obține obiectul $product din $post->ID și apoi să folosești metodele "get_" disponibile în obiect pentru a obține valorile de care ai nevoie.

Iată codul revizuit pentru a obține aceste valori prin intermediul $product:

function sync_on_product_save( $new_status, $old_status, $post ) {

    if ( 
        $old_status != 'publish' 
        && $new_status == 'publish' 
        && ! empty( $post->ID ) 
        && in_array( $post->post_type, array( 'product' ) )
    ) {         

        // Obținem obiectul produs pentru acest ID:
        $product = wc_get_product( $post->ID );

        // Folosim metodele "get_" pentru valori:
        $product_sku   = $product->get_sku();
        $product_name  = $product->get_name();
        $product_price = $product->get_price();
        $product_desc  = $product->get_description();

        // Faci ce ai nevoie pentru serviciile terțe aici...
    }
}

add_action( 'transition_post_status', 'sync_on_product_save', 10, 3 );
26 nov. 2018 15:00:29
Comentarii

Nu există niciun motiv să folosești global $post sau $product în acest cod. Dacă ceva, ar putea face $post incorect. Folosește pur și simplu obiectul post transmis ca parametru.

Jacob Peattie Jacob Peattie
26 nov. 2018 15:58:39

Sunt de acord - nu m-am uitat cu atenție la asta deoarece m-am concentrat pe cealaltă parte a codului său. Dar asta ar trebui eliminat (editez acum).

butlerblog butlerblog
26 nov. 2018 17:56:46

Problema mea este rezolvată. Am folosit hook-ul woocommerce_process_product_meta în loc de transition_post_status. Mulțumesc pentru răspuns.

Rashmi Ghatole Rashmi Ghatole
27 nov. 2018 13:50:05

@butlerblog Perfect! Mulțumesc.

Ruvee Ruvee
9 apr. 2021 22:05:40