Сохранение данных из нескольких метабоксов флажков в Wordpress

Я учусь добавлять метабоксы к сообщениям. Я хотел бы создать группу метабоксов с вводом текста и несколькими флажками. На данный момент флажки просто ставятся вот так, но в конечном итоге они будут сгенерированы циклом foreach с содержимым из другого места, поэтому для меня важно дать им такие имена, как entry[0], entry[1] и так далее. Они должны быть сохранены в цикле, так как я не знаю, сколько их будет сгенерировано.

Это то, что у меня есть до сих пор:

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

Может ли кто-нибудь помочь мне в этом?


person oneday    schedule 15.02.2017    source источник
comment
просто ваш мета-ключ..... используйте get_post_meta($post_ID, 'your key', true); для получения данных и update_post_meta( $post_id, 'your key', $teachers_names); для их сохранения   -  person Happy Coding    schedule 15.02.2017
comment
Я пытаюсь выяснить, что такое мета-ключ, для первых двух я вижу, что они используют имя поля ввода следующим образом: 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); Не могли бы вы пролить больше света?   -  person oneday    schedule 15.02.2017
comment
update_post_meta( $post_id, 'entry', $teachers_names) этого достаточно   -  person Happy Coding    schedule 15.02.2017
comment
Спасибо, но, к сожалению, до сих пор не сохраняется.   -  person oneday    schedule 15.02.2017


Ответы (2)


Ваш 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>';
}
person Happy Coding    schedule 15.02.2017
comment
Пытаюсь заставить его работать, один вопрос - не должно ли быть $key = 'entry'; вместо key = 'entry'; ? - person oneday; 15.02.2017
comment
Теперь я получаю это предупреждение: Предупреждение: для foreach() указан недопустимый аргумент [...] Я читал здесь, что это происходит, когда вы предоставляете foreach данные, которые не являются массивом: stackoverflow.com/questions/2630013/ - person oneday; 15.02.2017

Хорошо, я обновил свои функции с помощью вашего кода, и теперь это выглядит так:

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 =, иначе выдавало ошибку.

И все равно - никаких изменений... Я вот подумал, что, может быть, он сохраняет данные, но галочки остаются не отмеченными?

person oneday    schedule 15.02.2017