2012-12-16 17 views
9

Mam następujący kod, który dodaje niestandardowy typ wiadomości do deski rozdzielczej administratora i pudełko zwyczaj meta do okna po EDIT:Dodawanie wielu meta-pudełka do niestandardowego typu postu w Wordpress

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']); 
} 

moje pytanie czy jeśli chcę dodać dodatkowe pole meta, jakie jest najlepsze podejście?

Próbowałem dodać kolejne wywołanie add_meta_box w funkcji admin_init, a także utworzyłem dodatkową funkcję wywołania zwrotnego dla tego html meta box, ale nic nie zostało wygenerowane na interfejsie. Wszelkie wskazówki byłyby świetne.

EDIT: Tak to jest, jak to zrobiłem na więcej niż jednym polu meta (to działa):

//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']); 
} 
+0

Można też poprosić tego http: //wordpress.stackex change.com/ – Joren

+0

Lub w [codereview.se], ponieważ jest to działający kod, który ma być zoptymalizowany. – brasofilo

+0

Oddałem nagrodę, ponieważ nigdzie w Internecie nie ma dynamicznego podejścia do tego problemu. Zastanawiałem się, jakie jest optymalne rozwiązanie obejmujące wszystkie elementy formy. – Joren

Odpowiedz

3

można dodać do niestandardowego typu METABOX postu z następujących kodu.

Najpierw utwórz METABOX

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' 
    ); 
} 

odnotować, że my_custom_post_type to nazwa was zwyczaj pisać typ i my_metabox_render - nazwa funkcji, która sprawia METABOX.

funkcja renderowania powinien tworzyć wszystkie nessesary pola

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 
} 

Niż należy zaktualizować Ci metadane gdy użytkownik zapisuje po

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'); 
     } 
    } 
} 
+0

Cześć Vladimir. Dzięki za odpowiedzi. Dodanie jednego meta-boxa jest w porządku, ale jak dodać więcej niż jeden meta box do niestandardowego typu postu? To jest kwestia, którą mam. – BIOS

+0

Wywołanie funkcji 'add_meta_box' dla każdego pola meta, które chcesz utworzyć. I dlatego każda meta box powinna mieć własną funkcję renderowania. – Vladimir

+0

Czy możesz pokazać kod, który próbujesz dodać kilka meta-boxów? – Vladimir

7

To może być całkowicie zamknięty w klasie. Tutaj nie mam do czynienia z dodawaniem niestandardowego typu postu, a są tylko dwa proste pola wyjściowe, tekst i pole wyboru. Pełny, działający kod powinien dbać o każdy z pożądanych typów wejścia.

<?php 
/** 
* Plugin Name: Sample Dynamic Meta Boxes 
* Plugin URI: http://stackoverflow.com/q/13903529/1287812 
* Author:  brasofilo 
*/ 
class B5F_Dynamic_Meta_Boxes 
{ 
    private $boxes; 

    # Safe to start up 
    public function __construct($args) 
    { 
     $this->boxes = $args; 
     add_action('plugins_loaded', array($this, 'start_up')); 
    } 

    public function start_up() 
    { 
     add_action('add_meta_boxes', array($this, 'add_mb')); 
    } 

    public function add_mb() 
    { 
     foreach($this->boxes as $box) 
      add_meta_box( 
       $box['id'], 
       $box['title'], 
       array($this, 'mb_callback'), 
       $box['post_type'], 
       isset($box['context']) ? $box['context'] : 'normal', 
       isset($box['priority']) ? $box['priority'] : 'default', 
       $box['args'] 
      ); 
    } 

    # Callback function, uses helper function to print each meta box 
    public function mb_callback($post, $box) 
    { 
     switch($box['args']['field']) 
     { 
      case 'textfield': 
       $this->textfield($box, $post->ID); 
      break; 
      case 'checkbox': 
       $this->checkbox($box, $post->ID); 
      break; 
     } 
    } 

    private function textfield($box, $post_id) 
    { 
     $post_meta = get_post_meta($post_id, $box['id'], true); 
     printf(
      '<label>%s: <input type="text" name="%s" value="%s" /></label> <small>%s</small><br/>', 
      $box['title'], 
      $box['id'], 
      $post_meta, 
      $box['args']['desc'] 
     ); 
    } 

    private function checkbox($box, $post_id) 
    { 
     $post_meta = get_post_meta($post_id, $box['id'], true); 
     printf(
      '<label>%s: </label><input type="checkbox" name="%s" %s /> <small>%s</small><br/>', 
      $box['title'], 
      $box['id'], 
      checked(1, $post_meta, false), 
      $box['args']['desc'] 
     ); 
    } 
} 

# ADD TWO META BOXES - DIFFERENT POST TYPES - DIFFERENT CONTEXTS AND PRIORITIES 
$args = array(
    array(
     'id' => 'teaser_loop', 
     'title' => 'Loop Time', 
     'post_type' => 'post', 
     'args' => array(
      'desc' => 'Enter the time', 
      'field' => 'textfield', 
     ) 
    ), 
    array(
     'id' => 'teaser_link', 
     'title' => 'Loop Link', 
     'post_type' => 'page', 
     'context' => 'side', 
     'priority' => 'high', 
     'args' => array(
      'desc' => 'Open link', 
      'field' => 'checkbox', 
     ) 
    ), 
); 
new B5F_Dynamic_Meta_Boxes($args); 

# ADD ANOTHER META BOX TO ANOTHER POST TYPE 
$more_args = array(
    array(
     'id' => 'extra_box', 
     'title' => 'And another one', 
     'post_type' => 'teaser', 
     'args' => array(
      'desc' => 'Open link', 
      'field' => 'textfield', 
     ) 
    ), 
); 
new B5F_Dynamic_Meta_Boxes($more_args); 

To tylko szkielet, stąd jest wiele do napisania. Kilka przykładów:

+0

Jest to ograniczone do wprowadzania tekstu. To nie działa, jeśli pracujesz z polami radiowymi/czekowymi, menu rozwijanymi lub innymi elementami formularza. Pierwsza część, którą lubię, ale wydaje się nieco przeprojektowana – Joren

+0

@Joren, cóż, to tylko zarys. Korzystanie z klasy byłoby bardziej odpowiednie. Dostrajanie zależy od użytkownika. Nie umieściłeś niestandardowego opisu w bounty, czy możesz umieścić komentarz w pytaniu stwierdzając, czego się spodziewasz? – brasofilo

+0

@brasofilo: Czy jest to możliwe przy użyciu 'class' mogę dodać wiele pól meta w jednym polu meta i czy mogę dodać tam także funkcję tabulatora? –

Powiązane problemy