私はこれで数日間この脳波を打っています、そして私の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'] ) );
}
}
?>
$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
ハンドラは、 さらにチェックが必要です 。