1

In WooCommerce, when I add couple of code lines to change the product description, on product status change, the website throw an error when submitting (saving).

My code:

add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && in_array( $post->post_type, 
            array( 'product') 
        )
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        /******************************/
        $product = wc_get_product($post->ID);
        $product->set_description("something");
        $product->save();
        /******************************/
    }
}

as you see, these last 3 lines lead to the problem the page refreshes and also update the product description but give me and error

“THE SITE IS EXPERIENCING TECHNICAL DIFFICULTIES”

and when I remove them it works okay and show me the successful message

UPDATE

I changed these 3 line with Wordpress way

wp_update_post( array('ID' => $post->ID, 'post_content' => "something"));

still do the job but instead of successful message gives me this technical error

UPDATE II

When I open Chrome console I see this error also

Failed to load resource: the server responded with a status of 500 () (index):1
1
  • can it be related to using wp_set_object_terms before wp_update_post ?? or using update_post_meta before that ?
    – zEn feeLo
    May 18, 2019 at 12:23

1 Answer 1

2

To avoid an infinite loop on transition_post_status hook when using wp_update_post(), try:

add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && $post->post_type === 'product'
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        // unhook this function so it doesn't loop infinitely
        remove_action( 'transition_post_status', 'new_product_add', 10 );

        wp_update_post( array('ID' => $post->ID, 'post_content' => "something"));

        // re-hook this function
        add_action( 'transition_post_status', 'new_product_add', 10, 3 );
    }
}

Or:

add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && $post->post_type === 'product'
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        $product = wc_get_product($post->ID);

        // unhook this function so it doesn't loop infinitely
        remove_action( 'transition_post_status', 'new_product_add', 10 );

        $product->set_description("something");
        $product->save();

        // re-hook this function
        add_action( 'transition_post_status', 'new_product_add', 10, 3 );
    }
}

It may solve your issue.

This is documented here on wp_update_post() for save_post hook.

2
  • damn man! you are ON POINT every freakin time, thank you
    – zEn feeLo
    May 18, 2019 at 12:39
  • Hello @LoicTheAztec. I try your code but I don't understand why get_term_by return false. I debug it and i've seen taxonomy_exists( 'product_cat'); is returning false... When im doing a print_r( $wp_taxonomies ); product_cat is not there at this time.. Apr 9, 2021 at 15:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.