Пользовательский тип записи Wordpress сохранить метаданные радиоввода

Я создал пользовательский тип сообщения в плагине 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 );
    }
}

Вы можете видеть, что радиовходы — это только мужские и женские варианты, а затем в нижней части скрипта находится место, где обрабатывается сохранение. Я не могу понять, как сохранить выбор.


person Sam Skirrow    schedule 29.11.2015    source источник


Ответы (1)


Хорошо, во-первых, вы не добавили

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, а не $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 — это значение в метаданных сообщения, которое позже будет извлечено из переменной $value, из которой вы будете выполнять проверку.

Вот и все

person dingo_d    schedule 29.11.2015