Problem temada imiş, functions.php-də update edilərək həll edildi. Təşəkkürlər.
Dediyiniz halda əgər çox request yaradırsa bu məsələ, yəni hər dəfə atribut adlarını yoxlamaq - o zaman dediyim custom yol daha asan görə bilər işinizi.
Yəni hər zaman Custom atribut kimi göndərin - heç nəyi yoxlamadan, əziyyətsiz filansız.
Sonra da custom endpoint ilə həmin post üçün wp_post_update-un içindəki o həlledici hook-nu run edin.
Bu zaman Woo özü həll edəcək custom->woo term sync məsələsini.
Bu hook haqqında da əlavə məlumat verim ki, bu metodu run edir:
WC_Meta_Box_Product_Data::prepare_attributes($data);
Daha konkret desəm əgər siz bir endpoint yaratsanız ki bu sadə funksiyanı run eləsin, məsələ bitmiş sayılar.
[code]
function called_from_custom_endpoint(){
$post_id=$_POST["product_id"];
$data["attribute_names"]=["pa_color"]; //$_POST["attribute_name"]
$data["attribute_values"]=["Blue"];//$_POST["attribute_value"]
$attributes=WC_Meta_Box_Product_Data::prepare_attributes($data);
$product=wc_get_product($post_id);
$product->set_attributes($attributes);
$product->save();
}
[/code]
Deməli yazdığım məntiq belədir ki, əvvəlcə bütün attributları götürürəm, göndərilən productun attributunun name-i mövcuddursa attributların içində, həmin attributun id-sini götürüb, termlərini döngüyə salıram (max 100 qayıdır 1 dəfəyə), əgər termlərdə də attributun value-su varsa, həmin attributun id-sini və optionsa dəyərini göndərirəm. Attribut ümumiyyətlə yoxdursa və ya attribut var, dəyər yoxdursa, custom attribut kimi name, option və visible paramatrlərini göndərirəm. Response-u return edib yoxlayacam, təşəkkürlər.
Indi aydın oldu.
Təxminən belə bir format göndərməyiniz lazımdır:
[code]
"attributes": [
{
"id": 1,
"name": "Color",
"options": ["Blue"]
}
]
[/code]
Başqa field-lərin olmasına ehtiyac yoxdur və tam işlək data formatıdır bu.
Əsas məsələ burada id-dir. Əgər id düzgündürsə, bu zaman dediyiniz manual update-ə ehtiyac olmadan birbaşa işləməlidir hər şey.
Əks halda atribut custom attribute kimi qeydə alınır, yəni postmeta olaraq (id=0), bu da ola bilər sizin theme-də dəstəklənmir.
Siz manual qaydada update-ə basdıqda isə WooCommerce özü qarşılaşdırır postmeta və taksonomiyadakı atributları, əgər meta-dakı atribut term taksonomiyadakılara uyğun gəlirsə, sinxronlaşdırma edir. Ona görə də manual update ilə işləyir.
Yəni belə deyək, bir az kustar da olsa siz belə həll də tətbiq edə bilərsiniz:
Bir dənə custom endpoint yaradıb içində wp_update_post() hook-u run etmək. Və bu endpointi atribut daxil etdikdən sonra GET metodu ilə çağırmaq ki o manual edilən şey Java-dan çağırılaraq baş vermiş olsun.
İndi isə əsas metoda qayıdaq:
Troubleshoot üçün belə bir müqayisə apara bilərsiniz.
1. Atributu APİ ilə göndərin və /wp-json/wc/v3/products/123 GET metodu ilə çəkin attributes bölməsini saxlayın.
2. WP-Admində manual update basdıqdan sonra ki, hər şey düzəldi, dərhal /wp-json/wc/v3/products/123 GET metodu ilə bir də çəkin data, attributes bölməsini əvvəlki ilə müqayisə edin. Böyük ehtimal fərqin id-də olduğunu görəcəksiniz. Birincidə id=0, ikincidə id=hər hansı ədəd olacaq.
Burada bir diqqətəlayiq məsələ də odur ki, orada sözükeçən İD term İD deyil, atributun qiymətinin id-si deyil, atributun özünün id-sidir. Onu da məsələn wp_woocommerce_attribute_taxonomies mysql table-dan görə bilərsiniz.
Documentation'da qeyd edilən kimi göndərirəm, sadəcə position göndərmirəm. Sadəcə maraqlı olan olan budur ki, edit products-a daxil olduqda orada görünür, heç nə etmədən sadəcə update click etdikdə isə məhsulun öz səhifəsində də görünür.
[code]curl -X POST https://example.com/wp-json/wc/v3/products \
-u consumer_key:consumer_secret \
-H "Content-Type: application/json" \
-d '{
"name": "Test",
"type": "simple",
"regular_price": "99.99",
"images": [
{
"src": "example.org/example.jpg"
},
{
"src": "example.org/example2.jpg"
}
],
"attributes": [
{
"id": 6,
"visible": true,
"variation": false,
"options": ["Black"]
},
{
"name": "Size",
"visible": true,
"variation": false,
"options": ["S"]
}
]
}'[/code]
CURL nümunə qoysaydınız əla olardı, ki görək hansı endpointə nə göndərirsiniz. Məsələn attributu taksonomiya kimi davranaraq update etməyə çalışırsınız, yoxsa WC api ilə müvafiq attribut endpoinləri ilə.