在 Woocommerce API 的重复 SKU 检查之前是否有一个钩子?
Is there a hook that precedes Woocommerce API's duplicate SKU check?
我有一个安装了 Woocommerce 和 WPML + 多语言 Woocommerce 的网站。我的问题是我尝试插入一个产品作为先前输入产品的翻译,而不知道主要产品的 ID。如果我输入的 ID 为 translation_of
它有效;两种产品共享相同的 SKU,并且翻译已禁用 SKU 字段,这就是我希望它的工作方式。但我不想在发送到 Woocommerce 的数据中输入 translation_of
。我只想使用 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 很久之后才到达这一点,因为我注意到我什么都不能 return,但我仍然得到 product_invalid_sku
错误。什么是正确的钩子,或者这样的钩子是否存在?
我自己的解决方案:
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;
}
我有一个安装了 Woocommerce 和 WPML + 多语言 Woocommerce 的网站。我的问题是我尝试插入一个产品作为先前输入产品的翻译,而不知道主要产品的 ID。如果我输入的 ID 为 translation_of
它有效;两种产品共享相同的 SKU,并且翻译已禁用 SKU 字段,这就是我希望它的工作方式。但我不想在发送到 Woocommerce 的数据中输入 translation_of
。我只想使用 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 很久之后才到达这一点,因为我注意到我什么都不能 return,但我仍然得到 product_invalid_sku
错误。什么是正确的钩子,或者这样的钩子是否存在?
我自己的解决方案:
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;
}