Changeset 3451113
- Timestamp:
- 01/31/2026 05:42:43 PM (3 weeks ago)
- File:
-
- 1 edited
-
wp-facturaone/trunk/wp-facturaone.php (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
wp-facturaone/trunk/wp-facturaone.php
r3451084 r3451113 4 4 Plugin URI: https://www.facturaone.com/ 5 5 Description: La forma más fácil de trabajar con tu tienda online desde nuestro ERP FacturaONE. 6 Version: 4. 796 Version: 4.80 7 7 Author: FacturaONE 8 8 Author URI: https://www.facturaone.com/ … … 355 355 356 356 357 function FONE_actualizastockproducto($item_lookup_id, $stock, $item_wp_stock_control, $item_wp_stock_visible, $item_onorder, $item_wp_backorders){ 358 $mod_wordpress = get_option('mod_wordpress'); 359 if($mod_wordpress>0){ 360 $_product_id = fone_get_product_id_by_idfactura($item_lookup_id); 361 if ($_product_id > 0) { 362 // Get an instance of the WC_Product Object 363 $objProduct = wc_get_product( $_product_id ); 364 if ($item_wp_stock_control==0){ 365 //producto siempre disponible (con o sin stock) 366 $objProduct->set_stock_quantity(9999); 367 $objProduct->set_stock_status('instock'); // in stock or outofstock 368 $objProduct->set_manage_stock(false); 369 }else{ 370 //producto solo disponible si hay stock 371 $objProduct->set_stock_quantity($stock); 372 if ($stock>0 || $item_wp_backorders>0){ //si $item_wp_backorders = yes o notify manage=true 373 $objProduct->set_stock_status('instock'); // in stock or outofstock 374 if ($item_wp_stock_visible==1){ 375 $objProduct->set_manage_stock(true); 376 }else{ 377 $objProduct->set_manage_stock(false); 378 } 379 }else{ 380 $objProduct->set_stock_status('outofstock'); // in stock or outofstock 381 $objProduct->set_manage_stock(false); 382 } 383 } 384 if($item_onorder==1){ 385 $objProduct->set_manage_stock(false); 386 $objProduct->set_stock_status('outofstock'); // in stock or out of stock value 387 $objProduct->set_stock_quantity(0); 388 } 389 if ($item_wp_backorders==1){ 390 $objProduct->set_backorders('notify'); 391 }else if ($item_wp_backorders==2){ 392 $objProduct->set_backorders('yes'); 393 }else{ 394 $objProduct->set_backorders('no'); 395 } 396 $objProduct->save(); // Save to database and sync 397 //update_option('_abcbab_afacturaone_status_array','rr0'.$stock); 398 } 399 400 } 401 } 357 358 359 402 360 403 361 function FONE_subeproducto($baseurlfact, $deletevariaciones, $item_lookup_id, $item_name, $item_description, $item_description_web, $urlimage, $item_price, $tarifa1, $tarifa2, $tarifa3, $tarifa4, $tarifa5, $item_kgs_neto, $item_kgs_bruto, $familia_id, $subfamilia_id, $item_activado, $tax_rate_id, $variaciones, $compuestos, $item_txt_alternativo, $marca, $ean, $item_clientid, $item_onorder, $item_wp_stock_control, $item_wp_stock_visible, $item_seo_fraseobjetivo, $item_seo_metadescripcion, $item_wp_visibilidad, $item_wp_destacado, $item_slug, $item_description_web_corta, $item_wp_backorders, $item_categorias, $item_sku, $familia_web_activate, $marca_web_activate, $largo='', $ancho='', $alto='', $item_minquantity='', $item_maxquantity='', $item_stepquantity='', $item_stock=0){ … … 448 406 $objProduct->set_regular_price($item_price); 449 407 $dirty = true; 450 }451 452 // Stock visible (solo si NO controlas stock)453 if ((int)$item_wp_stock_control === 0) {454 $want_manage_stock = ($item_wp_stock_visible == 1);455 if ((bool)$objProduct->get_manage_stock() !== (bool)$want_manage_stock) {456 $objProduct->set_manage_stock($want_manage_stock);457 $dirty = true;458 }459 }460 461 // Reglas especiales stock-control / onorder (se mantienen iguales a tu lógica)462 if ($item_wp_stock_control == 0) {463 if ((int)$objProduct->get_stock_quantity() !== 9999) { $objProduct->set_stock_quantity(9999); $dirty = true; }464 if ((string)$objProduct->get_stock_status() !== 'instock') { $objProduct->set_stock_status('instock'); $dirty = true; }465 if ((bool)$objProduct->get_manage_stock() !== false) { $objProduct->set_manage_stock(false); $dirty = true; }466 }467 if ($item_onorder == 1) {468 if ((string)$objProduct->get_stock_status() !== 'outofstock') { $objProduct->set_stock_status('outofstock'); $dirty = true; }469 if ((int)$objProduct->get_stock_quantity() !== 0) { $objProduct->set_stock_quantity(0); $dirty = true; }470 }471 472 // Backorders473 $bo = 'no';474 if ($item_wp_backorders == 1) $bo = 'notify';475 else if ($item_wp_backorders == 2) $bo = 'yes';476 if ((string)$objProduct->get_backorders() !== $bo) {477 $objProduct->set_backorders($bo);478 $dirty = true;479 }480 481 // Stock real producto simple (DESPUES de backorders)482 if ((int)$item_wp_stock_control === 1 && (int)$item_onorder === 0) {483 $qty = (int) max(0, floor((float)str_replace(',', '.', (string)$item_stock)));484 485 if ((bool)$objProduct->get_manage_stock() !== true) { $objProduct->set_manage_stock(true); $dirty = true; }486 if ((int)$objProduct->get_stock_quantity() !== $qty) { $objProduct->set_stock_quantity($qty); $dirty = true; }487 488 $bo_now = (string)$objProduct->get_backorders(); // ya es el correcto489 $status = ($qty > 0) ? 'instock' : (($bo_now === 'yes' || $bo_now === 'notify') ? 'onbackorder' : 'outofstock');490 491 if ((string)$objProduct->get_stock_status() !== $status) { $objProduct->set_stock_status($status); $dirty = true; }492 408 } 493 409 … … 679 595 } 680 596 681 FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible );597 FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible, $item_stock, $item_wp_backorders, $item_onorder, $item_lookup_id); 682 598 683 599 if ($cfg['sync_yoast'] == 1) { … … 744 660 $objProduct->update_meta_data('product_step', sanitize_text_field($item_stepquantity)); 745 661 746 // stock 747 $bo = 'no'; 748 if ($item_wp_backorders == 1) $bo = 'notify'; 749 else if ($item_wp_backorders == 2) $bo = 'yes'; 750 $objProduct->set_backorders($bo); 751 752 if ((int)$item_wp_stock_control === 0) { 753 754 $objProduct->set_manage_stock(false); 755 $objProduct->set_stock_quantity(9999); 756 $objProduct->set_stock_status('instock'); 757 758 } else { 759 760 $qty = (int) max(0, floor((float)str_replace(',', '.', (string)$item_stock))); 761 762 $objProduct->set_manage_stock(true); 763 $objProduct->set_stock_quantity($qty); 764 765 $objProduct->set_stock_status( 766 $qty > 0 767 ? 'instock' 768 : (($bo === 'yes' || $bo === 'notify') ? 'onbackorder' : 'outofstock') 769 ); 770 } 771 772 if ((int)$item_onorder === 1) { 773 $objProduct->set_stock_quantity(0); 774 $objProduct->set_stock_status('outofstock'); 775 } 776 777 //desactiva valoraciones y poder comprar mas de 1 producto 662 // desactiva valoraciones y poder comprar mas de 1 producto 778 663 $objProduct->set_reviews_allowed(false); 779 664 $objProduct->set_sold_individually(false); … … 858 743 } 859 744 860 FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible );745 FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible, $item_stock, $item_wp_backorders, $item_onorder, $item_lookup_id); 861 746 862 747 if ($cfg['sync_yoast'] == 1) { … … 866 751 return (int) $product_id; 867 752 } 753 868 754 869 755 … … 1002 888 } 1003 889 1004 function FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible){ 1005 //global $wpdb; 1006 //$wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'product_variation'",$_product_id)); 890 function FONE_tipo_object_terms($_product_id, $variaciones, $compuestos, $item_price, $item_wp_stock_control, $item_wp_stock_visible, $item_stock, $item_wp_backorders, $item_onorder, $item_lookup_id){ 891 $_product_id = (int)$_product_id; 892 if ($_product_id <= 0) return; 893 1007 894 if ($variaciones!=''){ 1008 895 //en el caso de producto variable … … 1011 898 // al cambiar a variable, borra componentes antiguos 1012 899 delete_post_meta($_product_id, 'wooco_components'); 900 // IMPORTANTE: el padre variable no debe gestionar stock como simple 901 $p = wc_get_product((int)$_product_id); 902 if ($p) { 903 $p->set_manage_stock(false); 904 $p->set_stock_quantity(''); 905 // no fuerces stock_status aquí; lo recalcula Woo con sync 906 $p->save(); 907 } 1013 908 FONE_variaciones($_product_id, $variaciones, $item_price, $item_wp_stock_control, $item_wp_stock_visible); 909 910 // REGLA CLAVE: recalcula el padre desde sus variaciones 911 if (class_exists('WC_Product_Variable') && method_exists('WC_Product_Variable', 'sync')) { 912 WC_Product_Variable::sync($_product_id); 913 } 914 wc_delete_product_transients($_product_id); 915 return; 1014 916 }else if ($compuestos!=''){ 1015 917 wp_remove_object_terms($_product_id, array('simple','variable'), 'product_type'); 1016 918 wp_set_object_terms($_product_id, 'composite', 'product_type', false); // byjc wp_set_object_terms( $_product_id, 'composite ', 'product_type', true ); 1017 919 FONE_componentes($_product_id, $compuestos); 920 wc_delete_product_transients($_product_id); 921 return; 1018 922 }else{ 1019 923 //en el caso de ser producto simple … … 1021 925 wp_set_object_terms($_product_id, 'simple', 'product_type', false); 1022 926 delete_post_meta($_product_id, 'wooco_components'); 927 928 // AQUI VA TODO EL STOCK SIMPLE 929 FONE_set_stock_simple_product((int)$_product_id, $item_wp_stock_control, $item_wp_stock_visible, $item_stock, $item_wp_backorders, $item_onorder); 930 931 wc_delete_product_transients((int)$_product_id); 932 return; 1023 933 } 1024 934 } 935 936 function FONE_set_stock_simple_product($product_id, $item_wp_stock_control, $item_wp_stock_visible, $stock, $item_wp_backorders, $item_onorder) 937 { 938 $product_id = (int)$product_id; 939 if ($product_id <= 0) return; 940 941 $p = wc_get_product($product_id); 942 if (!$p) return; 943 944 // Producto siempre disponible (con o sin stock) 945 if ((int)$item_wp_stock_control === 0) { 946 $p->set_stock_quantity(9999); 947 $p->set_stock_status('instock'); 948 $p->set_manage_stock(false); 949 } else { 950 // Producto solo disponible si hay stock 951 $qty = (int) max(0, floor((float)str_replace(',', '.', (string)$stock))); 952 $p->set_stock_quantity($qty); 953 954 if ($qty > 0 || (int)$item_wp_backorders > 0) { 955 $p->set_stock_status('instock'); 956 if ((int)$item_wp_stock_visible === 1) $p->set_manage_stock(true); 957 else $p->set_manage_stock(false); 958 } else { 959 $p->set_stock_status('outofstock'); 960 $p->set_manage_stock(false); 961 } 962 } 963 964 // Onorder fuerza outofstock siempre 965 if ((int)$item_onorder === 1) { 966 $p->set_manage_stock(false); 967 $p->set_stock_status('outofstock'); 968 $p->set_stock_quantity(0); 969 } 970 971 // Backorders 972 if ((int)$item_wp_backorders === 1) $p->set_backorders('notify'); 973 else if ((int)$item_wp_backorders === 2) $p->set_backorders('yes'); 974 else $p->set_backorders('no'); 975 976 $p->save(); 977 } 978 979 980 function FONE_actualizastockproducto($item_lookup_id, $stock, $item_wp_stock_control, $item_wp_stock_visible, $item_onorder, $item_wp_backorders){ 981 $mod_wordpress = (int)get_option('mod_wordpress'); 982 if ($mod_wordpress <= 0) return; 983 984 $_product_id = (int) fone_get_product_id_by_idfactura($item_lookup_id); 985 if ($_product_id <= 0) return; 986 987 FONE_set_stock_simple_product($_product_id, $item_wp_stock_control, $item_wp_stock_visible, $stock, $item_wp_backorders, $item_onorder); 988 } 989 990 //function FONE_actualizastockproducto_old($item_lookup_id, $stock, $item_wp_stock_control, $item_wp_stock_visible, $item_onorder, $item_wp_backorders){ 991 // $mod_wordpress = get_option('mod_wordpress'); 992 // if($mod_wordpress>0){ 993 // $_product_id = fone_get_product_id_by_idfactura($item_lookup_id); 994 // if ($_product_id > 0) { 995 // // Get an instance of the WC_Product Object 996 // $objProduct = wc_get_product( $_product_id ); 997 // if ($item_wp_stock_control==0){ 998 // //producto siempre disponible (con o sin stock) 999 // $objProduct->set_stock_quantity(9999); 1000 // $objProduct->set_stock_status('instock'); // in stock or outofstock 1001 // $objProduct->set_manage_stock(false); 1002 // }else{ 1003 // //producto solo disponible si hay stock 1004 // $objProduct->set_stock_quantity($stock); 1005 // if ($stock>0 || $item_wp_backorders>0){ //si $item_wp_backorders = yes o notify manage=true 1006 // $objProduct->set_stock_status('instock'); // in stock or outofstock 1007 // if ($item_wp_stock_visible==1){ 1008 // $objProduct->set_manage_stock(true); 1009 // }else{ 1010 // $objProduct->set_manage_stock(false); 1011 // } 1012 // }else{ 1013 // $objProduct->set_stock_status('outofstock'); // in stock or outofstock 1014 // $objProduct->set_manage_stock(false); 1015 // } 1016 // } 1017 // if($item_onorder==1){ 1018 // $objProduct->set_manage_stock(false); 1019 // $objProduct->set_stock_status('outofstock'); // in stock or out of stock value 1020 // $objProduct->set_stock_quantity(0); 1021 // } 1022 // if ($item_wp_backorders==1){ 1023 // $objProduct->set_backorders('notify'); 1024 // }else if ($item_wp_backorders==2){ 1025 // $objProduct->set_backorders('yes'); 1026 // }else{ 1027 // $objProduct->set_backorders('no'); 1028 // } 1029 // $objProduct->save(); // Save to database and sync 1030 // //update_option('_abcbab_afacturaone_status_array','rr0'.$stock); 1031 // } 1032 // 1033 // } 1034 //} 1035 1036 function FONE_set_stock_variation_product($variation_id, $item_wp_stock_control, $item_wp_stock_visible, $stock) 1037 { 1038 $variation_id = (int)$variation_id; 1039 if ($variation_id <= 0) return; 1040 1041 $v = wc_get_product($variation_id); 1042 if (!$v || !is_a($v, 'WC_Product_Variation')) return; 1043 1044 // No backorders 1045 $v->set_backorders('no'); 1046 update_post_meta($variation_id, '_backorders', 'no'); 1047 1048 if ((int)$item_wp_stock_control === 0) { 1049 $v->set_manage_stock(false); 1050 $v->set_stock_quantity(9999); 1051 $v->set_stock_status('instock'); 1052 1053 update_post_meta($variation_id, '_manage_stock', 'no'); 1054 update_post_meta($variation_id, '_stock', '9999'); 1055 update_post_meta($variation_id, '_stock_status', 'instock'); 1056 1057 $v->save(); 1058 return; 1059 } 1060 1061 $qty = (int) max(0, floor((float)str_replace(',', '.', (string)$stock))); 1062 1063 $v->set_manage_stock(true); 1064 $v->set_stock_quantity($qty); 1065 $v->set_stock_status($qty > 0 ? 'instock' : 'outofstock'); 1066 1067 update_post_meta($variation_id, '_manage_stock', 'yes'); 1068 update_post_meta($variation_id, '_stock', (string)$qty); 1069 update_post_meta($variation_id, '_stock_status', ($qty > 0 ? 'instock' : 'outofstock')); 1070 1071 $v->save(); 1072 } 1073 1074 1075 1076 1077 1025 1078 1026 1079 function FONE_componentes($_product_id, $compuestos){ … … 1248 1301 if ($new_variation_id > 0) { 1249 1302 1303 // STOCK: siempre unificado (esto arregla el 0) 1304 FONE_set_stock_variation_product( 1305 $new_variation_id, 1306 $item_wp_stock_control, 1307 $item_wp_stock_visible, 1308 $item_stock 1309 ); 1310 1250 1311 // metas tarifas 1251 1312 update_post_meta($new_variation_id, '_tarifa1', $v_price); … … 1259 1320 } 1260 1321 1261 // post_status: draft si no vendible1262 1322 wp_update_post([ 1263 1323 'ID' => $new_variation_id, … … 1265 1325 ]); 1266 1326 1267 // Si no vendible, asegura outofstock (por si control stock=0 no aplica por tu setting) 1268 if ($vendible === false) { 1269 $v = new WC_Product_Variation($new_variation_id); 1270 if ($v) { 1271 $v->set_manage_stock(false); 1272 $v->set_stock_quantity(0); 1273 $v->set_stock_status('outofstock'); 1274 $v->save(); 1275 } 1276 } 1327 // Quita este bloque, ya no hace falta porque el stock ya lo forzaste arriba: 1328 // if ($vendible === false) { ... set outofstock ... } 1277 1329 } 1278 1330 } … … 1429 1481 $variation->set_price($regular_price); 1430 1482 1431 // Stock (refuerzo total + coherencia de metas)1432 $stock_qty = (float)$stock_qty;1433 1434 // Siempre fijamos backorders a "no" en tu plugin para evitar1435 // que una variación con stock 0 aparezca como "disponible".1436 $variation->set_backorders('no');1437 update_post_meta($variation_id, '_backorders', 'no');1438 1439 if ((int)$item_wp_stock_control === 0) {1440 1441 // Siempre disponible (NO control stock real)1442 $variation->set_manage_stock(false);1443 $variation->set_stock_quantity(9999);1444 $variation->set_stock_status('instock');1445 1446 // Refuerzo metas legacy1447 update_post_meta($variation_id, '_manage_stock', 'no');1448 update_post_meta($variation_id, '_stock', '9999');1449 update_post_meta($variation_id, '_stock_status', 'instock');1450 1451 } else {1452 1453 // Control real de stock1454 // Recomendación: mantener manage_stock activado incluso con 0 para que Woo no interprete raro1455 // (si tu lógica quiere "visible", úsalo para UI, pero internamente es mejor coherente)1456 $variation->set_manage_stock(true);1457 update_post_meta($variation_id, '_manage_stock', 'yes');1458 1459 if ($stock_qty > 0) {1460 $qty = (int)$stock_qty;1461 $variation->set_stock_quantity($qty);1462 $variation->set_stock_status('instock');1463 1464 update_post_meta($variation_id, '_stock', (string)$qty);1465 update_post_meta($variation_id, '_stock_status', 'instock');1466 } else {1467 $variation->set_stock_quantity(0);1468 $variation->set_stock_status('outofstock');1469 1470 update_post_meta($variation_id, '_stock', '0');1471 update_post_meta($variation_id, '_stock_status', 'outofstock');1472 }1473 }1474 1475 1483 // Metas tarifas (tarifa1 = price) 1476 1484 update_post_meta($variation_id, '_tarifa1', $regular_price); … … 1489 1497 $variation->save(); 1490 1498 1491 // Limpia caches de variación y padre 1499 // 7) Stock (UNIFICADO en una sola función) 1500 FONE_set_stock_variation_product( 1501 $variation_id, 1502 $item_wp_stock_control, 1503 $item_wp_stock_visible, 1504 $stock_qty 1505 ); 1506 1507 // 8) Limpia caches 1492 1508 wc_delete_product_transients($variation_id); 1493 1509 wc_delete_product_transients($parent_product_id); 1494 1510 1495 // Fuerza sync del variable (recalcula estadosdesde variaciones)1511 // 9) Sync del variable (recalcula estado del padre desde variaciones) 1496 1512 if (class_exists('WC_Product_Variable') && method_exists('WC_Product_Variable', 'sync')) { 1497 1513 WC_Product_Variable::sync($parent_product_id); … … 1576 1592 1577 1593 // Prices 1578 if ( empty( $variation_data['sale_price'] ) ){1579 $variation->set_price( $variation_data['regular_price']);1594 if (empty($variation_data['sale_price'])) { 1595 $variation->set_price($variation_data['regular_price']); 1580 1596 } else { 1581 $variation->set_price( $variation_data['sale_price'] ); 1582 $variation->set_sale_price( $variation_data['sale_price'] ); 1583 } 1584 $variation->set_regular_price( $variation_data['regular_price'] ); 1585 1586 // Stock 1587 if( ! empty($variation_data['stock_qty']) ){ 1588 if ($variation_data['stock_qty']>0){ 1589 $variation->set_stock_quantity( $variation_data['stock_qty'] ); 1590 if ($item_wp_stock_visible==1){ 1591 $variation->set_manage_stock(true); 1592 }else{ 1593 $variation->set_manage_stock(false); 1594 } 1595 //$variation->set_stock_status(''); 1596 $variation->set_stock_status('instock'); 1597 }else{ 1598 $variation->set_stock_quantity(0); 1599 $variation->set_manage_stock(false); 1600 $variation->set_stock_status('outofstock'); 1601 } 1602 } 1603 if ($item_wp_stock_control==0){ 1604 //producto siempre disponible (con o sin stock) 1605 $variation->set_stock_quantity(9999); 1606 $variation->set_stock_status('instock'); // in stock or outofstock 1607 $variation->set_manage_stock(false); // true or false 1608 } 1609 1597 $variation->set_price($variation_data['sale_price']); 1598 $variation->set_sale_price($variation_data['sale_price']); 1599 } 1600 $variation->set_regular_price($variation_data['regular_price']); 1601 1610 1602 $variation->set_weight(''); // weight (reseting) 1611 1603 1612 $variation->save(); // Save the data 1613 1614 return $variation_id; 1615 } 1604 $variation->save(); 1605 1606 return $variation_id; 1607 } 1608 1616 1609 function FONEcreate_global_attribute($name, $slug) 1617 1610 { … … 3396 3389 $reco = [ 3397 3390 ['Yoast SEO','wordpress-seo', ['wordpress-seo/wp-seo.php','wordpress-seo-premium/wp-seo-premium.php']], 3398 ['Variation Swatches for WooCommerce','variation-swatches-woo' ],3391 ['Variation Swatches for WooCommerce','variation-swatches-woo', []], 3399 3392 ['YITH WooCommerce Brands Add-On','yith-woocommerce-brands-add-on', []], 3400 3393 ['Min Max Quantity & Step Control (Woo)','woo-min-max-quantity-step-control-single', []],
Note: See TracChangeset
for help on using the changeset viewer.