class-studiou-wc-fpp-shortcode.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. if (!defined('WPINC')) {
  3. die;
  4. }
  5. class Studiou_WC_FPP_Shortcode {
  6. public function __construct() {
  7. add_shortcode('studiou_free_photo_product', array($this, 'render_shortcode'));
  8. }
  9. public function render_shortcode($atts) {
  10. $atts = shortcode_atts(array(
  11. 'id' => 0,
  12. ), $atts, 'studiou_free_photo_product');
  13. $product_id = absint($atts['id']);
  14. if (!$product_id) {
  15. return '<p class="studiou-fpp-error">' . esc_html__('Product ID is required.', 'studiou-wc-free-photo-product') . '</p>';
  16. }
  17. $product = wc_get_product($product_id);
  18. if (!$product) {
  19. return '<p class="studiou-fpp-error">' . esc_html__('Product not found.', 'studiou-wc-free-photo-product') . '</p>';
  20. }
  21. if (!Studiou_WC_FPP_Product::is_fpp_product($product_id)) {
  22. return '<p class="studiou-fpp-error">' . esc_html__('This product does not support photo upload.', 'studiou-wc-free-photo-product') . '</p>';
  23. }
  24. if (!$product->is_type('variable')) {
  25. return '<p class="studiou-fpp-error">' . esc_html__('This product must be a variable product.', 'studiou-wc-free-photo-product') . '</p>';
  26. }
  27. // Enqueue assets
  28. wp_enqueue_style('studiou-wcfpp-frontend');
  29. wp_enqueue_script('studiou-wcfpp-frontend');
  30. $max_file_size = Studiou_WC_FPP_Product::get_product_max_file_size($product_id);
  31. // Set global product so WC template functions work
  32. global $post;
  33. $original_post = $post;
  34. $post = get_post($product_id);
  35. setup_postdata($post);
  36. ob_start();
  37. include STUDIOU_WCFPP_PLUGIN_DIR . 'views/frontend-product.php';
  38. $output = ob_get_clean();
  39. // Restore original post
  40. $post = $original_post;
  41. if ($original_post) {
  42. setup_postdata($original_post);
  43. } else {
  44. wp_reset_postdata();
  45. }
  46. return $output;
  47. }
  48. }