在Wordpress中保存来自多个复选框元框的数据

问题描述:

我正在学习如何向帖子添加元框。我想创建一组带有文本输入和多个checbox的metabox。现在,复选框就像这样放在那里,但最终它们将通过带有来自其他地方的内容的foreach循环生成,所以对于我给它们的名称如条目[0],条目[1]等是很重要的。他们必须通过循环来保存,因为我不知道会产生多少。在Wordpress中保存来自多个复选框元框的数据

这是我到目前为止有:

// adding the metaboxes 

    function add_post_reference() { 
     add_meta_box('post-reference', 'Reference', 'referenceCallBack', 'languagecourses', 'side', 'high'); 
    } 
    add_action('add_meta_boxes', 'add_post_reference'); 

    // callback function 

    function referenceCallBack($post) { 
     wp_nonce_field('reference_meta_box', 'reference_nonce'); 

     $name_value = get_post_meta($post->ID, '_post_reference_name', true); 
     $link_value = get_post_meta($post->ID, '_post_reference_link', true); 

试图做上面一样与我的复选框,但我不知道要放什么东西有:

 $teachers_value = get_post_meta($post->ID, 'what do I put here?', true); // what do I put here? 

呼应HTML结构现在(文本输入工作(值得到保存),我想弄清楚如何使复选框保存以及:

 echo '<label for="reference-name">'. 'Reference Name' .'</label>'; 
     echo '<input type="text" id="reference-name" name="post_reference_name" placeholder="Example" value="'.$name_value.'" size="25"/>'; 
     echo '<p class="howto">'. 'Add the name of the reference' .'</p>'; 

     echo '<label for="reference-link">'. 'Reference Link' .'</label>'; 
     echo '<input type="text" id="reference-link" name="post_reference_link" placeholder="http://www.example.com/" value="'.$link_value.'" size="25"/>'; 
     echo '<p class="howto">'. 'Add the link of the reference' .'</p>'; 

     // my checkboxes 

     echo '<input type="checkbox" name="entry[0]" value="moredata">'; 
     echo '<input type="checkbox" name="entry[1]" value="moredata">'; 
     echo '<input type="checkbox" name="entry[2]" value="moredata">'; 
     echo '<input type="checkbox" name="entry[3]" value="moredata">'; 
     echo '<input type="checkbox" name="entry[4]" value="moredata">'; 



    } 

    function save_post_reference($post_id) { 
     if (! current_user_can('edit_post', $post_id)) { 
      return; 
     } 

     if (! isset($_POST['reference_nonce'])) { 
      return; 
     } 
     if (! wp_verify_nonce($_POST['reference_nonce'], 'reference_meta_box')) { 
      return; 
     } 

     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { 
      return; 
     } 

     if (! isset($_POST['post_reference_name']) || ! isset($_POST['post_reference_link'])) { 
      return; 
     } 

     $reference_name = sanitize_text_field($_POST['post_reference_name']); 
     $reference_link = sanitize_text_field($_POST['post_reference_link']); 

     // looping through the checkboxes 

     for ($i = 0; $i < 5; $i++) { 
      $teachers_names = sanitize_text_field($_POST['entry'][$i]); 
     } 

     update_post_meta($post_id, '_post_reference_name', $reference_name); 
     update_post_meta($post_id, '_post_reference_link', $reference_link); 

再次,我在这里放什么?

 update_post_meta($post_id, 'whatdoIputhere?', $teachers_names); // what do I put here? 

    } 

    add_action('save_post', 'save_post_reference'); 

请问有人能帮我吗?

+0

简单你的元键......使用'get_post_meta($ post_ID,'your key',true);'获取数据和'update_post_meta($ post_id,'your key',$ teachers_names);'to保存它 –

+0

我想弄清楚到底什么是元键,前两个我看到他们使用的输入字段的名称是这样的: 'update_post_meta($ post_id,'_post_reference_name',$ reference_name); update_post_meta($ post_id,'_post_reference_link',$ reference_link);' 所以我把'entry []'放在这里,但它不保存。 'update_post_meta($ post_id,'entry []',$ teachers_names); ' 你能否在这里摆脱一些光? – oneday

+0

'update_post_meta($ post_id,'entry',$ teachers_names)'This is sufficient –

你的HTML代码应该是这样的:

echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 

现在你将保存数据:

key = 'entry'; 
$values_to_save = array(); 
$new_values = $_POST['entry']; 
$existing_values = get_post_meta($post_id, $key, true) ; 

if(!empty($existing_values)){ 
    foreach((array) $existing_values as $existing_value){ 
     $values_to_save[] = $existing_value; 
    } 
} 


if(!empty($new_values)){ 
    foreach((array) $new_values as $new_value){ 
     $values_to_save[] = $new_value ; 
    } 
} 

update_post_meta($post_id, $key, $values_to_save); 

我们获取数据使用下面的代码:

$key = 'entry'; 
$values = get_post_meta($post_id, $key, true); 

foreach((array) $values as $value){ 
    echo $value . '<br>'; 
} 
+0

试图让它工作,一个问题 - 不应该是'$ key ='entry';'而不是'key ='entry';'? – oneday

+0

我现在得到这个警告:警告:为foreach()提供的无效参数在[...] 我在这里读到,发生这种情况时,您提供的数据不是数组的foreach:http://*.com/questions/2630013/invalid-argument-supplied-for-foreach – oneday

+0

更新了答案... –

好,我用你的代码更新了我的功能,现在看起来如此:

function add_post_reference() { 
    add_meta_box('post-reference', 'Reference', 'referenceCallBack', 'languagecourses', 'side', 'high'); 
} 
add_action('add_meta_boxes', 'add_post_reference'); 

// callback 

function referenceCallBack($post) { 
    wp_nonce_field('reference_meta_box', 'reference_nonce'); 

    $name_value = get_post_meta($post->ID, '_post_reference_name', true); 
    $link_value = get_post_meta($post->ID, '_post_reference_link', true); 

    $key = 'entry'; 
    $values = get_post_meta($post_id, $key, true); 

    foreach((array) $values as $value){ 
     echo $value . '<br>'; 
    } 

    echo '<label for="reference-name">'. 'Reference Name' .'</label>'; 
    echo '<input type="text" id="reference-name" name="post_reference_name" placeholder="Example" value="'.$name_value.'" size="25"/>'; 
    echo '<p class="howto">'. 'Add the name of the reference' .'</p>'; 

    echo '<label for="reference-link">'. 'Reference Link' .'</label>'; 
    echo '<input type="text" id="reference-link" name="post_reference_link" placeholder="http://www.example.com/" value="'.$link_value.'" size="25"/>'; 
    echo '<p class="howto">'. 'Add the link of the reference' .'</p>'; 

    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
    echo '<input type="checkbox" name="entry[]" value="moredata">'; 
} 

function save_post_reference($post_id) { 
    if (! current_user_can('edit_post', $post_id)) { 
     return; 
    } 

    if (! isset($_POST['reference_nonce'])) { 
     return; 
    } 
    if (! wp_verify_nonce($_POST['reference_nonce'], 'reference_meta_box')) { 
     return; 
    } 

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { 
     return; 
    } 

    if (! isset($_POST['post_reference_name']) || ! isset($_POST['post_reference_link'])) { 
     return; 
    } 

    $reference_name = sanitize_text_field($_POST['post_reference_name']); 
    $reference_link = sanitize_text_field($_POST['post_reference_link']); 

    $key = 'entry'; 
    $values_to_save = array(); 
    $new_values = $_POST['entry']; 
    $existing_values = get_post_meta($post_id, $key, true) ; 

    if(!empty($existing_values)){ 
     foreach((array) $existing_values as $existing_value){ 
      $values_to_save[] = $existing_value; 
     } 
    } 

    if(!empty($new_values)){ 
     foreach((array) $new_values as $new_value){ 
      $values_to_save[] = $new_value ; 
     } 
    } 

    update_post_meta($post_id, $key, $values_to_save); 

    update_post_meta($post_id, '_post_reference_name', $reference_name); 
    update_post_meta($post_id, '_post_reference_link', $reference_link); 
} 

add_action('save_post', 'save_post_reference'); 

我改变的一件事是,key =$key =,否则它会抛出一个错误。

仍然 - 没有改变......我想过的一件事情是,它可以保存数据,但复选框仍未选中?