2017-02-15 65 views
1

我正在學習如何向帖子添加元框。我想創建一組帶有文本輸入和多個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 –

回答

0

你的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://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach – oneday

+0

更新了答案... –

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 =,否則它會拋出一個錯誤。

仍然 - 沒有改變......我想過的一件事情是,它可以保存數據,但複選框仍未選中?