11

カスタム投稿タイプを管理ダッシュに追加し、カスタム メタ ボックスを投稿編集ウィンドウに追加する次のコードがあります。

function teasers_custom_init() {
  $labels = array(
    'name' => 'Teasers',
    'singular_name' => 'Teaser',
    'add_new' => 'Add New',
    'add_new_item' => 'Add New Teasers',
    'edit_item' => 'Edit Teaser',
    'new_item' => 'New Teaser',
    'all_items' => 'All Teasers',
    'view_item' => 'View Teaser',
    'search_items' => 'Search Teasers',
    'not_found' =>  'No teasers found',
    'not_found_in_trash' => 'No teasers found in Trash', 
    'parent_item_colon' => 'Parent Page',
    'menu_name' => 'Teasers'
  );

  $args = array(
    'labels' => $labels,
    'description' => 'set slider panels with loop times',
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array( 'slug' => 'Teasers' ),
    'capability_type' => 'page',
    'has_archive' => true, 
    'hierarchical' => true,
    'menu_position' => 60,
    'supports' => array( 'title', 'thumbnail', 'page-attributes'), 

  ); 

  register_post_type( 'teasers', $args );
}
add_action( 'init', 'teasers_custom_init' );


//adding the meta box when the admin panel initialises
add_action("admin_init", "admin_init");
// this adds the save teaser function on save post
add_action('save_post', 'save_teaser');

function admin_init(){
    add_meta_box('teaser_loop', 'Loop Time', 'loop_meta', 'teasers', 'normal', 'default');
}
// callback function of add meta box that displays the meta box in the post edit screen
function loop_meta($post, $args){

    $teaser_loop = get_post_meta($post->ID, 'teaser_loop', true);

?>
    <label>Teaser Loop: </label><input type="text" name="teaser_loop" value="<?php echo $teaser_loop; ?>" /><br/>

<?php

}

// saving the teaser
function save_teaser(){
    global $post;
    update_post_meta($post->ID, 'teaser_loop', $_POST['teaser_loop']);  
}

私の質問は、追加のメタ ボックスを追加したい場合、最善の方法は何ですか?

admin_init 関数に別の add_meta_box 呼び出しを追加しようとしましたが、このメタ ボックス html の追加のコールバック関数も作成しましたが、フロント エンドでは何も生成されませんでした。どんな指針も素晴らしいでしょう。

編集:だから、これは私が複数のメタボックスに対して行った方法です(これは機能します):

//adding the meta box when the admin panel initialises
    add_action("admin_init", "admin_init");
    // this adds the save teaser function on save post
    add_action('save_post', 'save_teaser');
    function admin_init(){
        add_meta_box('teaser_loop', 'Loop Time', 'loop_meta_1', 'teasers', 'normal', 'default');
        add_meta_box('teaser_link', 'Teaser Link', 'loop_meta_2', 'teasers', 'normal', 'default');
    }
    // back function of add meta box that displays the meta box in the post edit screen
    function loop_meta_1($post, $args){


        $teaser_loop = get_post_meta($post->ID, 'teaser_loop', true);

?>
    <label>Teaser Loop: </label><input type="text" name="teaser_loop" value="<?php echo $teaser_loop; ?>" /><br/>

<?php

}

    function loop_meta_2($post, $args){

        $teaser_link = get_post_meta($post->ID, 'teaser_link', true);

?>
    <label>Teaser Link: </label><input type="text" name="teaser_link" value="<?php echo $teaser_link; ?>" /><br/>

<?php

}

// saving the teaser
function save_teaser(){
    global $post;
    update_post_meta($post->ID, 'teaser_loop', $_POST['teaser_loop']);
    update_post_meta($post->ID, 'teaser_link', $_POST['teaser_link']);
}
4

3 に答える 3

4

次のコードを使用して、メタボックスをカスタム投稿タイプに追加できます。

まず、メタボックスを作成します

add_action('admin_init', 'my_theme_on_admin_init');

function my_theme_on_admin_init() {
    add_meta_box('my_metabox',
        __('My metabox', 'textdomain'),
        'my_metabox_render',
        'my_custom_post_type', 'normal', 'high'
    );
}

my_custom_post_typeこれはカスタム投稿タイプのmy_metabox_render名前であり、メタボックスをレンダリングする関数の名前であることに注意してください。

レンダリング関数はすべての必要なフィールドを作成する必要があります

function my_metabox_render($post) {
    $data = get_post_meta($post->ID, '_meta_key', true);
    // Use nonce for verification
    wp_nonce_field('add_my_meta', 'my_meta_nonce');
?>
<div class="inside">
    <table class="form-table">
        <tr valign="top">
            <th scope="row"><label for="my_meta_value"><?php _e('My meta', 'textdomain'); ?></label></th>
            <td><textarea id="my_meta_value" name="my_meta_value" cols="40" rows="5"><?php echo (isset($data)) ? $data : ''; ?></textarea></td>
        </tr>
    </table>
</div>
<?php
}

ユーザーが投稿を保存するときにメタデータを更新する必要があるよりも

add_action('wp_insert_post', 'save_my_meta', 10, 2);

function save_my_meta($id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return $id;
    if (!current_user_can('edit_posts'))
        return;

    if (!isset($id))
        $id = (int) $_REQUEST['post_ID'];

    if (isset($_POST['my_meta_value']) && wp_verify_nonce($_POST['my_meta_value'], 'add_my_meta')) {
        $data = $_POST['my_meta_value'];
        if (isset($data)) {
            update_post_meta($id, '_meta_key', $data);
        }
        else {
            delete_post_meta($id, '_meta_key');
        }
    }
}
于 2012-12-16T17:48:40.327 に答える