2012-12-16 8 views
9

ho il seguente codice che aggiunge un tipo di messaggio personalizzato al cruscotto admin e una meta personalizzato casella per la finestra di messaggio di modifica:L'aggiunta di più meta-box per un tipo di messaggio personalizzato in 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']); 
} 

La mia domanda è se voglio aggiungere un ulteriore meta-box, qual è l'approccio migliore?

Ho provato ad aggiungere un'altra chiamata add_meta_box nella funzione admin_init e ho anche creato una funzione di callback aggiuntiva per questo metatag html ma non è stato generato nulla sul front-end. Qualsiasi suggerimento sarebbe grandioso.

EDIT: Quindi questo è come ho fatto per più di una meta di dialogo (questo funziona):

//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

Si potrebbe anche chiedere questo a http: //wordpress.stackex change.com/ – Joren

+0

Oppure in [codereview.se], poiché questo codice funzionante mira ad essere ottimizzato. – brasofilo

+0

Ho messo la taglia perché da nessuna parte sul web c'è un approccio dinamico a questo problema. Mi chiedevo quale sarebbe la soluzione ottimale che incorpora tutti gli elementi del modulo. – Joren

risposta

3

È possibile aggiungere METABOX al tipo di messaggio personalizzato con codice seguente.

In primo luogo, creare 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' 
    ); 
} 

Avviso, che my_custom_post_type è un nome di voi tipo e my_metabox_render personalizzato post - nome di una funzione che rende METABOX.

funzione di rendering dovrebbe creare tutti i campi nessesary

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 
} 

quanto deve aggiornarvi metadati quando l'utente salva posta

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

Ciao Vladimir. Grazie per la risposta. L'aggiunta di una meta box va bene, ma come faccio ad aggiungere più di una meta-box a un tipo di post personalizzato? Questo è il problema che sto avendo. – BIOS

+0

Chiama la funzione 'add_meta_box' per ogni meta box che vuoi creare. E perché ogni meta-box dovrebbe avere una propria funzione di rendering. – Vladimir

+0

Puoi mostrare il codice che stai cercando di aggiungere diverse meta box? – Vladimir

7

Può essere completamente incapsulato in una classe. Qui, non ho a che fare con l'aggiunta del Custom Post Type, e ci sono solo due semplici campi di output, testo e checkbox. Un codice di lavoro completo deve occuparsi di ciascuno dei tipi di input desiderati.

<?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); 

Questo è solo uno scheletro, da qui c'è molto da scrivere. Alcuni esempi:

+0

Questo è limitato all'input testuale. Questo non funziona se stai lavorando con radio/caselle di controllo, menu a tendina o altri elementi del modulo. La prima parte mi piace, ma mi sembra un po 'troppo ingegnosa. – Joren

+0

@Joren, beh, è ​​solo un contorno. Usare una classe sarebbe più appropriato. La sintonizzazione dipende dall'utente. Non hai inserito una descrizione personalizzata nel bounty, puoi pubblicare un commento nella domanda indicando cosa ti aspetti? – brasofilo

+0

@brasofilo: è possibile usare il tuo 'class'. Posso aggiungere più meta campi in una singola meta-scatola e posso aggiungere anche funzionalità di tabulazione? –

Problemi correlati