在Metabox中列出带有复选框的页面(并保存它们)

时间:2012-10-31 作者:Gabriela

以下是我基本上想要实现的目标:

我有一个名为“quotes”的自定义帖子类型,我有许多wordpress页面,我想做的是:每次创建一篇新的“quotes”帖子时,我都希望能够选择该quotes帖子应该放在哪一页上。我决定在“quotes”帖子页面上创建一个新的元框,并在该元框中列出所有页面,前面有一个复选框:

pages listing metabox screenshot

一切都很好,但现在我不知道如何保存这些复选框。

以下是我用来打印metabox内容的函数:

function myplugin_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 
    } 
}
下面是我用来保存它们的函数:

//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\'] );
}
显然,这不起作用-我不知道如何保存所有这些checkfield值。

1 个回复
最合适的回答,由SO网友:Ahmad M 整理而成

您正在使用checkfield_<?php echo $page->ID; ?> 作为输入字段的名称,然后尝试保存$_POST[\'checkfield\'] 未设置。

你也可以这样做$pages 在上循环myplugin_meta_save() 函数,然后将每个页面的数据另存为单独的meta_key 输入(checkfield_1, checkfield_5, 等等),或者您可以在一个meta_key 这是checkfield 在这种情况下,需要对代码进行一些调整以实现这一点:

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

    }
}
请注意name="checkfield" 在输入字段中替换为name="checkfield[]" 这将使数据以数组形式存储在$_POST[\'checkfield\'] 变量还有value 属性更改自yes$page->ID.

更新:强制转换checkfieldarray: if ( in_array($page->ID, (array) $checkfield) )

结束