2017-02-15 3 views
1

投稿にメタボックスを追加する方法を学習しています。私はテキスト入力と複数のchecboxesを持つ代謝物のグループを作りたいと思います。今のところ、チェックボックスはそのように置かれていますが、最終的には別の場所からのコンテンツでforeachループによって生成されるため、entry [0]、entry [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'); 

誰でもお手伝いできますか?

あなたのHTMLコードは次のようにする必要があります
+0

シンプルなメタキーを使用します。 'get_post_meta($ post_ID、'あなたのキー '、真); 'データを取得し、' update_post_meta($ post_id、'あなたのキー '、$ teachers_names); 'それを保存してください –

+0

私は正確に何がメタキーであるかを理解しようとしています。最初の2つは、次のような入力フィールドの名前を使用しています: '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、 'entry []'、$ teachers_names); ' ここにもっと光を当ててください。 – oneday

+0

'update_post_meta($ post_id、 'entries'、$ teachers_names)'これで十分です –

答えて

0

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 = get_post_meta($post_id, $key, true); 

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

それを動かそうとすると、1つの質問 - 'key =' entry ';'の代わりに '$ key = 'entry'; – oneday

+0

私は今この警告を受け取ります:警告:無効な引数foreach()で提供された[...] これは、配列ではないデータをforeachに渡したときに発生します:http://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach – oneday

+0

答えを更新しました。 –

0

OK:データをフェッチするために今すぐ

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

は、以下のコードを使用します私のコードを使って関数を更新しました。これは現在の外観です:

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

私が変更したことの1つは、key =から$key =です。それ以外はエラーが発生していました。

まだ変更はありません...私が考えたことは、データを保存している可能性がありますが、チェックボックスはチェックされないままですか?

関連する問題