viernes, 3 de junio de 2011

Campos personalizados en Wordpress

WordPress 3.0 ya es CMS en toda regla gracias a nuevas funcionalidades como los menús personalizados, o la que ahora nos ocupa, los custom post types o tipos de contenido personalizados, que le acercan cada vez más a potentes gestores de contenido como Drupal o Plone.
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' );
Mediante el array labels especificamos las etiquetas que usará nuestro interfaz. Con supports especificamos que campos estándar tendrá este tipo de contenido. rewrite configura el formato de los permalinks (fundamental para hacer SEO), y con register_meta_box_cb especificamos con qué función vamos a crear nuestros metaboxes que harán las veces de input y de campo personalizado.

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');
}
La función add_meta_box tiene una larga lista de parámetros que podemos usar. Nosotros hemos utilizado los más básicos, en el siguiente orden:
  • $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  . "'  />";
 
}
Con lo que hemos hecho ya veremos el nuevo metabox en nuestra interfaz de edición, pero los datos que introduzcamos no se guardarán. Como de esta forma no es muy útil, pasamos al siguiente paso…

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); ?>
Ahora bien, si no estamos dentro del loop de WordPress, tendremos que añadir global $post; antes para que wordpress pueda acceder a la información:
1
2
3
4
<?php
global $post;
get_post_meta($post->ID, "_color", true);
?>

No hay comentarios:

Publicar un comentario