Понимание и использование метабоксов в сообщениях


Я разрабатываю свою первую тему, которая не зависит от родительской темы, но я сталкиваюсь с некоторыми внутренними проблемами. Я пытаюсь добавить метабокс ко всем публикуемым сообщениям. Этот вопрос довольно широк в том смысле, что он охватывает довольно много функций. Так что, если это предпочтительнее, я разрежу его на куски по нескольким постам на этом сайте. На данный момент я опубликую их как одно целое.

Как уже было сказано, я пытаюсь добавить некоторые поля, в которых авторы могут по желанию заполните дополнительную информацию, например источник, где они нашли большую часть своей информации, и домашнюю страницу контакта с прессой. Основываясь на этом замечательном ответе на предыдущий вопрос, я решил скопировать и отредактировать этот код, и в итоге я получил следующее.

function add_source_metabox(){
    add_meta_box(
        'source_post_metabox', 'Bron', 'output_source_metabox', 'post'
    );
}
add_action('add_meta_boxes', 'add_source_metabox');

function output_source_metabox($post){
    wp_nonce_field('source_post_metabox', 'source_post_metabox_nonce');

    echo '<label for="source_post">';
    echo '<input type="text" id="source_post" name="source_post" value="" style="width: 80%;max-width: 720px;">';
    echo ' Voer hier de bron van je bericht in.</label>';
    echo '<p>Bv. <em>http://tweakers.net/nieuws/101372/ing-belgie-wil-betalingsgedrag-van-klanten-meer-gebruiken-voor-dienstverlening.html</em></p>';

}
function save_source_metabox($post_id){
    /*
     * We need to verify this came from our screen and with proper authorization,
     * because the save_post action can be triggered at other times.
     */

    /** Ensure that a nonce is set */
    if(!isset($_POST['source_post_metabox_nonce'])) :
        return;
    endif;

    /** Ensure that the nonce is valid */
    if(!wp_verify_nonce( $_POST['source_post_metabox_nonce'], 'source_post_metabox')) :
        return;
    endif;

    /** Ensure that an AUTOSAVE is not taking place */
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) :
        return;
    endif;

    /** Ensure that the user has permission to update this option */
    if(!current_user_can('edit_post', $post_id)) :
        return;
    endif;

    // Update and save the field so it can be used in our template

}
add_action('save_post', 'save_source_metabox');

Который выглядит так:

source

Проблема, однако, в том, что при вводе данных в новое поле ввода и последующем сохранении записи поле остается пустым. Я не был по-настоящему удивлен, потому что я не думаю, что Я еще сохранил эти данные - эта часть отсутствует в save_source_metabox. Так что мне все еще нужно: 1. сохранить ввод и знать, как это сделать 2. получить доступ к этим данным из моего шаблона и 3. показать эти данные в поле ввода после сохранения, чтобы пользователь знал, что что-то уже заполнено.

Кроме того, я хочу добавить дополнительное поле (как сказано) в ту же оболочку. Т. е. также под заголовком "Брон". Это поле должно вести себя аналогично приведенному выше: может быть заполнено автором по желанию, и когда он заполнен, я должен иметь возможность воспроизвести его содержимое в шаблоне. Я предполагаю, что могу добавить еще один метабокс в add_source_metabox, но мне понадобится еще один обратный вызов и функция сохранения?

Author: Community, 2015-02-14

1 answers

Чтобы сохранить:

// Update and save the field so it can be used in our template
if ( isset( $_POST['input_name'] ) ) {
    $data = sanitize_text_field( $_POST['input_name'] );
    update_post_meta( $post_id, 'field_name', $data );
}

Читать:

$data = get_post_meta( $post_id, 'field_name', true );
// With post object, a leaner, cleaner method:
$data = $post->field_name;

Нет необходимости регистрировать другой метабокс и писать другой обратный вызов. Просто продублируйте первую партию echo в output_source_metabox() и измените метку и имя.

Чтобы заполнить значение сохраненными данными:

echo '<input ... value="' . esc_attr( get_post_meta( $post_id, 'field_name', true ) ) . '" ... />';

Вам понадобится еще один блок "сохранить" для этого второго поля - просто не забудьте поменять местами input_name для name ввода и field_name для мета-ключа, в котором вы хотите сохранить эти данные.

 2
Author: TheDeadMedic, 2015-02-14 17:00:12