class-studiou-wc-fpp-cart.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. if (!defined('WPINC')) {
  3. die;
  4. }
  5. class Studiou_WC_FPP_Cart {
  6. /** @var Studiou_WC_FPP_DB */
  7. private $db;
  8. public function __construct($db) {
  9. $this->db = $db;
  10. // Capture file data from WC session on add-to-cart
  11. add_filter('woocommerce_add_cart_item_data', array($this, 'add_cart_item_data'), 10, 3);
  12. // Display uploaded file info in cart
  13. add_filter('woocommerce_get_item_data', array($this, 'display_cart_item_data'), 10, 2);
  14. // Replace cart item thumbnail with uploaded image
  15. add_filter('woocommerce_cart_item_thumbnail', array($this, 'cart_item_thumbnail'), 10, 3);
  16. // Save file reference to order item
  17. add_action('woocommerce_checkout_create_order_line_item', array($this, 'save_order_item_meta'), 10, 4);
  18. // Link file records to order after checkout
  19. add_action('woocommerce_checkout_order_processed', array($this, 'link_files_to_order'), 10, 3);
  20. // Replace order item thumbnail with uploaded image (admin)
  21. add_filter('woocommerce_admin_order_item_thumbnail', array($this, 'admin_order_item_thumbnail'), 10, 3);
  22. }
  23. public function add_cart_item_data($cart_item_data, $product_id, $variation_id) {
  24. // Check if this product (or its parent) is FPP enabled
  25. $fpp_product_id = $product_id;
  26. if (!Studiou_WC_FPP_Product::is_fpp_product($product_id)) {
  27. $product = wc_get_product($product_id);
  28. if ($product && $product->get_parent_id() && Studiou_WC_FPP_Product::is_fpp_product($product->get_parent_id())) {
  29. $fpp_product_id = $product->get_parent_id();
  30. } else {
  31. return $cart_item_data;
  32. }
  33. }
  34. // Read file data from WC session
  35. if (!WC()->session) {
  36. return $cart_item_data;
  37. }
  38. $attachment_id = WC()->session->get('studiou_fpp_attachment_id');
  39. $file_record_id = WC()->session->get('studiou_fpp_file_record_id');
  40. $file_name = WC()->session->get('studiou_fpp_file_name');
  41. if (!$attachment_id || !$file_record_id) {
  42. return $cart_item_data;
  43. }
  44. // Verify the file record exists
  45. $record = $this->db->get_file_record($file_record_id);
  46. if (!$record || (int) $record->attachment_id !== (int) $attachment_id) {
  47. return $cart_item_data;
  48. }
  49. $cart_item_data['studiou_fpp_attachment_id'] = $attachment_id;
  50. $cart_item_data['studiou_fpp_file_record_id'] = $file_record_id;
  51. $cart_item_data['studiou_fpp_file_name'] = $file_name ?: $record->file_name;
  52. // Update file record with variation
  53. $actual_variation_id = $variation_id ?: $product_id;
  54. $this->db->update_file_record($file_record_id, array(
  55. 'variation_id' => $actual_variation_id,
  56. ));
  57. // Clear session data after reading (so next add-to-cart is clean)
  58. WC()->session->set('studiou_fpp_attachment_id', null);
  59. WC()->session->set('studiou_fpp_file_record_id', null);
  60. WC()->session->set('studiou_fpp_file_name', null);
  61. return $cart_item_data;
  62. }
  63. public function cart_item_thumbnail($thumbnail, $cart_item, $cart_item_key) {
  64. if (!empty($cart_item['studiou_fpp_attachment_id'])) {
  65. $image = wp_get_attachment_image($cart_item['studiou_fpp_attachment_id'], 'woocommerce_thumbnail');
  66. if ($image) {
  67. return $image;
  68. }
  69. }
  70. return $thumbnail;
  71. }
  72. public function display_cart_item_data($item_data, $cart_item) {
  73. if (isset($cart_item['studiou_fpp_file_name'])) {
  74. $item_data[] = array(
  75. 'name' => __('Uploaded Photo', 'studiou-wc-free-photo-product'),
  76. 'value' => esc_html($cart_item['studiou_fpp_file_name']),
  77. 'display' => '',
  78. );
  79. }
  80. return $item_data;
  81. }
  82. public function save_order_item_meta($item, $cart_item_key, $values, $order) {
  83. if (isset($values['studiou_fpp_attachment_id'])) {
  84. $item->add_meta_data('_studiou_fpp_attachment_id', $values['studiou_fpp_attachment_id']);
  85. }
  86. if (isset($values['studiou_fpp_file_record_id'])) {
  87. $item->add_meta_data('_studiou_fpp_file_record_id', $values['studiou_fpp_file_record_id']);
  88. }
  89. if (isset($values['studiou_fpp_file_name'])) {
  90. $item->add_meta_data('_studiou_fpp_file_name', $values['studiou_fpp_file_name']);
  91. $item->add_meta_data(__('Uploaded Photo', 'studiou-wc-free-photo-product'), $values['studiou_fpp_file_name']);
  92. }
  93. }
  94. public function link_files_to_order($order_id, $posted_data, $order) {
  95. foreach ($order->get_items() as $item_id => $item) {
  96. $file_record_id = $item->get_meta('_studiou_fpp_file_record_id');
  97. if ($file_record_id) {
  98. $this->db->link_file_to_order((int) $file_record_id, $order_id, $item_id);
  99. }
  100. }
  101. }
  102. public function admin_order_item_thumbnail($thumbnail, $item_id, $item) {
  103. $attachment_id = $item->get_meta('_studiou_fpp_attachment_id');
  104. if ($attachment_id) {
  105. $image = wp_get_attachment_image($attachment_id, 'thumbnail');
  106. if ($image) {
  107. return $image;
  108. }
  109. }
  110. return $thumbnail;
  111. }
  112. }