それで、私はメタボックスをいくつか持っていましたが、それらはラベル付けが不十分(meta_1
、meta_2
)で、メンテナンスのために理解しやすくするためにそれらの名前を変更することにしました。
他のユーザーがメタボックスをどのように開発しているのかを見てみると、私はこの作成スタイルを見つけました。
// Review field array
$prefix_review = 'meta_review_';
$meta_review_information_array = array(
array(
'label' => 'Single checkbox',
'id' => $prefix_review . 'checkbox',
'class' => '',
'type' => 'checkbox'
),
array(
'label'=> 'Number input',
'desc' => '',
'id' => $prefix_review . 'number',
'class' => '',
'min' => '1900',
'max' => '2100',
'step' => '1',
'type' => 'number'
),
array(
'label' => 'Text input',
'desc' => '',
'id' => $prefix_review . 'text',
'class' => '',
'type' => 'text'
),
array (
'label' => 'Checkbox group',
'desc' => '',
'id' => $prefix_review . 'checkboxes',
'class' => '',
'type' => 'checkbox_group',
'options' => array (
'one' => array ( 'label' => 'Label one', 'value' => 'one' ),
'two' => array ( 'label' => 'Label two', 'value' => 'two' ),
'three' => array ( 'label' => 'Label three', 'value' => 'three' )
)
),
array (
'label' => 'Dropdown',
'desc' => '',
'id' => $prefix_review . 'dropdown',
'class' => '',
'type' => 'select',
'options' => array (
'one' => array ( 'label' => 'Label one', 'value' => 'one' ),
'two' => array ( 'label' => 'Label two', 'value' => 'two' )
)
),
)
// Project field array
$prefix_project = 'meta_project_';
$meta_project_information_array = array(
array(
'label' => 'Single checkbox',
'id' => $prefix_project . 'checkbox',
'class' => '',
'type' => 'checkbox'
),
array(
'label'=> 'Number input',
'desc' => '',
'id' => $prefix_project . 'number',
'class' => '',
'min' => '1900',
'max' => '2100',
'step' => '1',
'type' => 'number'
),
array(
'label' => 'Text input',
'desc' => '',
'id' => $prefix_project . 'text',
'class' => '',
'type' => 'text'
),
array (
'label' => 'Checkbox group',
'desc' => '',
'id' => $prefix_project . 'checkboxes',
'class' => '',
'type' => 'checkbox_group',
'options' => array (
'one' => array ( 'label' => 'Label one', 'value' => 'one' ),
'two' => array ( 'label' => 'Label two', 'value' => 'two' ),
'three' => array ( 'label' => 'Label three', 'value' => 'three' )
)
),
array (
'label' => 'Dropdown',
'desc' => '',
'id' => $prefix_project . 'dropdown',
'class' => '',
'type' => 'select',
'options' => array (
'one' => array ( 'label' => 'Label one', 'value' => 'one' ),
'two' => array ( 'label' => 'Label two', 'value' => 'two' )
)
),
)
そして、メタボックスへの出力は、$switch['type']
とそれに続く配列クラス(例えば$meta_project_information_array
)のループをたどるのが簡単です。
しかし、それを保存しようとすると、困惑します。
まずはじめに
add_action('save_post', '_save_metabox');
// Save the Data
function _save_metabox( $post_id ) {
global $meta_review_information_array, $meta_project_information_array;
// check autosave
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// check permissions
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id))
return $post_id;
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
// Loop and save : review
foreach( $meta_review_information_array as $meta_review_info ) {
$meta_review_info_old = get_post_meta($post_id, $meta_review_info['id'], true);
$meta_review_info_new = $_POST[$field_1['id']];
if( $meta_review_info_new && $meta_review_info_new != $meta_review_info_old ) {
update_post_meta( $post_id, $meta_review_info['id'], $meta_review_info_new );
} elseif( '' == $meta_review_info_new && $meta_review_info_old ) {
delete_post_meta($post_id, $meta_review_info['id'], $meta_review_info_old);
}
}
// Loop and save: project
foreach( $meta_project_information_array as $meta_project_info ) {
$meta_project_info_old = get_post_meta($post_id, $meta_project_info['id'], true);
$meta_project_info_new = $_POST[$field_1['id']];
if( $meta_project_info_new && $meta_project_info_new != $meta_project_info_old ) {
update_post_meta( $post_id, $meta_project_info['id'], $meta_project_info_new );
} elseif( '' == $meta_project_info_new && $meta_project_info_old ) {
delete_post_meta($post_id, $meta_project_info['id'], $meta_project_info_old);
}
}
}
私の質問は次のとおりです。1.データを入力するときに上記の値が保存されないのはなぜですか。 2.保存セクションにナンスを追加するにはどうすればいいですか。各メタボックスは別々のナンスを持っていますか、それともすべて同じですか?一部のCPTには複数のメタボックスがあります。これについてもっと良い方法はありますか?
現時点で私は3つのphpファイルを持っています:
admin_column.php //this is the admin columns in the CPT
metabox.php //which has all the $types for the many metaboxes and the <table>
save_metabox.php //which is the saving of the metabox
There are different ways of saving the metaboxes.
for e.g. you can create 2 files
1) test-spec.php
2) test-meta.php
Test-spec.phpファイル内
<?php
//DEFINE VARIABLE TO STORE THE METABOX
$content_test_meta = new WPAlchemy_MetaBox(array
(
'id' => '_content_test_meta', //UNIQUE ID FOR THIS META BOX
'types' => array('post'), //LIMIT TO ONLY SHOW ON Default POST TYPE
'template' => get_stylesheet_directory() . '/metaboxes/test-meta.php' //WHERE THE METABOX TEMPLATE IS FOR THIS METABOX
));
?>
Test-meta.phpファイル内
テキストフィールドを保存したいとします。
<?php global $wpalchemy_media_access; ?>
<div class="my_meta_control metabox">
<label>Text Box</label>
<?php $metabox->the_field('text_box'); /* SET THE FIELD ID */ ?>
<p><input type="text" name="<?php $metabox->the_name(); /* SET THE INPUT NAME TO THE FIELD ID */ ?>" value="<?php $metabox->the_value(); /* SET THE INPUT VALUE TO THE FIELD VALUE */ ?>" class="wp-editor-area" /></p>
</div>