J'ai le code suivant qui ajoute un type de poteau personnalisé au DASH ADMIN et une méta-boîte personnalisée dans la fenêtre PUT EDIT:
//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']); }
3 Réponses :
Vous pouvez ajouter du métabox au type de poste personnalisé avec le code suivant.
premier, créez le métabox p> avis, que La fonction de rendu doit créer tous les champs de rendu p> que vous devriez vous mettre à jour des métadonnées lorsque l'utilisateur enregistre POST P> my_custom_post_type est un Nom de votre type de message personnalisé et
My_Metabox_Render Code> - Nom d'une fonction qui rend le métabox. p>
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');
}
}
}
Salut Vladimir. Merci pour la réponse. Ajout d'une méta-boîte va bien mais comment puis-je ajouter plus d'une méta-boîte à un type de poste personnalisé? C'est la question que j'ai d'avoir.
Call add_meta_box code> fonction pour chaque méta-boîte que vous souhaitez créer. Et de cause chaque méta-boîte devrait avoir sa propre fonction de rendu.
Pourriez-vous montrer le code que vous essayez d'ajouter plusieurs méta-boîtes?
Ajout de code pour ajouter deux et cela fonctionne maintenant. Je ne sais pas si c'est le meilleur moyen mais travaille pour moi.
Il peut être complètement encapsulé dans une classe. Ici, je ne traite pas d'ajouter le type de post personnalisé et il n'y a que deux champs de sortie simples, un texte et une case à cocher. Un code de travail complet doit s'occuper de chacun des types d'entrée souhaités.
<?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 );
My WordPress Meta Box Classe P> Li>
Plugin Meta Box P> Li> ul> p>
Ceci est limité à l'entrée textuelle. Cela ne fonctionne pas si vous travaillez avec des boîtes radio / cocher, des menus déroulants ou d'autres éléments de formulaire. La première partie que j'aime comme tho, mais semble un peu excentrée
@Joren, eh bien, c'est juste un contour. L'utilisation d'une classe serait plus appropriée. Ajuster la réglage, il appartient à l'utilisateur. Vous n'avez pas mis de description personnalisée dans la prime, pouvez-vous poster un commentaire dans la question indiquant ce que vous attendez?
@Brasofilo: Est-il possible d'utiliser votre code> code> Je peux ajouter plusieurs champs méta dans une seule méta-boîte et ajouter une fonctionnalité d'onglets là-bas?
@ Mayeenulislam, vous pouvez adapter les éléments suivants: pt.stackoverflow.com/a/10564/201
est-ce une manière très inappropriée d'ajouter 2 métaboxes? Cela fonctionne mais je pense que cela peut être inefficace Code / PHP. Original a été publié sur https://typerocket.com
// Add form and basic text field function press_meta_box(WP_Post $post) { add_meta_box('press_meta', 'Press Release Date', function() use ($post) { $field_name = 'press_date'; $field_name2 = 'press_link'; $field_value = get_post_meta($post->ID, $field_name, true); $field_value2 = get_post_meta($post->ID, $field_name2, true); wp_nonce_field('study_nonce', 'study_nonce'); ?> <table class="form-table"> <tr> <th> <label for="<?php echo $field_name; ?>">Press Release Date (MM/DD/YYYY)</label></th> <td> <input id="<?php echo $field_name; ?>" name="<?php echo $field_name; ?>" type="text" value="<?php echo esc_attr($field_value); ?>" /> </td> </tr> <tr> <th> <label for="<?php echo $field_name2; ?>">Full link to pdf</label></th> <td> <input id="<?php echo $field_name2; ?>" name="<?php echo $field_name2; ?>" type="text" value="<?php echo esc_attr($field_value2); ?>" /> </td> </tr> </table> <?php }); } // Check for empty string allowing for a value of `0` function empty_str( $str ) { return ! isset( $str ) || $str === ""; } // Save and delete meta but not when restoring a revision add_action('save_post', function($post_id){ $post = get_post($post_id); $is_revision = wp_is_post_revision($post_id); $field_name = 'press_date'; $field_name2 = 'press_link'; // Do not save meta for a revision or on autosave if ( $post->post_type != 'press_release' || $is_revision ) return; // Do not save meta if fields are not present, // like during a restore. if( !isset($_POST[$field_name]) ) return; // Secure with nonce field check if( ! check_admin_referer('study_nonce', 'study_nonce') ) return; // Clean up data $field_value = trim($_POST[$field_name]); $field_value2 = trim($_POST[$field_name2]); // Do the saving and deleting if( ! empty_str( $field_value ) ) { update_post_meta($post_id, $field_name, $field_value); } elseif( empty_str( $field_value ) ) { delete_post_meta($post_id, $field_name); } // Do the saving and deleting 2 if( ! empty_str( $field_value2 ) ) { update_post_meta($post_id, $field_name2, $field_value2); } elseif( empty_str( $field_value2 ) ) { delete_post_meta($post_id, $field_name2); } });
Vous pouvez également poser cette question à wordpress.stackexchange.com
Ou à évaluation de code , car il s'agit de code de travail visant à être optimisé.
J'ai mis la prime parce que nulle part sur le Web est une approche dynamique de ce problème. Je me demandais quelle est la solution optimale qui incorpore tous les éléments de forme.
Génial, c'est ce que je cherchais. Merci!