'string', 'single' => true, 'show_in_rest' => true, 'auth_callback' => '__return_true', 'sanitize_callback' => function ( $value ) use ( $allowed_states ) { return in_array( $value, $allowed_states, true ) ? $value : ''; }, ) ); // Register verdict_text meta — 3–5 sentence opinionated verdict paragraph. register_post_meta( 'peptide', 'verdict_text', array( 'type' => 'string', 'single' => true, 'show_in_rest' => true, 'auth_callback' => '__return_true', 'sanitize_callback' => 'sanitize_textarea_field', ) ); // Register signal row text meta (up to 3 rows). for ( $i = 1; $i <= 3; $i++ ) { register_post_meta( 'peptide', 'signal_row_' . $i, array( 'type' => 'string', 'single' => true, 'show_in_rest' => true, 'auth_callback' => '__return_true', 'sanitize_callback' => 'sanitize_text_field', ) ); // Register per-row glyph meta. // Validated as one of the 5-state glyph set to keep visual vocabulary consistent. register_post_meta( 'peptide', 'signal_row_' . $i . '_glyph', array( 'type' => 'string', 'single' => true, 'show_in_rest' => true, 'auth_callback' => '__return_true', 'sanitize_callback' => function ( $value ) use ( $allowed_glyphs ) { return ( '' === $value || in_array( $value, $allowed_glyphs, true ) ) ? $value : ''; }, ) ); } // Register has_partner_link — gates inline affiliate disclosure rendering. // Default false: disclosure is suppressed unless a partner link is explicitly present. register_post_meta( 'peptide', 'has_partner_link', array( 'type' => 'boolean', 'single' => true, 'show_in_rest' => true, 'auth_callback' => '__return_true', 'default' => false, ) ); } add_action( 'init', 'peptide_starter_register_verdict_meta' ); /** * Add verdict meta box to peptide CPT edit screen. * * @return void */ function peptide_starter_add_verdict_meta_box() { add_meta_box( 'peptide_starter_verdict', esc_html__( 'Verdict System', 'peptide-starter' ), 'peptide_starter_render_verdict_meta_box', 'peptide', 'normal', 'high' ); } add_action( 'add_meta_boxes', 'peptide_starter_add_verdict_meta_box' ); /** * Render verdict meta box HTML. * * @param WP_Post $post The post object. * @return void */ function peptide_starter_render_verdict_meta_box( $post ) { wp_nonce_field( 'peptide_starter_verdict_nonce', 'peptide_starter_verdict_nonce' ); $verdict_state = get_post_meta( $post->ID, 'verdict_state', true ); $verdict_text = get_post_meta( $post->ID, 'verdict_text', true ); $allowed_states = array( 'established' => esc_html__( 'Established', 'peptide-starter' ), 'promising' => esc_html__( 'Promising', 'peptide-starter' ), 'investigational' => esc_html__( 'Investigational', 'peptide-starter' ), 'insufficient' => esc_html__( 'Insufficient Evidence', 'peptide-starter' ), 'cautionary' => esc_html__( 'Cautionary', 'peptide-starter' ), ); $allowed_glyphs = array( '✓', '!', '?', '⊘', '⚠' ); $has_partner = (bool) get_post_meta( $post->ID, 'has_partner_link', true ); ?>