class-order-fields-manager.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. // Manages custom order fields rendered in the "Print Information" panel.
  3. defined('ABSPATH') || exit;
  4. class Order_Fields_Manager {
  5. private $datetime_fields = array(
  6. 'to_print_date' => 'Prepare To Print Date',
  7. 'in_print_date' => 'In Print Date',
  8. 'external_ref_ord_date' => 'External Order Date',
  9. 'external_ref_ord_delivered' => 'External Order Delivered',
  10. );
  11. private $text_fields = array(
  12. 'external_ref_ord_no' => 'External Order Number',
  13. );
  14. public function __construct() {
  15. add_action('woocommerce_admin_order_data_after_order_details', array($this, 'display_custom_order_fields'));
  16. add_action('woocommerce_process_shop_order_meta', array($this, 'save_custom_order_fields'));
  17. }
  18. public function display_custom_order_fields($order) {
  19. ?>
  20. <div class="order_data_column">
  21. <h4><?php esc_html_e('Print Information', 'studiou-wc-ord-print-statuses'); ?></h4>
  22. <?php
  23. woocommerce_wp_text_input(array(
  24. 'id' => 'to_print_date',
  25. 'label' => __('Prepare To Print Date', 'studiou-wc-ord-print-statuses'),
  26. 'type' => 'datetime-local',
  27. 'value' => $this->mysql_to_datetime_local($order->get_meta('to_print_date')),
  28. 'wrapper_class' => 'form-field-wide',
  29. ));
  30. woocommerce_wp_text_input(array(
  31. 'id' => 'in_print_date',
  32. 'label' => __('In Print Date', 'studiou-wc-ord-print-statuses'),
  33. 'type' => 'datetime-local',
  34. 'value' => $this->mysql_to_datetime_local($order->get_meta('in_print_date')),
  35. 'wrapper_class' => 'form-field-wide',
  36. ));
  37. woocommerce_wp_text_input(array(
  38. 'id' => 'external_ref_ord_no',
  39. 'label' => __('External Order Number', 'studiou-wc-ord-print-statuses'),
  40. 'value' => $order->get_meta('external_ref_ord_no'),
  41. 'wrapper_class' => 'form-field-wide',
  42. ));
  43. woocommerce_wp_text_input(array(
  44. 'id' => 'external_ref_ord_date',
  45. 'label' => __('External Order Date', 'studiou-wc-ord-print-statuses'),
  46. 'type' => 'datetime-local',
  47. 'value' => $this->mysql_to_datetime_local($order->get_meta('external_ref_ord_date')),
  48. 'wrapper_class' => 'form-field-wide',
  49. ));
  50. woocommerce_wp_text_input(array(
  51. 'id' => 'external_ref_ord_delivered',
  52. 'label' => __('External Order Delivered', 'studiou-wc-ord-print-statuses'),
  53. 'type' => 'datetime-local',
  54. 'value' => $this->mysql_to_datetime_local($order->get_meta('external_ref_ord_delivered')),
  55. 'wrapper_class' => 'form-field-wide',
  56. ));
  57. ?>
  58. </div>
  59. <?php
  60. }
  61. public function save_custom_order_fields($order_id) {
  62. $order = wc_get_order($order_id);
  63. if (!$order) {
  64. return;
  65. }
  66. foreach (array_keys($this->datetime_fields) as $field) {
  67. if (isset($_POST[$field])) {
  68. $order->update_meta_data($field, $this->datetime_local_to_mysql($_POST[$field]));
  69. }
  70. }
  71. foreach (array_keys($this->text_fields) as $field) {
  72. if (isset($_POST[$field])) {
  73. $order->update_meta_data($field, sanitize_text_field(wp_unslash($_POST[$field])));
  74. }
  75. }
  76. $order->save();
  77. }
  78. private function mysql_to_datetime_local($value) {
  79. if (empty($value)) {
  80. return '';
  81. }
  82. $timestamp = strtotime($value);
  83. return $timestamp ? date('Y-m-d\TH:i', $timestamp) : '';
  84. }
  85. private function datetime_local_to_mysql($value) {
  86. $value = sanitize_text_field(wp_unslash($value));
  87. if ($value === '') {
  88. return '';
  89. }
  90. $timestamp = strtotime($value);
  91. return $timestamp ? date('Y-m-d H:i:s', $timestamp) : '';
  92. }
  93. }