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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. include STUDIOU_WCFPP_PLUGIN_DIR . 'views/single-product-upload.php';
  27. }
  28. public function validate_add_to_cart($passed, $product_id, $quantity) {
  29. if (!Studiou_WC_FPP_Product::is_fpp_product($product_id)) {
  30. // Also check parent product for variations
  31. $product = wc_get_product($product_id);
  32. if ($product && $product->get_parent_id()) {
  33. $parent_id = $product->get_parent_id();
  34. if (!Studiou_WC_FPP_Product::is_fpp_product($parent_id)) {
  35. return $passed;
  36. }
  37. } else {
  38. return $passed;
  39. }
  40. }
  41. // Check WC session for uploaded file data
  42. if (WC()->session) {
  43. $attachment_id = WC()->session->get('studiou_fpp_attachment_id');
  44. if ($attachment_id) {
  45. return $passed;
  46. }
  47. }
  48. wc_add_notice(__('Please upload a photo before adding to cart.', 'studiou-wc-free-photo-product'), 'error');
  49. return false;
  50. }
  51. public function ajax_set_upload_session() {
  52. check_ajax_referer('studiou-wcfpp-front-nonce', 'nonce');
  53. $attachment_id = isset($_POST['attachment_id']) ? absint($_POST['attachment_id']) : 0;
  54. $file_record_id = isset($_POST['file_record_id']) ? absint($_POST['file_record_id']) : 0;
  55. $file_name = isset($_POST['file_name']) ? sanitize_text_field($_POST['file_name']) : '';
  56. if (!$attachment_id || !$file_record_id) {
  57. wp_send_json_error(array('message' => __('Invalid file data.', 'studiou-wc-free-photo-product')));
  58. return;
  59. }
  60. if (WC()->session) {
  61. WC()->session->set('studiou_fpp_attachment_id', $attachment_id);
  62. WC()->session->set('studiou_fpp_file_record_id', $file_record_id);
  63. WC()->session->set('studiou_fpp_file_name', $file_name);
  64. }
  65. wp_send_json_success();
  66. }
  67. public function ajax_clear_upload_session() {
  68. check_ajax_referer('studiou-wcfpp-front-nonce', 'nonce');
  69. if (WC()->session) {
  70. WC()->session->set('studiou_fpp_attachment_id', null);
  71. WC()->session->set('studiou_fpp_file_record_id', null);
  72. WC()->session->set('studiou_fpp_file_name', null);
  73. }
  74. wp_send_json_success();
  75. }
  76. }