Wordpress自定义文章类型保存无线电输入元


Wordpress custom post type save radio input meta

我在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变量中,您将从中预生成支票。

这就是