我在wordpress插件中创建了一个自定义的帖子类型。在自定义帖子类型中,有一些自定义元框-在我的自定义元框中,我有一个单选输入。
我遇到的问题是将此无线电输入的选择保存到数据库中。每当我点击保存时,它就会忘记选择。
这是我的元盒代码:
function render_meta_boxes( $post ) {
$meta = get_post_custom( $post->ID );
$name = ! isset( $meta['singer_name'][0] ) ? '' : $meta['singer_name'][0];
$tagline = ! isset( $meta['singer_tagline'][0] ) ? '' : $meta['singer_tagline'][0];
$bio = ! isset( $meta['singer_bio'][0] ) ? '' : $meta['singer_bio'][0];
$gender = ! isset( $meta['singer_gender'][0] ) ? '' : $meta['singer_gender'][0];
wp_nonce_field( basename( __FILE__ ), 'singer_profile' );
?>
<table class="form-table">
<tr>
<td class="singers_meta_box_td" colspan="2">
<label for="singer_name"><?php _e( 'Singer Name', 'singers_post_type' ); ?>
</label>
</td>
<td colspan="4">
<input type="text" name="singer_name" class="regular-text" value="<?php echo $name; ?>">
</td>
</tr>
<tr>
<td class="singers_meta_box_td" colspan="2">
<label for="singer_tagline"><?php _e( 'Singer Tagline', 'singers_post_type' ); ?>
</label>
</td>
<td colspan="4">
<input type="text" name="singer_tagline" class="regular-text" value="<?php echo $tagline; ?>">
</td>
</tr>
<tr>
<td class="singers_meta_box_td" colspan="2">
<label for="singer_bio"><?php _e( 'Singer Bio', 'singers_post_type' ); ?>
</label>
</td>
<td colspan="4">
<textarea rows="10" style="width:25em;" name="singer_bio" class="regular-text"><?php echo $bio; ?></textarea>
</td>
</tr>
<tr>
<td class="singers_meta_box_td" colspan="2">
<label for="singer_gender"><?php _e( 'Gender', 'singers_post_type' ); ?>
</label>
</td>
<td colspan="4">
<input type="radio" name="singer_gender" value="male"> Male<br>
<input type="radio" name="singer_gender" value="female"> Female
</td>
</tr>
</table>
<?php }
/**
* Save metaboxes
*
* @since 0.1.0
*/
function save_meta_boxes( $post_id ) {
global $post;
// Verify nonce
if ( !isset( $_POST['singer_profile'] ) || !wp_verify_nonce( $_POST['singer_profile'], basename(__FILE__) ) ) {
return $post_id;
}
// Check Autosave
if ( (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || ( defined('DOING_AJAX') && DOING_AJAX) || isset($_REQUEST['bulk_edit']) ) {
return $post_id;
}
// Don't save if only a revision
if ( isset( $post->post_type ) && $post->post_type == 'revision' ) {
return $post_id;
}
// Check permissions
if ( !current_user_can( 'edit_post', $post->ID ) ) {
return $post_id;
}
$meta['singer_name'] = ( isset( $_POST['singer_name'] ) ? esc_textarea( $_POST['singer_name'] ) : '' );
$meta['singer_bio'] = ( isset( $_POST['singer_bio'] ) ? esc_textarea( $_POST['singer_bio'] ) : '' );
$meta['singer_tagline'] = ( isset( $_POST['singer_tagline'] ) ? esc_textarea( $_POST['singer_tagline'] ) : '' );
$meta['singer_gender'] = ( isset( $_POST['singer_gender'] ) ? sanitize_html_class( $_POST['singer_gender'] ) : '' );
foreach ( $meta as $key => $value ) {
update_post_meta( $post->ID, $key, $value );
}
}
您可以看到无线电输入只是男性和女性选项,然后在脚本的底部是处理保存的地方。不过,我不知道如何做出选择。
好的,所以首先你没有添加
add_action('save_post', 'save_meta_boxes');
但我假设你有,因为其他选项(通过你的帐户)应该保存。
接下来,我会在代谢盒中这样写我的变量:
$meta = get_post_custom( $post->ID );
$name = (isset($meta['singer_name'][0]) && $meta['singer_name'][0] != '') ? $meta['singer_name'][0] : '';
$tagline = (isset($meta['singer_tagline'][0]) && $meta['singer_tagline'][0] != '') ? $meta['singer_tagline'][0] : '';
$bio = (isset($meta['singer_bio'][0]) && $meta['singer_bio'][0] != '') ? $meta['singer_bio'][0] : '';
$gender = (isset($meta['singer_gender'][0]) && $meta['singer_gender'][0] != '') ? $meta['singer_gender'][0] : '';
我觉得它更简单。
您需要的是从数据库中提取一个值,以查看您的单选选项(复选框也是如此)是否被选中/选中。因此,在您的render_meta_boxes()
函数中,在自定义变量后添加:
$value = get_post_meta( $post->ID, 'gender-select', true );
现在你的无线电输入必须看起来像
<td colspan="4">
<input type="radio" name="singer_gender" value="male" <?php checked( $value, 'male' ); ?>> Male<br>
<input type="radio" name="singer_gender" value="female" <?php checked( $value, 'female' ); ?>> Female
</td>
在这里,你将检查post-meta中的值是男性还是女性,然后根据这个值检查单选按钮。
最后但同样重要的是,保存函数应该有一个$post
作为参数,而不是$post_id
:
function save_meta_boxes( $post ) {
global $post;
$post_id = $post->ID;
...
}
您应该从保存框中删除$meta['singer_gender']
,因为这不会起任何作用。改为使用:
$gender_meta_value = ( isset( $_POST['singer_gender'] ) ? sanitize_html_class( $_POST['singer_gender'] ) : '' );
update_post_meta( $post_id, 'gender-select', $gender_meta_value );
您的gender-select
是post-meta中的值,该值稍后将被拉入$value
变量中,您将从中预生成支票。
这就是