0

I'm trying to create all these if statements:

  1. If product category A is checked, category B will auto not checked and product status become "out of stock".
  2. If product category A is unchecked, category B will auto checked.

So far both statements work except for that "out of stock" part. Any idea how to call and set the stock status?

add_action( 'save_post', 'auto_add_product_category', 50, 3 );
function auto_add_product_category( $post_id, $post, $update ) {

    if ( $post->post_type != 'product') return;

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    if ( ! current_user_can( 'edit_product', $post_id ) )
        return $post_id;

    $term_id_A = 116; //category A
    $term_id_B = 1459; //category B
    $terms = get_the_terms( $post_id, 'product_cat' );
    $term_ids = wp_list_pluck( $terms, 'term_id' );

    if(in_array($term_id_A, $term_ids) && ($key = array_search($term_id_B, $term_ids)) !== false) {
        unset($term_ids[$key]);
    } elseif(!in_array($term_id_A, $term_ids) && !in_array($term_id_B, $term_ids)) {
        $term_ids[] = $term_id_B;
    }
    wp_set_post_terms($post_id, $term_ids, 'product_cat');
}
LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
iceiceicy
  • 705
  • 1
  • 9
  • 24

1 Answers1

1

You need to replace the last bit of your code with this:

if(in_array($term_id_A, $term_ids) && ($key = array_search($term_id_B, $term_ids)) !== false) {
    //remove term A from the terms array:
    unset($term_ids[$key]);
    //set stock level to zero:
    $out_of_stock_staus = 'outofstock';
    // 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( $out_of_stock_staus ) );
    // 3. Updating post term relationship
    wp_set_post_terms( $post_id, 'outofstock', 'product_visibility', true );
    // And finally (optionally if needed)
    wc_delete_product_transients( $post_id ); // Clear/refresh the variation cache

} elseif(!in_array($term_id_A, $term_ids) && !in_array($term_id_B, $term_ids)) {
    $term_ids[] = $term_id_B;
}

Further explanation of the extra code can be found here: Updating product stock programmatically in Woocommerce 3

markmoxx
  • 1,492
  • 1
  • 11
  • 21