web-dev-qa-db-ja.com

複数のチェックボックス配列でメタボックスを保存する

メタボックスに出力されるチェックボックスの数が固定されていないという要件があります。それが修正されていれば、私は各チェックボックスに名前を付けてupdate_post_meta()を使ってそれを保存することを提案するインターネット上のチュートリアルのどれか一つに従うことができました。

私の場合は、チェックボックスの数が不明なので、配列表記でチェックボックスの名前をname = 'multval[]'にしました。

使い方がわからない。

  1. get_post_meta()
  2. checked()
  3. update_post_meta()

配列として命名されたときにチェックボックスにアクセスすることになると。

コード:

<?php  
add_action( 'add_meta_boxes', function() {
    add_meta_box( 'custom-metabox', 'Select values', 'fill_metabox', 'post', 'normal' );
});

function fill_metabox( $post ) {
    wp_nonce_field( basename(__FILE__), 'mam_nonce' );

    // How to use 'get_post_meta()' for multiple checkboxes as array?

    $elements = get_elements(); //returns an associative array
    foreach ( $elements as $element) {
        ?>

        <p>
            <input 
                type  = "checkbox"
                name  = "multval[]"
                value = <?php echo $element;?>
                //How to use checked() function in case of 
                //multiple checkbox as arrays
            >
            <?php echo $element;?>
        </p>

        <?php
    }
}


add_action( 'save_post', function( $post_id ) {
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'mam_nonce' ] ) && wp_verify_nonce( $_POST[ 'mam_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }

    /*How to run a loop to save values for each checkbox?*/
});
2

次のコードを試してください。

add_action( 'add_meta_boxes', function() {
    add_meta_box( 'custom-metabox', 'Select values', 'fill_metabox', 'post', 'normal' );
});

function fill_metabox( $post ) {
    wp_nonce_field( basename(__FILE__), 'mam_nonce' );

    // How to use 'get_post_meta()' for multiple checkboxes as array?
    $postmeta = maybe_unserialize( get_post_meta( $post->ID, 'elements', true ) );

    // Our associative array here. id = value
    $elements = array(
        'Apple'  => 'Apple',
        'orange' => 'Orange',
        'banana' => 'Banana'
    );

    // Loop through array and make a checkbox for each element
    foreach ( $elements as $id => $element) {

        // If the postmeta for checkboxes exist and 
        // this element is part of saved meta check it.
        if ( is_array( $postmeta ) && in_array( $id, $postmeta ) ) {
            $checked = 'checked="checked"';
        } else {
            $checked = null;
        }
        ?>

        <p>
            <input  type="checkbox" name="multval[]" value="<?php echo $id;?>" <?php echo $checked; ?> />
            <?php echo $element;?>
        </p>

        <?php
    }
}


add_action( 'save_post', function( $post_id ) {
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'mam_nonce' ] ) && wp_verify_nonce( $_POST[ 'mam_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }

    // If the checkbox was not empty, save it as array in post meta
    if ( ! empty( $_POST['multval'] ) ) {
        update_post_meta( $post_id, 'elements', $_POST['multval'] );

    // Otherwise just delete it if its blank value.
    } else {
        delete_post_meta( $post_id, 'elements' );
    }

});
4
Ahmed Fouad