WordPress/WooCommerce plugin called studiou-wc-free-photo-product (QDR - Studiou WC Free Photo Product) v1.2.1. Allows publishing special variable products where customers upload custom raw images to be printed for a price.
studiou_media_category on attachment post typeStudiou_WC_Free_Photo_Product in root plugin fileSTUDIOU_WCFPP_studiou-fpp-studiouWcfppFront (frontend), studiouWcfpp (admin)studiou-wcfpp-front-nonce (frontend), studiou-wcfpp-nonce (admin)studiou-wc-free-photo-productStudiou_WC_FPP_DB - Custom table CRUD, media category taxonomyStudiou_WC_FPP_Product - WC product data tab, product metaStudiou_WC_FPP_Upload - Chunked upload AJAX, file assembly, attachment creationStudiou_WC_FPP_Single_Product - Upload area on product page (woocommerce_single_product_summary priority 35), WC session storage, server-side validation (woocommerce_add_to_cart_validation priority 1) + safety net (woocommerce_add_to_cart removes items without photo)Studiou_WC_FPP_Shortcode - [studiou_free_photo_product id="X"] renders product with WC native variation formStudiou_WC_FPP_Cart - Reads file data from WC session via woocommerce_add_cart_item_data, replaces cart/order item thumbnails (classic cart via woocommerce_cart_item_thumbnail, block cart via woocommerce_product_get_image_id/woocommerce_product_variation_get_image_id), order item meta, order linkingStudiou_WC_FPP_Admin - Summary page with filters/pagination, status management, ZIP download, file download with auto-status-change, bulk actions with confirmation dialogswoocommerce_single_product_summary (priority 35)woocommerce_add_to_cart_validation (priority 1) checks WC session — blocks with error notice if no photowoocommerce_add_to_cart safety net — removes item if it was added without photo datawoocommerce_add_cart_item_data reads file data from WC session (session NOT cleared — same photo reusable for multiple variants)woocommerce_cart_item_thumbnail, block cart via woocommerce_product_get_image_id/woocommerce_product_variation_get_image_idwoocommerce_admin_order_item_thumbnail, download link via woocommerce_after_order_itemmeta (auto-marks status as "downloaded")woocommerce_checkout_order_processed (classic), woocommerce_store_api_checkout_order_processed (block), woocommerce_thankyou (fallback)studiou-wc-product-cat-manageif (!defined('WPINC')) { die; }wp_send_json_success / wp_send_json_error for all AJAX responses__() or esc_html_e() with text domainabsint(), sanitize_text_field(), sanitize_file_name()esc_html(), esc_attr(), esc_url(), wp_kses_post()php languages/generate-mo.php or wp i18n make-mo languages/register_activation_hookrequire_once for DB class (runs before plugins_loaded)wp-content/uploads/studiou-fpp-chunks/ (cleaned on deactivation)wp-content/uploads/YYYY/MM/free-photo/When changing JS or CSS files, always bump the plugin version in the main PHP file header AND the STUDIOU_WCFPP_VERSION constant to bust browser cache.