En muchos casos, para facilitar la administración del sitio, especialmente aquellos administrados enteramente por los clientes, vemos la necesidad de utilizar estos custom post types, y además darles sus propios campos personalizados.
Para esto utilizamos los metaboxes, es decir los campos editables en los formularios de publicación de WordPress.
Creando nuestro tipo de contenido
En este caso, vamos a crear el tipo de contenido perro.Para ello, vamos a nuestro archivo functions.php, e insertamos el sigiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // Registramos nuestro tipo de contenido y su taxonomía (el equivalente a la categoría) function aom_registrar_perro() { register_post_type( 'aom_perros' , array ( 'labels' => array ( 'name' => __( 'Perros' ), 'singular_name' => __( 'Perro' ), 'add_new' => __( 'Añadir perro' ), 'add_new_item' => __( 'Añadir perro' ), 'edit_item' => __( 'Editar perro' ), 'new_item' => __( 'Añadir nuevo perro' ), 'view_item' => __( 'Ver perro' ) ), 'public' => true, 'supports' => array ( 'title' , 'editor' , 'thumbnail' ), 'capability_type' => 'post' , 'rewrite' => array ( "slug" => "perros" ), // Formato de permalinks 'menu_position' => 3, 'register_meta_box_cb' => 'aom_crear_metaboxes' ) ); } add_action( 'init' , 'aom_registrar_perro' ); |
Añadiendo un Meta Box
Con la función aom_crear_metaboxes (aom es un prefijo como cualquier otro, pero es recomendable utilizar uno en nuestras funciones y variables de wordpress para poder localizar donde hemos “metido mano” fácilmente, además de evitar conflictos).1 2 3 4 5 | // añadir metaboxes function aom_crear_metaboxes() { add_meta_box( 'aom_perros_color' , 'Color del perro' , 'aom_generar_html_metabox' , 'aom_perros' ); } |
- $id: es el id de html que se aplicará al metabox
- $title: Este es el título que aparecerá encima del metabox
- $callback: Éste es el callback a la función que cargará el html dentro del html.
- $page: es el nombre de nuestro custom post type
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //generando el html para nuestro metabox function aom_generar_html_metabox() { global $post ; // verificar donde se originan los datos echo '<input type="hidden" name="perrometa_noncename" id="perrometa_noncename" value="' . wp_create_nonce( plugin_basename( __FILE__ ) ) . '" />' ; // recoger los datos de "color" si ya han sido grabados anteriormente $lcolor = get_post_meta( $post ->ID, '_color' , true); // mostrar el campo echo "<input type='text' name='_color' value=" . $color . "' />" ; } |
Salvando los datos de nuestro metabox
Con el siguiente código, le estamos diciendo a WordPress que cuando salve un post ejecute la función que guarda nuestros metadatos sobre el color de los perrillos.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // función que guarda los datos function aom_guardar_datos_al_publicar( $post_id , $post ) { // verificamos de donde vienen los datos y si se tienen permisos para editar if ( !wp_verify_nonce( $_POST [ 'perrometa_noncename' ], plugin_basename( __FILE__ ) )) { return $post ->ID; } if ( !current_user_can( 'edit_post' , $post ->ID )) return $post ->ID; // Tras esta comprobación vamos a buscar y recoger los datos en un array $perros_meta [ '_color' ] = $_POST [ '_color' ]; // Añadimos los valores como custom fields foreach ( $perros_meta as $key => $value ) { if ( $post ->post_type == 'revision' ) return ; $value = implode( ',' , ( array ) $value ); if (get_post_meta( $post ->ID, $key , FALSE)) {( $post ->ID, $key , $value ); } else { add_post_meta( $post ->ID, $key , $value ); } if (! $value ) delete_post_meta( $post ->ID, $key ); //si el campo está en blanco, borrarlo en la BBDD } } add_action( 'save_post' , 'aom_guardar_datos_al_publicar' , 1, 2); // save the custom fields |
¿Cómo mostrar nuestro campo?
Para mostrar la metainformación sobre el color de nuestros perros, debemos recoger los metadatos almacenados en el post. Si estamos en el loop, lo podemos hacer de la siguiente manera:1 | <?php echo get_post_meta( $post ->ID, "_color" , true); ?> |
1 2 3 4 | <?php global $post ; get_post_meta( $post ->ID, "_color" , true); ?> |
No hay comentarios:
Publicar un comentario