Woocommerce Duplicate product затем увеличивает самый высокий SKU - PullRequest
0 голосов
/ 30 сентября 2019

Используя хук woocommerce следующим образом:

Я ожидаю, что с запросом $ queryLast получит последний номер продукта,

НО

get_the_ID () всегда возвращает дублированные элементыдаже с:

wp_reset_postdata();
wp_reset_query();
clean_post_cache(get_the_ID());

Мне нужно получить идентификатор элемента, запрошенный в queryLast.

Для иллюстрации, скажем, мой самый высокий SKU - 1600, я дублирую SKU 300. Ожидаемое поведение - назначитьновый SKU 1601 для нового продукта (дублирование SKU 300)

Теперь он назначает новый SKU 301 ... и т. д.

add_action( 'woocommerce_product_duplicate', 'duplicate_sku_func', 10, 2 ); 

function duplicate_sku_func( $duplicate ) {

if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
    return;
}

$product_id = $duplicate->save(); 
wp_reset_postdata();
wp_reset_query();
clean_post_cache(get_the_ID());

$args = array(
    'order' => 'DESC',
    'orderby' => 'id' , 
    'post_type'=> 'product',
    'posts_per_page' => 1 ,
);

$queryLast = new WP_Query($args);

while ( $queryLast->have_posts() ) : $queryLast->the_post();
  $sku2 = get_post_meta( get_the_ID(), '_sku', true );
  //$your_sku = get_the_ID();
  $your_sku = (int) $sku2+1;
endwhile;


  update_post_meta($product_id, '_sku', $your_sku );  
  update_post_meta($product_id, '_manage_stock', 'yes');
  update_post_meta($product_id, '_stock', '1');   

}

1 Ответ

1 голос
/ 30 сентября 2019

Прежде всего, крючок woocommerce_product_duplicate вызывается после сохранения дубликата товара. Таким образом, определенно вы получаете новое значение sku продукта дубликата, которое от родительского sku 300, а не последнего sku продукта 1600. Потому что последний вставленный sku продукта теперь 301, и вы получаете это. Итак, замените ваши коды следующим фрагментом -

add_action( 'woocommerce_product_duplicate_before_save', 'duplicate_sku_func', 10, 2 ); 

function duplicate_sku_func( $duplicate, $product ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    $args = array(
        'order' => 'DESC',
        'orderby' => 'id' , 
        'post_type'=> 'product',
        'posts_per_page' => 1 ,
        'fields'        => 'ids'
    );

    $queryLast = new WP_Query($args);
    $your_sku = '';
    if( $queryLast->get_posts() ) {
        foreach ( $queryLast->get_posts() as $product_id) {
            $sku2 = get_post_meta( get_the_ID(), '_sku', true );
            $your_sku = (int) $sku2+1;
        }
    }
    $duplicate->set_sku( $your_sku );
    $duplicate->set_manage_stock( 'yes' );
    $duplicate->set_stock_quantity( 1 );

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...