class-studiou-wc-fpp-single-product.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. if (!defined('WPINC')) {
  3. die;
  4. }
  5. class Studiou_WC_FPP_Single_Product {
  6. public function __construct() {
  7. // Render upload area below the variation table on single product page
  8. add_action('woocommerce_single_product_summary', array($this, 'render_upload_area'), 35);
  9. // Validation before add to cart
  10. add_filter('woocommerce_add_to_cart_validation', array($this, 'validate_add_to_cart'), 10, 3);
  11. // AJAX: store uploaded file reference in WC session
  12. add_action('wp_ajax_studiou_wcfpp_set_upload_session', array($this, 'ajax_set_upload_session'));
  13. add_action('wp_ajax_nopriv_studiou_wcfpp_set_upload_session', array($this, 'ajax_set_upload_session'));
  14. add_action('wp_ajax_studiou_wcfpp_clear_upload_session', array($this, 'ajax_clear_upload_session'));
  15. add_action('wp_ajax_nopriv_studiou_wcfpp_clear_upload_session', array($this, 'ajax_clear_upload_session'));
  16. }
  17. public function render_upload_area() {
  18. global $product;
  19. if (!$product || !Studiou_WC_FPP_Product::is_fpp_product($product->get_id())) {
  20. return;
  21. }
  22. wp_enqueue_style('studiou-wcfpp-frontend');
  23. wp_enqueue_script('studiou-wcfpp-frontend');
  24. $product_id = $product->get_id();
  25. $max_file_size = Studiou_WC_FPP_Product::get_product_max_file_size($product_id);
  26. // Pass existing session state to JS for restore on page load
  27. $session_data = array();
  28. if (WC()->session) {
  29. $att_id = WC()->session->get('studiou_fpp_attachment_id');
  30. if ($att_id) {
  31. $thumb = wp_get_attachment_image_src($att_id, 'thumbnail');
  32. $preview = wp_get_attachment_image_src($att_id, 'woocommerce_single');
  33. $session_data = array(
  34. 'attachment_id' => $att_id,
  35. 'file_record_id' => WC()->session->get('studiou_fpp_file_record_id'),
  36. 'file_name' => WC()->session->get('studiou_fpp_file_name'),
  37. 'thumbnail_url' => $thumb ? $thumb[0] : '',
  38. 'preview_url' => $preview ? $preview[0] : ($thumb ? $thumb[0] : ''),
  39. );
  40. }
  41. }
  42. wp_localize_script('studiou-wcfpp-frontend', 'studiouWcfppSession', $session_data);
  43. include STUDIOU_WCFPP_PLUGIN_DIR . 'views/single-product-upload.php';
  44. }
  45. public function validate_add_to_cart($passed, $product_id, $quantity) {
  46. if (!Studiou_WC_FPP_Product::is_fpp_product($product_id)) {
  47. // Also check parent product for variations
  48. $product = wc_get_product($product_id);
  49. if ($product && $product->get_parent_id()) {
  50. $parent_id = $product->get_parent_id();
  51. if (!Studiou_WC_FPP_Product::is_fpp_product($parent_id)) {
  52. return $passed;
  53. }
  54. } else {
  55. return $passed;
  56. }
  57. }
  58. // Check WC session for uploaded file data
  59. if (WC()->session) {
  60. $attachment_id = WC()->session->get('studiou_fpp_attachment_id');
  61. if ($attachment_id) {
  62. return $passed;
  63. }
  64. }
  65. wc_add_notice(__('Please upload a photo before adding to cart.', 'studiou-wc-free-photo-product'), 'error');
  66. return false;
  67. }
  68. public function ajax_set_upload_session() {
  69. check_ajax_referer('studiou-wcfpp-front-nonce', 'nonce');
  70. $attachment_id = isset($_POST['attachment_id']) ? absint($_POST['attachment_id']) : 0;
  71. $file_record_id = isset($_POST['file_record_id']) ? absint($_POST['file_record_id']) : 0;
  72. $file_name = isset($_POST['file_name']) ? sanitize_text_field($_POST['file_name']) : '';
  73. if (!$attachment_id || !$file_record_id) {
  74. wp_send_json_error(array('message' => __('Invalid file data.', 'studiou-wc-free-photo-product')));
  75. return;
  76. }
  77. if (WC()->session) {
  78. WC()->session->set('studiou_fpp_attachment_id', $attachment_id);
  79. WC()->session->set('studiou_fpp_file_record_id', $file_record_id);
  80. WC()->session->set('studiou_fpp_file_name', $file_name);
  81. }
  82. wp_send_json_success();
  83. }
  84. public function ajax_clear_upload_session() {
  85. check_ajax_referer('studiou-wcfpp-front-nonce', 'nonce');
  86. if (WC()->session) {
  87. WC()->session->set('studiou_fpp_attachment_id', null);
  88. WC()->session->set('studiou_fpp_file_record_id', null);
  89. WC()->session->set('studiou_fpp_file_name', null);
  90. }
  91. wp_send_json_success();
  92. }
  93. }