WooCommerce - La variabile globale $product restituisce valore null

26 nov 2018, 12:21:40
Visualizzazioni: 14.2K
Voti: 2

Il mio codice è:

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

Voglio passare il prezzo del prodotto, SKU, descrizione e nome a un'API di terze parti.

Per favore aiutami.

2
Commenti

A cosa ti serve? Il terzo argomento della tua funzione contiene i dati del post.

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

Come ha menzionato Jacob, l'oggetto $post viene passato tramite l'azione e attraverso quello hai praticamente accesso a ciò che ti serve. Tuttavia, per rispondere alla domanda specifica sull'oggetto $product, devi fornirgli un ID prodotto (che è l'ID del post) affinché contenga qualcosa quando cerchi di accedervi. Vedi la mia risposta qui sotto che fornisce una soluzione utilizzando l'oggetto prodotto.

butlerblog butlerblog
26 nov 2018 15:33:39
Tutte le risposte alla domanda 1
4

Il problema è che l'oggetto $product non esiste nel punto in cui stai cercando di accedervi (quando premi "pubblica" nell'editor).

Come ha menzionato Jacob Peattie nei commenti, probabilmente potresti ottenere tutto dall'oggetto $post. Ma puoi ottenere l'oggetto $product dall'$post->ID e poi utilizzare i metodi "get_" disponibili nell'oggetto per ottenere i valori di cui hai bisogno.

Ecco il codice rivisto per ottenere questi valori tramite $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' ) )
    ) {         

        // Ottieni l'oggetto prodotto per questo ID:
        $product = wc_get_product( $post->ID );

        // Usa i metodi "get_" per i valori:
        $product_sku   = $product->get_sku();
        $product_name  = $product->get_name();
        $product_price = $product->get_price();
        $product_desc  = $product->get_description();

        // Fai ciò che ti serve per il servizio di terze parti qui...
    }
}

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

Non c'è motivo di usare global $post o $product in questo codice. Se mai, potrebbe rendere $post non corretto. Basta usare l'oggetto post passato come parametro.

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

Concordo - non l'avevo davvero considerato perché ero concentrato sull'altra parte del suo codice. Ma dovrebbe essere rimosso (sto modificando ora).

butlerblog butlerblog
26 nov 2018 17:56:46

Il mio problema è risolto. Uso l'hook woocommerce_process_product_meta invece di transition_post_status. Grazie per la risposta.

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

@butlerblog Perfetto! Grazie.

Ruvee Ruvee
9 apr 2021 22:05:40