'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 ); ?>

ID, 'signal_row_' . $i, true ); $row_glyph = get_post_meta( $post->ID, 'signal_row_' . $i . '_glyph', true ); ?>

post_type ) { return; } if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } $allowed_states = array( 'established', 'promising', 'investigational', 'insufficient', 'cautionary' ); $allowed_glyphs = array( '✓', '!', '?', '⊘', '⚠' ); // Save verdict_state. if ( isset( $_POST['verdict_state'] ) ) { $state = sanitize_text_field( wp_unslash( $_POST['verdict_state'] ) ); if ( in_array( $state, $allowed_states, true ) ) { update_post_meta( $post_id, 'verdict_state', $state ); } else { delete_post_meta( $post_id, 'verdict_state' ); } } // Save verdict_text. if ( isset( $_POST['verdict_text'] ) ) { $text = sanitize_textarea_field( wp_unslash( $_POST['verdict_text'] ) ); if ( ! empty( $text ) ) { update_post_meta( $post_id, 'verdict_text', $text ); } else { delete_post_meta( $post_id, 'verdict_text' ); } } // Save signal rows and their per-row glyphs. for ( $i = 1; $i <= 3; $i++ ) { $field_name = 'signal_row_' . $i; if ( isset( $_POST[ $field_name ] ) ) { $value = sanitize_text_field( wp_unslash( $_POST[ $field_name ] ) ); if ( ! empty( $value ) ) { update_post_meta( $post_id, $field_name, $value ); } else { delete_post_meta( $post_id, $field_name ); } } $glyph_field = 'signal_row_' . $i . '_glyph'; if ( isset( $_POST[ $glyph_field ] ) ) { $glyph = wp_unslash( $_POST[ $glyph_field ] ); if ( in_array( $glyph, $allowed_glyphs, true ) ) { update_post_meta( $post_id, $glyph_field, $glyph ); } else { delete_post_meta( $post_id, $glyph_field ); } } } // Save has_partner_link (checkbox — present = true, absent = false). $has_partner = isset( $_POST['has_partner_link'] ) && '1' === $_POST['has_partner_link']; update_post_meta( $post_id, 'has_partner_link', $has_partner ? '1' : '0' ); } add_action( 'save_post', 'peptide_starter_save_verdict_meta', 10, 2 );