Listando páginas com caixas de seleção Em um Metabox (e salvando-as)

4

Eis o que basicamente estou tentando realizar:

  1. Eu tenho um tipo de postagem personalizada chamado 'quotes'
  2. Eu tenho várias páginas de wordpress

O que estou tentando fazer é: cada vez que eu criar um novo post de "QUOTES", eu quero ser capaz de escolher em qual página este post de aspas deve ir. Decidi fazer isso criando um novo metabox na página de postagens "cotações" e listando nesse metabox todas as páginas, com uma caixa de seleção na frente delas:

Tudobemebem,masagoraeunãoseicomosalvaressascaixasdeseleção.

Aquiestáafunçãoqueusoparaimprimiroconteúdodometabox:

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 
    } 
}

E aqui está a função que uso para salvá-los:

//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, isso não funciona - não sei como salvar todos os valores dos campos de verificação.

    
por Gabriela 31.10.2012 / 11:43

1 resposta

4

Você está usando checkfield_<?php echo $page->ID; ?> como nome para seus campos de entrada e, em seguida, tentando salvar $_POST['checkfield'] , que não é definido.

Você pode fazer o mesmo loop $pages na função myplugin_meta_save() e salvar os dados de cada página como separado meta_key input ( checkfield_1 , checkfield_5 , etc) OU você pode salvar tudo isso dados em um único meta_key que é checkfield neste caso, e um pequeno ajuste no seu código é necessário para conseguir isso:

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'] );

    }
}

Observe que name="checkfield" no campo de entrada é substituído por name="checkfield[]" , o que tornará os dados armazenados como uma matriz na variável $_POST['checkfield'] . Além disso, o atributo value foi alterado de yes para $page->ID .

Atualização: conversão de checkfield para array : if ( in_array($page->ID, (array) $checkfield) )

    
por Ahmad M 31.10.2012 / 19:51