Created
November 4, 2023 15:03
-
-
Save lordspace/f3c56d64fd6e22f7e1126d9fd0472257 to your computer and use it in GitHub Desktop.
fix for https://github.com/Automattic/woocommerce-subscriptions-core/ Site crashes with out of memory error when adding a downloadable product and hitting Update button
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// file: | |
///plugins/woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wcs-download-handler.php | |
/** | |
* Grant downloadable file access to any newly added files on any existing subscriptions | |
* which don't have existing permissions pre WC3.0 and all subscriptions post WC3.0. | |
* | |
* @param int $product_id | |
* @param int $variation_id | |
* @param array $downloadable_files product downloadable files | |
* @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0.18 | |
*/ | |
public static function grant_new_file_product_permissions( $product_id, $variation_id, $downloadable_files ) { | |
if ( wcs_is_woocommerce_pre( '3.0' ) ) { | |
return; | |
} | |
global $wpdb; | |
$product_id = !empty($variation_id) ? $variation_id : $product_id; | |
$product = wc_get_product( $product_id ); | |
$existing_download_ids = array_keys( (array) wcs_get_objects_property( $product, 'downloads' ) ); | |
$downloadable_ids = array_keys( (array) $downloadable_files ); | |
$new_download_ids = array_filter( array_diff( $downloadable_ids, $existing_download_ids ) ); | |
if ( empty( $new_download_ids ) ) { | |
return; | |
} | |
$subscriptions = wcs_get_subscriptions_for_product( $product_id ); | |
if ( empty( $subscriptions ) ) { // No subscriptions | |
return; | |
} | |
foreach ( $subscriptions as $subscription_id ) { | |
// $subscription_id is technically an order id for a subscription product | |
$permission_by_order_id = $wpdb->get_var( | |
$wpdb->prepare( "SELECT order_id FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d AND product_id = %d LIMIT 1", | |
$subscription_id, $product_id | |
) | |
); | |
if ( empty( $permission_by_order_id ) ) { | |
continue; | |
} | |
$subscription = wcs_get_subscription( $subscription_id ); | |
if ( empty( $subscription ) ) { | |
continue; | |
} | |
foreach ( $new_download_ids as $download_id ) { | |
// WooCommerce generates random IDs and this is almost pointless. | |
// I used the debugger and stopped the debugging session right after wc_downloadable_file_permission() was called. | |
$permission_found = $wpdb->get_var( | |
$wpdb->prepare( "SELECT download_id FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions | |
WHERE order_id = %d AND product_id = %d AND download_id = %s LIMIT 1", | |
$subscription_id, $product_id, $download_id | |
) | |
); | |
if ( ! empty( $permission_found ) ) { | |
continue; | |
} | |
// Grant permissions to subscriptions which have no permissions for this product, pre WC3.0, or all subscriptions, post WC3.0, as WC doesn't grant them retrospectively anymore. | |
if ( apply_filters( 'woocommerce_process_product_file_download_paths_grant_access_to_new_file', true, $download_id, $product_id, $subscription ) ) { | |
wc_downloadable_file_permission( $download_id, $product_id, $subscription ); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment