Contact tab, so site owners * don't have to retype them for every product. */ defined( 'ABSPATH' ) || exit; class AumNexCart_Meta_Boxes { const NONCE_NAME = 'aumnexcart_meta_nonce'; const NONCE_ACTION = 'aumnexcart_meta_save'; public function __construct() { add_action( 'add_meta_boxes', array( $this, 'register' ) ); add_action( 'save_post_' . AumNexCart_Post_Type::POST_TYPE, array( $this, 'save' ), 10, 2 ); } /** * Registers the four meta boxes on the product edit screen. */ public function register() { $pt = AumNexCart_Post_Type::POST_TYPE; add_meta_box( 'aumnexcart-media', __( 'Media Gallery', 'aumnexcart' ), array( $this, 'render_media' ), $pt, 'normal', 'high' ); add_meta_box( 'aumnexcart-price', __( 'Price', 'aumnexcart' ), array( $this, 'render_price' ), $pt, 'side', 'default' ); add_meta_box( 'aumnexcart-attributes', __( 'Product Attributes', 'aumnexcart' ), array( $this, 'render_attributes' ), $pt, 'normal', 'default' ); add_meta_box( 'aumnexcart-contact', __( 'Contact Actions', 'aumnexcart' ), array( $this, 'render_contact' ), $pt, 'normal', 'default' ); } /* ---------------------------------------------------------------- * Media meta box * ---------------------------------------------------------------- */ public function render_media( $post ) { wp_nonce_field( self::NONCE_ACTION, self::NONCE_NAME ); $items = AumNexCart_Meta::get_media( $post->ID ); ?>

$item ) : ?> render_media_row( $i, $item ); ?>

ID ); $type = $data['type']; $global_currency = AumNexCart_Settings::get( 'currency_symbol', '$' ); ?>



>

>

ID ); $filterable = AumNexCart_Settings::get( 'filterable_attributes', array() ); $filter_label = ! empty( $filterable ) ? sprintf( /* translators: %s: comma-separated list of filterable attribute keys */ __( 'Filterable keys (from Settings): %s', 'aumnexcart' ), implode( ', ', $filterable ) ) : __( 'No filterable keys configured. Add some under AumNexCart > Settings > Filter.', 'aumnexcart' ); ?>
$row ) : ?> render_attr_row( $i, $row ); ?>

ID ); /* Pre-fill from defaults when creating a brand-new product * with no contact rows saved yet. The auto-draft check makes * sure we don't overwrite a deliberate "no actions" state on * an existing product. */ if ( empty( $rows ) && 'auto-draft' === $post->post_status ) { $defaults = AumNexCart_Settings::get( 'default_contact', array() ); foreach ( $defaults as $row ) { $item = AumNexCart_Meta::normalize_contact_row( $row ); if ( $item ) { $rows[] = $item; } } } ?>

$row ) : ?> render_contact_row( $i, $row ); ?>

isset( $_POST['aumnexcart_price_type'] ) ? sanitize_text_field( wp_unslash( $_POST['aumnexcart_price_type'] ) ) : 'hidden', 'min' => isset( $_POST['aumnexcart_price_min'] ) ? sanitize_text_field( wp_unslash( $_POST['aumnexcart_price_min'] ) ) : '', 'max' => isset( $_POST['aumnexcart_price_max'] ) ? sanitize_text_field( wp_unslash( $_POST['aumnexcart_price_max'] ) ) : '', 'currency' => isset( $_POST['aumnexcart_price_currency'] ) ? sanitize_text_field( wp_unslash( $_POST['aumnexcart_price_currency'] ) ) : '', 'text' => isset( $_POST['aumnexcart_price_text'] ) ? sanitize_text_field( wp_unslash( $_POST['aumnexcart_price_text'] ) ) : '', ); AumNexCart_Meta::save_price( $post_id, $price ); /* Attributes */ $attrs = isset( $_POST['aumnexcart_attributes'] ) && is_array( $_POST['aumnexcart_attributes'] ) ? map_deep( wp_unslash( $_POST['aumnexcart_attributes'] ), 'sanitize_text_field' ) : array(); AumNexCart_Meta::save_attributes( $post_id, $attrs ); /* Contact */ $contact = isset( $_POST['aumnexcart_contact'] ) && is_array( $_POST['aumnexcart_contact'] ) ? map_deep( wp_unslash( $_POST['aumnexcart_contact'] ), 'sanitize_text_field' ) : array(); AumNexCart_Meta::save_contact( $post_id, $contact ); } }