Salvare valori în metabox-uri WordPress
Am 2 metabox-uri ("prețuri" și "date") pe pagina de editare a tipului meu de postare personalizată ("kvkoolitus").
După cum am înțeles corect, WordPress salvează valori doar din primul metabox randat.
Fiecare metabox are codul în fișiere separate. Dacă includ doar 1 metabox - funcționează, dar dacă includ ambele - WordPress salvează valori doar din primul metabox randat.
Ce am omis?
Prima funcție de creare a metabox-ului:
function kvkoolitus_prices_metabox() {
add_meta_box(
'kvkoolitus_prices_metabox',
__( 'Prețul cursului', 'kvkoolitus'),
'kvkoolitus_prices_metabox_callback',
'kvkoolitus',
'normal',
'default'
);
}
add_action( 'add_meta_boxes_kvkoolitus', 'kvkoolitus_prices_metabox' );
A doua funcție de creare a metabox-ului:
function kvkoolitus_dates_metabox() {
add_meta_box(
'kvkoolitus_dates_metabox',
__( 'Perioada cursului', 'kvkoolitus'),
'kvkoolitus_dates_metabox_callback',
'kvkoolitus',
'normal',
'default'
);
}
add_action( 'add_meta_boxes_kvkoolitus', 'kvkoolitus_dates_metabox' );
Funcția callback pentru primul metabox:
function kvkoolitus_dates_metabox_callback( $post ) {
wp_nonce_field( 'kvkoolitus_dates_metabox_nonce', 'kvkoolitus_dates_nonce' ); ?>
<form action="" method="post">
<?php
$start_date = get_post_meta( $post->ID, 'kvkoolitus-start', true );
$end_date = get_post_meta( $post->ID, 'kvkoolitus-end', true );
$duration = get_post_meta( $post->ID, 'kvkoolitus-duration', true );
?>
<p>
<label for="kvkoolitus_start_date"><?php _e('Data început', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat kvkoolitusDate" name="kvkoolitus_start_date" value="<?php echo esc_attr( $start_date ); ?>" />
</p>
<p>
<label for="kvkoolitus_end_date"><?php _e('Data sfârșit', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat kvkoolitusDate" name="kvkoolitus_end_date" value="<?php echo esc_attr( $end_date ); ?>" />
</p>
<p>
<label for="kvkoolitus_duration"><?php _e('Durată', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat" name="kvkoolitus_duration" value="<?php echo esc_attr( $duration ); ?>" />
</p>
</form>
<?php }
Funcția callback pentru al doilea metabox:
function kvkoolitus_prices_metabox_callback( $post ) {
wp_nonce_field( 'kvkoolitus_prices_metabox_nonce', 'kvkoolitus_prices_nonce' ); ?>
<form action="" method="post">
<?php
$price = get_post_meta( $post->ID, 'kvkoolitus-price', true );
$km = get_post_meta( $post->ID, 'kvkoolitus-km', true );
?>
<p>
<label for="kvkoolitus_price"><?php _e('Preț', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat" name="kvkoolitus_price" value="<?php echo esc_attr( $price ); ?>" />
</p>
<p>
<input type="checkbox" value="1" name="kvkoolitus_km" <?php checked( '1', $km ); ?> />
<label for="kvkoolitus_km"><?php _e('Include TVA', 'kvkoolitus' ); ?></label><br/>
</p>
</form>
<?php }
Funcția de salvare pentru primul metabox:
function kvkoolitus_dates_save_meta( $post_id ) {
if( !isset( $_POST['kvkoolitus_dates_nonce'] ) || !wp_verify_nonce( $_POST['kvkoolitus_dates_nonce'],'kvkoolitus_dates_metabox_nonce') )
return;
if ( !current_user_can( 'edit_post', $post_id ))
return;
if ( isset($_POST['kvkoolitus_start_date']) ) {
update_post_meta($post_id, 'kvkoolitus-start', sanitize_text_field( $_POST['kvkoolitus_start_date']));
}
if ( isset($_POST['kvkoolitus_end_date']) ) {
update_post_meta($post_id, 'kvkoolitus-end', sanitize_text_field( $_POST['kvkoolitus_end_date'] ));
}
if ( isset($_POST['kvkoolitus_duration']) ) {
update_post_meta($post_id, 'kvkoolitus-duration', sanitize_text_field($_POST['kvkoolitus_duration']));
}
}
add_action('save_post', 'kvkoolitus_dates_save_meta');
Funcția de salvare pentru al doilea metabox:
function kvkoolitus_prices_save_meta( $post_id ) {
if( !isset( $_POST['kvkoolitus_prices_nonce'] ) || !wp_verify_nonce( $_POST['kvkoolitus_prices_nonce'],'kvkoolitus_prices_metabox_nonce') )
return;
if ( !current_user_can( 'edit_post', $post_id ))
return;
if ( isset($_POST['kvkoolitus_price']) ) {
update_post_meta($post_id, 'kvkoolitus-price', sanitize_text_field($_POST['kvkoolitus_price']));
}
if ( isset($_POST['kvkoolitus_km']) ) {
update_post_meta($post_id, 'kvkoolitus-km', sanitize_text_field($_POST['kvkoolitus_km']));
}
}
add_action('save_post', 'kvkoolitus_prices_save_meta');
În primul rând, nu ai nevoie de tag-urile <form>
; meta box-urile sunt deja afișate în interiorul formularului de editare a articolului.
În al doilea rând, dacă o casetă de bifat nu este bifată, aceasta nu este trimisă, așadar isset( $_POST['checkbox_name'] )
va returna false
iar câmpul personalizat care stochează valoarea casetei de bifat nu va fi actualizat corect.
Am testat acest cod cu tipul de postare standard și funcționează, ar trebui să funcționeze și dacă îl folosești cu tipul tău personalizat de postare:
function kvkoolitus_prices_metabox() {
add_meta_box(
'kvkoolitus_prices_metabox',
__( 'Prețul Cursului', 'kvkoolitus'),
'kvkoolitus_prices_metabox_callback',
'post',
'normal',
'default'
);
}
add_action( 'add_meta_boxes', 'kvkoolitus_prices_metabox' );
function kvkoolitus_dates_metabox() {
add_meta_box(
'kvkoolitus_dates_metabox',
__( 'Perioada Cursului', 'kvkoolitus'),
'kvkoolitus_dates_metabox_callback',
'post',
'normal',
'default'
);
}
add_action( 'add_meta_boxes', 'kvkoolitus_dates_metabox' );
function kvkoolitus_dates_metabox_callback( $post ) {
wp_nonce_field( 'kvkoolitus_dates_metabox_nonce', 'kvkoolitus_dates_nonce' ); ?>
<?php
$start_date = get_post_meta( $post->ID, 'kvkoolitus-start', true );
$end_date = get_post_meta( $post->ID, 'kvkoolitus-end', true );
$duration = get_post_meta( $post->ID, 'kvkoolitus-duration', true );
?>
<p>
<label for="kvkoolitus_start_date"><?php _e('Data început', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat kvkoolitusDate" name="kvkoolitus_start_date" value="<?php echo esc_attr( $start_date ); ?>" />
</p>
<p>
<label for="kvkoolitus_end_date"><?php _e('Data sfârșit', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat kvkoolitusDate" name="kvkoolitus_end_date" value="<?php echo esc_attr( $end_date ); ?>" />
</p>
<p>
<label for="kvkoolitus_duration"><?php _e('Durată', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat" name="kvkoolitus_duration" value="<?php echo esc_attr( $duration ); ?>" />
</p>
<?php }
function kvkoolitus_prices_metabox_callback( $post ) {
wp_nonce_field( 'kvkoolitus_prices_metabox_nonce', 'kvkoolitus_prices_nonce' ); ?>
<?php
$price = get_post_meta( $post->ID, 'kvkoolitus-price', true );
$km = get_post_meta( $post->ID, 'kvkoolitus-km', true );
?>
<p>
<label for="kvkoolitus_price"><?php _e('Preț', 'kvkoolitus' ); ?></label><br/>
<input type="text" class="widefat" name="kvkoolitus_price" value="<?php echo esc_attr( $price ); ?>" />
</p>
<p>
<input type="checkbox" value="1" name="kvkoolitus_km" <?php checked( '1', $km ); ?> />
<label for="kvkoolitus_km"><?php _e('Include Taxă pe Venit', 'kvkoolitus' ); ?></label><br/>
</p>
<?php }
function kvkoolitus_dates_save_meta( $post_id ) {
if( !isset( $_POST['kvkoolitus_dates_nonce'] ) || !wp_verify_nonce( $_POST['kvkoolitus_dates_nonce'],'kvkoolitus_dates_metabox_nonce') )
return;
if ( !current_user_can( 'edit_post', $post_id ))
return;
if ( isset($_POST['kvkoolitus_start_date']) ) {
update_post_meta($post_id, 'kvkoolitus-start', sanitize_text_field( $_POST['kvkoolitus_start_date']));
}
if ( isset($_POST['kvkoolitus_end_date']) ) {
update_post_meta($post_id, 'kvkoolitus-end', sanitize_text_field( $_POST['kvkoolitus_end_date'] ));
}
if ( isset($_POST['kvkoolitus_duration']) ) {
update_post_meta($post_id, 'kvkoolitus-duration', sanitize_text_field($_POST['kvkoolitus_duration']));
}
}
add_action('save_post', 'kvkoolitus_dates_save_meta');
function kvkoolitus_prices_save_meta( $post_id ) {
if( !isset( $_POST['kvkoolitus_prices_nonce'] ) || !wp_verify_nonce( $_POST['kvkoolitus_prices_nonce'],'kvkoolitus_prices_metabox_nonce') )
return;
if ( !current_user_can( 'edit_post', $post_id ))
return;
if ( isset($_POST['kvkoolitus_price']) ) {
update_post_meta($post_id, 'kvkoolitus-price', sanitize_text_field($_POST['kvkoolitus_price']));
}
if ( isset($_POST['kvkoolitus_km']) ) {
update_post_meta($post_id, 'kvkoolitus-km', sanitize_text_field($_POST['kvkoolitus_km']));
} else {
delete_post_meta($post_id, 'kvkoolitus-km');
}
}
add_action('save_post', 'kvkoolitus_prices_save_meta');
