Products: Map Non-Supported Product Types to Supported Types
Map non-supported WooCommerce Product Types to supported Product Types in QPilot.
Important: Always test customizations to your site on a staging environment before making changes to your live / production site. If you are not experienced with testing changes on a staging site, here is a good article to review.
/** * Adjustments to Map a Custom Product Type ( i.e. Bundle ) as Simple for Autoship Support * Includes Mapping the Types for Validation, Upsert, Sync Health, and WC Rest API. * Updated 2020-05-29 : Updated to work with the 2.0+ QPilot API */////////////////////////////////////////////////////////////////////////////////////*/ /** * Is Mapped Type * @param string $type The current product type * @return bool True if it's an override type else false */ function xx_is_mapped_type( $type ){ return 'bundle' == $type; } /** * Retrieves the correct type for QPilot * @param string $type The current product type in WC * @return string The new type */ function xx_get_mapped_type( $type ){ $types = array( 'bundle' => 'simple', 'simple' => 'bundle', ); return isset( $types[$type] ) ? $types[$type] : $type; } /** * Extends the Valid Sync Types for Autoship * @param array $types The valid product types ( simple, variable, variation ) * @return array The adjusted types. */ function xx_extend_autoship_product_sync_types( $types ){ $types[] = 'bundle'; return $types; } add_filter('autoship_valid_product_types', 'xx_extend_autoship_product_sync_types', 10, 1 ); /** * Maps types to Autoship Supported during Upsert * @param array $product_data The Product Data being upserted * @return array The adjusted data. */ function xx_map_autoship_product_sync_types_on_upsert( $product_data ){ if ( !xx_is_mapped_type( $product_data['metadata']['type'] ) ) return $product_data; $product_data['metadata']['type'] = xx_get_mapped_type( $product_data['metadata']['type'] ); return $product_data; } add_filter('autoship_product_upsert_data', 'xx_map_autoship_product_sync_types_on_upsert', 10, 1 ); /** * Adjusts the Type for the Product Screens * * @param array $totals The current summary data * @param stdClass $summary The QPilot Summary data * @param WC_Product $product The WC Poduct * @return array The adjusted data. */ function xx_adjust_product_summary_data_for_custom_type( $totals, $product, $ids, $summaries ){ if ( !xx_is_mapped_type( $product->get_type() ) ) return $totals; // Retrieve the legacy availability string. $availability = 'None'; if ( $summaries[0]->addToScheduledOrder && $summaries[0]->processScheduledOrder ){ $availability = 'AddToScheduledOrder,ProcessScheduledOrder'; } else if ( $summaries[0]->addToScheduledOrder ){ $availability = 'AddToScheduledOrder'; } else if ( $summaries[0]->processScheduledOrder ){ $availability = 'ProcessScheduledOrder'; } $totals = apply_filters( 'autoship_product_summary_data', array( 'Id' => $summaries[0]->id, 'ProductName' => $summaries[0]->productName, 'AddToScheduledOrder' => $summaries[0]->addToScheduledOrder !== false, 'ProcessScheduledOrder' => $summaries[0]->processScheduledOrder !== false, 'Availability' => $availability, 'ProductType' => xx_get_mapped_type ( $summaries[0]->productType ), 'StockLevel' => $summaries[0]->availability, 'TotalStock' => $summaries[0]->stock, 'QuantityScheduled' => $summaries[0]->totalQuantityScheduledActive + $summaries[0]->totalQuantityScheduledPaused + $summaries[0]->totalQuantityFailed + $summaries[0]->totalQuantityProcessing + $summaries[0]->totalQuantityQueued, 'TotalQuantityScheduledActive' => $summaries[0]->totalQuantityScheduledActive, 'TotalQuantityScheduledPaused' => $summaries[0]->totalQuantityScheduledPaused, 'TotalQuantityFailed' => $summaries[0]->totalQuantityFailed, 'TotalQuantityProcessing' => $summaries[0]->totalQuantityProcessing, 'TotalQuantityQueued' => $summaries[0]->totalQuantityQueued, 'LifetimeValue' => $summaries[0]->lifetimeValue, 'ShippingClass' => $summaries[0]->shippingClass, 'Active' => $summaries[0]->active, 'Valid' => $summaries[0]->valid, 'ValidationErrorCode' => $summaries[0]->validationErrorCode, 'UpdatedUtc' => $summaries[0]->updatedUtc, 'SyncError' => '' ), $summaries[0], $product ); // Since we've already pulled the Active flag from QPilot get the flag from WooCommerce / Autoship $totals['AutoshipActive'] = ( 'yes' === autoship_sync_active_enabled( $product ) ); // Run Sync Checks $totals['SyncError'] = apply_filters( 'autoship_product_summary_data_sync_error', $totals['SyncError'], $totals, $summaries[0], $product, $ids ); return apply_filters( 'autoship_total_product_summary_data', $totals, $product, $summaries ); } add_filter( 'autoship_total_variation_product_summary_data', 'xx_adjust_product_summary_data_for_custom_type', 10, 4 ); /** * Maps types to Autoship Supported during Upsert * @param array $product_data The Product Data being upserted * @return array The adjusted data. */ function xx_gather_total_custom_type_all_products_summary_data( $totals, $summary ){ $product = wc_get_product( $totals['Id'] ); if ( xx_is_mapped_type( $product->get_type() ) ) $totals['ProductType'] = xx_get_mapped_type( $totals['ProductType'] ); return $totals; } add_filter('autoship_all_products_summary_data_row', 'xx_gather_total_custom_type_all_products_summary_data', 10, 2 ); /** * Dynamically Maps the WC Product Type to a valid QPilot Type. * * @param WP_REST_Response $response The response object. * @param WC_Data $object Object data. * @param WP_REST_Request $request Request object. * * @return WP_REST_Response */ function xx_woocommerce_rest_prepare_object_change_product_type( $response, $object, $request ) { $response->data['type'] = xx_get_mapped_type( $response->data['type'] ); return $response; } add_filter('woocommerce_rest_prepare_product_object', 'xx_woocommerce_rest_prepare_object_change_product_type', 99, 3 );
Example Result