web-dev-qa-db-ja.com

カスタム投稿タイプのメタデータ値としてメタボックスのドロップダウンメニューから選択したアイテムを保存する

私はこれで数日間この脳波を打っています、そして私のGoogle-fuは私に失敗しています。

カスタム分類からのすべての用語を一覧表示するドロップダウンメニューを持つカスタムメタボックスを作成しました。 理解できないのは、投稿が保存されたときにドロップダウンメニューから選択されたオプションを保存する方法です。 PHPそしてこれをどうやるかについて話すたくさんのチュートリアルや他の質問を見つけましたが、彼らがデータを保存することに関する部分にたどり着くとき私はいつも困惑します。

これがメタボックスを作成するための私のコードです。

<?php
function MC_Catalog_create() {
    add_meta_box( 'MC_Catalog_meta', 'Course Information', 'MC_Catalog_course_info','mc_course_post', 'normal', 'high' );
}

function MC_Catalog_course_info( $post ) {

$MC_Catalog_course_area = get_post_meta( $post->ID, '_MC_Catalog_course_area', true );
$MC_Catalog_course_num = get_post_meta( $post->ID, '_MC_Catalog_course_num', true );
$MC_Catalog_course_name = get_post_meta( $post->ID, '_MC_Catalog_course_name', true );
$MC_Catalog_course_desc = get_post_meta( $post->ID, '_MC_Catalog_course_desc', true );

?>
<table class="form-table" style="width:auto;">
    <tr>
        <td valign="top">Course Area:</td>
        <td valign="top">
        <select name="MC_Catalog_course_area">
           <?php 
           $myterms = get_terms('course_areas', $args);
                $args = array('orderby'=>'name','order'=>'ASC','hide_empty'=>false);
            foreach($myterms as $term){
                echo "<option value='$term->term_id'" . selected( $term->term_id, $MC_Catalog_course_area, false) .">" . esc_html( $term->name ) . "</option>";
            }
            ?>
        </select>
        </td>
    </tr>
    <tr>
        <td valign="top">Course Number:</td>
        <td valign="top"><input name="MC_Catalog_course_num" type="text" value="<?php echo esc_attr( $MC_Catalog_course_num ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Title:</td>
        <td valign="top"><input type="text" name="MC_Catalog_course_name" value="<?php echo esc_attr( $MC_Catalog_course_name ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Description:</td>
        <td valign="top"><textarea name="MC_Catalog_course_desc" rows="8" cols="100"><?php echo esc_attr( $MC_Catalog_course_desc ); ?></textarea></td>
    </tr>
</table>
<?php } ?>

そして、これがメタデータを保存するための私のコードです:

//hook to save the meta box data
add_action( 'save_post', 'MC_Catalog_save_meta' );

function MC_Catalog_save_meta( $post_id ) {

    //verify the meta data is set
    if ( isset( $_POST['MC_Catalog_course_num'] ) ) {

        //save the meta data
        update_post_meta( $post_id, '_MC_Catalog_course_area', strip_tags( $_POST['MC_Catalog_course_area'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_num', strip_tags( $_POST['MC_Catalog_course_num'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_name', strip_tags( $_POST['MC_Catalog_course_name'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_desc', strip_tags( $_POST['MC_Catalog_course_desc'] ) );
    }
}
?>
1
Burgon

$myterms = get_terms($taxonomies, $args);はtermオブジェクトの配列を返します。 optionの値として$term->term_idを使用する…

"<option value='$term->term_id'>". esc_html( $term_name ) . "</option>"

…そして名前ではなくそのIDを保存してください。名前が変更されても、IDは同じままです - 誰かが用語を削除して同じ名前の新しいものを作成しない限り。

正しいオプションを選択するにはselected()を使います。

"<option value='$term->term_id'" . selected( $term->term_id, $MC_Catalog_course_area, FALSE ) .">"

absint() thenで値を検証できます。

あなたのsave_postハンドラは、 さらにチェックが必要です

1
fuxia