web-dev-qa-db-ja.com

投稿内のメタボックスの理解と使用

私は親のテーマに依存しない最初のテーマを開発していますが、いくつかのバックエンドの問題に直面しています。私は書かれているすべての記事にメタボックスを追加しようとしています。この質問は、非常に多くの機能を網羅しているという点で非常に広範です。それでそれが好まれるならば、私はこのサイトの複数の投稿にまたがってバラバラにそれを切り刻むでしょう。当分の間、私はそれらを一つにまとめて投稿します。

前述したように、著者がオプションで追加情報を入力できるフィールドを追加しようとしています。例えば、彼らが自分の情報の大部分を見つけた情報源やプレスコンタクトのホームページです。前の質問に対する この素晴らしい答え に基づいて、私はそのコードをコピー編集することにしました、そして、私は以下で終わりました。

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.入力を保存し、テンプレートからそのデータにアクセスする方法を知っていること、3.保存後に入力フィールドにそのデータを表示して、ユーザーが何かがすでに入力されていることを認識できるようにすること。

さらに、同じラッパーに(前述のように)追加のフィールドを追加したいと思います。すなわち見出し「Bron」の下にもあります。このフィールドは上のものと同じように振る舞うべきです:作者によって任意に記入されることができます、そしてそれが記入されるとき私はテンプレートの内容をエコーすることができるべきです。 add_source_metaboxに別のメタボックスを追加できると思いますが、別のコールバックと保存機能が必要ですか?

1
Bram Vanroy

保存する:

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

この2番目のフィールドには別の "save"ブロックが必要です - input_nameを入力のnameに、field_nameをこのデータを保存したいメタキーに必ず入れ替えてください。

2
TheDeadMedic