WC_Admin_Meta_Boxes

WC_Admin_Meta_Boxes.

Defined (1)

The class is defined in the following location(s).

/includes/admin/class-wc-admin-meta-boxes.php  
  1. class WC_Admin_Meta_Boxes { 
  2.  
  3. /** 
  4. * Is meta boxes saved once? 
  5. * @var boolean 
  6. */ 
  7. private static $saved_meta_boxes = false; 
  8.  
  9. /** 
  10. * Meta box error messages. 
  11. * @var array 
  12. */ 
  13. public static $meta_box_errors = array(); 
  14.  
  15. /** 
  16. * Constructor. 
  17. */ 
  18. public function __construct() { 
  19. add_action( 'add_meta_boxes', array( $this, 'remove_meta_boxes' ), 10 ); 
  20. add_action( 'add_meta_boxes', array( $this, 'rename_meta_boxes' ), 20 ); 
  21. add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 30 ); 
  22. add_action( 'save_post', array( $this, 'save_meta_boxes' ), 1, 2 ); 
  23.  
  24. /** 
  25. * Save Order Meta Boxes. 
  26. * In order: 
  27. * Save the order items. 
  28. * Save the order totals. 
  29. * Save the order downloads. 
  30. * Save order data - also updates status and sends out admin emails if needed. Last to show latest data. 
  31. * Save actions - sends out other emails. Last to show latest data. 
  32. */ 
  33. add_action( 'woocommerce_process_shop_order_meta', 'WC_Meta_Box_Order_Items::save', 10, 2 ); 
  34. add_action( 'woocommerce_process_shop_order_meta', 'WC_Meta_Box_Order_Downloads::save', 30, 2 ); 
  35. add_action( 'woocommerce_process_shop_order_meta', 'WC_Meta_Box_Order_Data::save', 40, 2 ); 
  36. add_action( 'woocommerce_process_shop_order_meta', 'WC_Meta_Box_Order_Actions::save', 50, 2 ); 
  37.  
  38. // Save Product Meta Boxes 
  39. add_action( 'woocommerce_process_product_meta', 'WC_Meta_Box_Product_Data::save', 10, 2 ); 
  40. add_action( 'woocommerce_process_product_meta', 'WC_Meta_Box_Product_Images::save', 20, 2 ); 
  41.  
  42. // Save Coupon Meta Boxes 
  43. add_action( 'woocommerce_process_shop_coupon_meta', 'WC_Meta_Box_Coupon_Data::save', 10, 2 ); 
  44.  
  45. // Error handling (for showing errors from meta boxes on next page load) 
  46. add_action( 'admin_notices', array( $this, 'output_errors' ) ); 
  47. add_action( 'shutdown', array( $this, 'save_errors' ) ); 
  48.  
  49. /** 
  50. * Add an error message. 
  51. * @param string $text 
  52. */ 
  53. public static function add_error( $text ) { 
  54. self::$meta_box_errors[] = $text; 
  55.  
  56. /** 
  57. * Save errors to an option. 
  58. */ 
  59. public function save_errors() { 
  60. update_option( 'woocommerce_meta_box_errors', self::$meta_box_errors ); 
  61.  
  62. /** 
  63. * Show any stored error messages. 
  64. */ 
  65. public function output_errors() { 
  66. $errors = maybe_unserialize( get_option( 'woocommerce_meta_box_errors' ) ); 
  67.  
  68. if ( ! empty( $errors ) ) { 
  69.  
  70. echo '<div id="woocommerce_errors" class="error notice is-dismissible">'; 
  71.  
  72. foreach ( $errors as $error ) { 
  73. echo '<p>' . wp_kses_post( $error ) . '</p>'; 
  74.  
  75. echo '</div>'; 
  76.  
  77. // Clear 
  78. delete_option( 'woocommerce_meta_box_errors' ); 
  79.  
  80. /** 
  81. * Add WC Meta boxes. 
  82. */ 
  83. public function add_meta_boxes() { 
  84. // Products 
  85. add_meta_box( 'postexcerpt', __( 'Product Short Description', 'woocommerce' ), 'WC_Meta_Box_Product_Short_Description::output', 'product', 'normal' ); 
  86. add_meta_box( 'woocommerce-product-data', __( 'Product Data', 'woocommerce' ), 'WC_Meta_Box_Product_Data::output', 'product', 'normal', 'high' ); 
  87. add_meta_box( 'woocommerce-product-images', __( 'Product Gallery', 'woocommerce' ), 'WC_Meta_Box_Product_Images::output', 'product', 'side', 'low' ); 
  88.  
  89. // Orders 
  90. foreach ( wc_get_order_types( 'order-meta-boxes' ) as $type ) { 
  91. $order_type_object = get_post_type_object( $type ); 
  92. add_meta_box( 'woocommerce-order-data', sprintf( __( '%s Data', 'woocommerce' ), $order_type_object->labels->singular_name ), 'WC_Meta_Box_Order_Data::output', $type, 'normal', 'high' ); 
  93. add_meta_box( 'woocommerce-order-items', __( 'Items', 'woocommerce' ), 'WC_Meta_Box_Order_Items::output', $type, 'normal', 'high' ); 
  94. add_meta_box( 'woocommerce-order-notes', sprintf( __( '%s Notes', 'woocommerce' ), $order_type_object->labels->singular_name ), 'WC_Meta_Box_Order_Notes::output', $type, 'side', 'default' ); 
  95. add_meta_box( 'woocommerce-order-downloads', __( 'Downloadable Product Permissions', 'woocommerce' ) . wc_help_tip( __( 'Note: Permissions for order items will automatically be granted when the order status changes to processing/completed.', 'woocommerce' ) ), 'WC_Meta_Box_Order_Downloads::output', $type, 'normal', 'default' ); 
  96. add_meta_box( 'woocommerce-order-actions', sprintf( __( '%s Actions', 'woocommerce' ), $order_type_object->labels->singular_name ), 'WC_Meta_Box_Order_Actions::output', $type, 'side', 'high' ); 
  97.  
  98. // Coupons 
  99. add_meta_box( 'woocommerce-coupon-data', __( 'Coupon Data', 'woocommerce' ), 'WC_Meta_Box_Coupon_Data::output', 'shop_coupon', 'normal', 'high' ); 
  100.  
  101. /** 
  102. * Remove bloat. 
  103. */ 
  104. public function remove_meta_boxes() { 
  105. remove_meta_box( 'postexcerpt', 'product', 'normal' ); 
  106. remove_meta_box( 'product_shipping_classdiv', 'product', 'side' ); 
  107. remove_meta_box( 'pageparentdiv', 'product', 'side' ); 
  108. remove_meta_box( 'commentsdiv', 'product', 'normal' ); 
  109. remove_meta_box( 'commentstatusdiv', 'product', 'side' ); 
  110. remove_meta_box( 'commentstatusdiv', 'product', 'normal' ); 
  111. remove_meta_box( 'woothemes-settings', 'shop_coupon', 'normal' ); 
  112. remove_meta_box( 'commentstatusdiv', 'shop_coupon', 'normal' ); 
  113. remove_meta_box( 'slugdiv', 'shop_coupon', 'normal' ); 
  114.  
  115. foreach ( wc_get_order_types( 'order-meta-boxes' ) as $type ) { 
  116. remove_meta_box( 'commentsdiv', $type, 'normal' ); 
  117. remove_meta_box( 'woothemes-settings', $type, 'normal' ); 
  118. remove_meta_box( 'commentstatusdiv', $type, 'normal' ); 
  119. remove_meta_box( 'slugdiv', $type, 'normal' ); 
  120. remove_meta_box( 'submitdiv', $type, 'side' ); 
  121.  
  122. /** 
  123. * Rename core meta boxes. 
  124. */ 
  125. public function rename_meta_boxes() { 
  126. global $post; 
  127.  
  128. // Comments/Reviews 
  129. if ( isset( $post ) && ( 'publish' == $post->post_status || 'private' == $post->post_status ) ) { 
  130. remove_meta_box( 'commentsdiv', 'product', 'normal' ); 
  131.  
  132. add_meta_box( 'commentsdiv', __( 'Reviews', 'woocommerce' ), 'post_comment_meta_box', 'product', 'normal' ); 
  133.  
  134. /** 
  135. * Check if we're saving, the trigger an action based on the post type. 
  136. * @param int $post_id 
  137. * @param object $post 
  138. */ 
  139. public function save_meta_boxes( $post_id, $post ) { 
  140. // $post_id and $post are required 
  141. if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) { 
  142. return; 
  143.  
  144. // Dont' save meta boxes for revisions or autosaves 
  145. if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) { 
  146. return; 
  147.  
  148. // Check the nonce 
  149. if ( empty( $_POST['woocommerce_meta_nonce'] ) || ! wp_verify_nonce( $_POST['woocommerce_meta_nonce'], 'woocommerce_save_data' ) ) { 
  150. return; 
  151.  
  152. // Check the post being saved == the $post_id to prevent triggering this call for other save_post events 
  153. if ( empty( $_POST['post_ID'] ) || $_POST['post_ID'] != $post_id ) { 
  154. return; 
  155.  
  156. // Check user has permission to edit 
  157. if ( ! current_user_can( 'edit_post', $post_id ) ) { 
  158. return; 
  159.  
  160. // We need this save event to run once to avoid potential endless loops. This would have been perfect: 
  161. // remove_action( current_filter(), __METHOD__ ); 
  162. // But cannot be used due to https://github.com/woothemes/woocommerce/issues/6485 
  163. // When that is patched in core we can use the above. For now: 
  164. self::$saved_meta_boxes = true; 
  165.  
  166. // Check the post type 
  167. if ( in_array( $post->post_type, wc_get_order_types( 'order-meta-boxes' ) ) ) { 
  168. do_action( 'woocommerce_process_shop_order_meta', $post_id, $post ); 
  169. } elseif ( in_array( $post->post_type, array( 'product', 'shop_coupon' ) ) ) { 
  170. do_action( 'woocommerce_process_' . $post->post_type . '_meta', $post_id, $post ); 
  171.