Listado de páginas con casillas de verificación en un Metabox (y guardarlas)

4

Esto es lo que básicamente estoy tratando de lograr:

  1. Tengo un tipo de publicación personalizado llamado 'comillas'
  2. Tengo varias páginas de wordpress

Lo que estoy tratando de hacer es esto: cada vez que creo una nueva publicación de "CITAS", quiero poder elegir en qué página se supone que vaya esta publicación de citas. Decidí hacer esto creando un metabox nuevo en la página de las citas de "citas" y listando en ese metabox todas las páginas, con una casilla de verificación delante de ellas:

Todobienybien,peroahoranosécómoguardarestascasillasdeverificación.

Aquíestálafunciónqueutilizoparaimprimirelcontenidodelmetabox:

functionmyplugin_inner_custom_box($post){$custom=get_post_custom($post->ID);$checkfield=$custom["checkfield"][0];

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 
    $pages = get_pages(); 

    foreach ( $pages as $page ) { ?>   
        <input type="checkbox" name="checkfield_<?php echo $page->ID; ?>" value="yes" <?php if ($checkfield == 'yes') { ?> checked <?php } ?> /> <?php echo $page->post_title; ?> <br>   
    <?php 
    } 
}

Y aquí está la función que utilizo para guardarlos:

//save the meta box action
add_action( 'save_post', 'myplugin_meta_save' );

//save the meta box
function myplugin_meta_save()
{
    global $post;
    update_post_meta($post->ID, 'checkfield', $_POST['checkfield'] );
}

Obviamente esto no funciona, no estoy seguro de cómo guardar todos los valores de los campos de verificación.

    
pregunta Gabriela 31.10.2012 - 11:43

1 respuesta

4

Estás usando checkfield_<?php echo $page->ID; ?> como nombre para tus campos de entrada, luego intentas guardar $_POST['checkfield'] que está no configurado.

Puedes hacer el mismo bucle $pages en la función myplugin_meta_save() y luego guardar los datos para cada página como entrada meta_key separada ( checkfield_1 , checkfield_5 , etc.), O puedes guardar todo eso los datos en un solo meta_key que es checkfield en este caso, y se necesita un pequeño ajuste en su código para lograrlo:

function myplugin_inner_custom_box( $post ) {
    // we store data as an array, we need to unserialize it
    $checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 

    $pages = get_pages(); 
    foreach ( $pages as $page ) { ?>
        <input id="page_<?php echo $page->ID; ?>" type="checkbox" name="checkfield[]" value="<?php echo $page->ID; ?>" <?php if ( in_array($page->ID, (array) $checkfield) ) { ?> checked <?php } ?>/> <label for="page_<?php echo $page->ID; ?>"><?php echo $page->post_title; ?></label> <br>
<?php 
    } 
}
//save the meta box action
add_action( 'save_post', 'myplugin_meta_save', 10, 2 );

//save the meta box
function myplugin_meta_save($post_id, $post)
{   
    if ( isset($_POST['checkfield']) ) { // if we get new data

        update_post_meta($post_id, "checkfield", $_POST['checkfield'] );

    }
}

Tenga en cuenta que name="checkfield" en el campo de entrada se reemplaza con name="checkfield[]" , lo que hará que los datos almacenados como una matriz en la variable $_POST['checkfield'] . También el atributo value se cambia de yes a $page->ID .

Actualización: Cast checkfield a array : if ( in_array($page->ID, (array) $checkfield) )

    
respondido por el Ahmad M 31.10.2012 - 19:51

Lea otras preguntas en las etiquetas