Есть ли ловушка, которая предшествует проверке дубликата SKU в Woocommerce API? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть сайт с Woocommerce и WPML + Многоязычный Woocommerce. Моя проблема заключается в том, что я пытаюсь вставить продукт в качестве перевода ранее введенного продукта, не зная идентификатора основного продукта. Если я введу идентификатор как translation_of, он будет работать; оба продукта используют один и тот же SKU, а в переводе поле SKU отключено, и я хочу, чтобы оно работало. Но я не хочу вводить translation_of в данные, которые отправляются в Woocommerce. Я хочу использовать только SKU, а затем позволить Wordpress сначала проверить, существует ли продукт с этим SKU, и заменить sku на translation_of, если он есть.

Вот как я поступил:

add_filter('woocommerce_api_create_product_data', '__create_product_data', -100, 2);

function __create_product_data($data, $api) {
    if(isset($data['sku']) && $product_id = wc_get_product_id_by_sku($data['sku'])) {
        $product_id = apply_filters('wpml_object_id', $product_id, 'product');
        $data['translation_of'] = $product_id;
        unset($data['sku']);
    }
    return $data;
}

Но мне кажется, что выполнение наступает в этот момент после проверки SKU, потому что я заметил, что ничего не могу вернуть, и все еще получаю ошибку product_invalid_sku обратно. Какой будет правильный хук или такой хук вообще существует?

1 Ответ

0 голосов
/ 10 марта 2020

Мое собственное решение:

add_filter('rest_pre_dispatch', '__rest_pre_dispatch', 10, 3);

function __rest_pre_dispatch($result, $server, $request) {
    $sku = $request->get_param('sku');

    if ($sku) {
        $id = wc_get_product_id_by_sku($sku);
        if ($id) {
            $product_id = apply_filters('wpml_object_id', $id, 'product');
            $request->set_param('translation_of', $product_id);
            $request->offsetUnset('sku');
        }
    }

    return $result;
}
...