fix: Correct Linked Assessment metabox rendering and meta key

This commit is contained in:
Ruben Ramirez 2025-04-04 06:20:26 -05:00
parent a626e008bb
commit ee3b337d5e

View file

@ -175,8 +175,9 @@ class JobMetaboxes {
* @param \WP_Post $post The post object.
*/
public function render_linked_assessment_metabox( $post ) {
// Use the correct meta key as defined in meta-fields.md
$linked_assessment_id = \get_post_meta( $post->ID, '_quiztech_associated_assessment_id', true );
\wp_nonce_field( 'quiztech_save_linked_assessment_meta', 'quiztech_linked_assessment_nonce' );
$linked_assessment_id = \get_post_meta( $post->ID, '_quiztech_linked_assessment_id', true );
$assessments_query = new \WP_Query( [
'post_type' => 'assessment',
@ -186,23 +187,25 @@ class JobMetaboxes {
'order' => 'ASC',
] );
echo '<label for="quiztech_linked_assessment_field">';
// Output raw HTML, not entities
echo '<label for="quiztech_linked_assessment_field">';
\esc_html_e( 'Select the assessment for this job:', 'quiztech' );
echo '&lt;/label&gt;&lt;br /&gt;';
echo '</label><br />';
if ( $assessments_query->have_posts() ) {
echo '&lt;select name="quiztech_linked_assessment_field" id="quiztech_linked_assessment_field" class="widefat"&gt;';
echo '&lt;option value=""&gt;' . \esc_html__( '-- None --', 'quiztech' ) . '&lt;/option&gt;';
echo '<select name="quiztech_linked_assessment_field" id="quiztech_linked_assessment_field" class="widefat">';
echo '<option value="">' . \esc_html__( '-- None --', 'quiztech' ) . '</option>';
while ( $assessments_query->have_posts() ) {
$assessments_query->the_post();
$assessment_id = \get_the_ID();
$assessment_title = \get_the_title();
echo '&lt;option value="' . \esc_attr( $assessment_id ) . '" ' . \selected( $linked_assessment_id, $assessment_id, false ) . '&gt;' . \esc_html( $assessment_title ) . '&lt;/option&gt;';
// Use selected() for cleaner attribute generation
echo '<option value="' . \esc_attr( $assessment_id ) . '" ' . \selected( $linked_assessment_id, $assessment_id, false ) . '>' . \esc_html( $assessment_title ) . '</option>';
}
echo '&lt;/select&gt;';
echo '</select>';
\wp_reset_postdata();
} else {
echo '&lt;p&gt;' . \esc_html__( 'No assessments found. Please create an assessment first.', 'quiztech' ) . '&lt;/p&gt;';
echo '<p>' . \esc_html__( 'No assessments found. Please create an assessment first.', 'quiztech' ) . '</p>';
}
}
@ -218,17 +221,18 @@ class JobMetaboxes {
if ( ! \current_user_can( 'edit_post', $post_id ) ) { return; }
// No need to check post type here, as the action is specific ('save_post_job')
// Use the correct meta key
$meta_key = '_quiztech_associated_assessment_id';
// Field check and sanitize
if ( isset( $_POST['quiztech_linked_assessment_field'] ) ) {
$assessment_id = \sanitize_text_field( \wp_unslash( $_POST['quiztech_linked_assessment_field'] ) );
// Ensure empty string is saved if '-- None --' is selected, otherwise sanitize as integer
$assessment_id = '' === $assessment_id ? '' : \absint( $assessment_id );
\update_post_meta( $post_id, '_quiztech_linked_assessment_id', $assessment_id );
\update_post_meta( $post_id, $meta_key, $assessment_id );
} else {
// If the field isn't submitted (e.g., if the metabox wasn't rendered for some reason),
// we might want to delete the meta key to ensure no stale data persists.
// However, typically, if the field exists and is submitted empty, the above logic handles it (sets to '').
// Let's delete it if it's not set in POST, assuming the metabox should always be present on save.
\delete_post_meta( $post_id, '_quiztech_linked_assessment_id' );
// If the field isn't submitted, delete the meta key to ensure no stale data persists.
\delete_post_meta( $post_id, $meta_key );
}
}
}