Convertir campos personalizados en estándar en la interfaz de administración
He añadido varios custom_post_types
a mi instalación de WordPress 3. Todos son un poco diferentes entre sí y deben almacenar información única en custom_fields
. Pero mientras uno puede almacenar un product_id
, otro no. Uno tendrá un source_url
y otro no. En lugar de tener que instruir a mis editores sobre qué campos personalizados deben usarse con qué posts personalizados, ¿cómo puedo hacer que cada post personalizado incluya sus campos personalizados como parte de la UI misma?
Si visitas "daily_cartoon" tendrías una pantalla que solo solicita un título, subtítulo y media.
Si visitas "daily_product" tendrías una pantalla que solo solicita un título, precio, resumen, etc.

Puedes agregar meta_boxes para tener los datos de campos personalizados almacenados en ellos. Dado que add_meta_box puede configurarse según el post_type, esto te permitirá agregar diferentes meta_box a diferentes tipos de contenido.
Revisa esta publicación para ver un ejemplo completo de cómo modificar la pantalla de nuevo/edición de un tipo de contenido personalizado.

Hola @Jonathan Sampson:
Existen varios plugins para facilitar la creación de Custom Post Types y algunos permiten definir Custom Fields también, sin un orden en particular:
Como mencioné anteriormente, he estado trabajando en uno que no proporciona una interfaz de usuario como estos, sino una API extensible para tipos de campos complejos (y simples también). Pero después de pasar una hora intentando empaquetarlo, me di cuenta de que aún no está listo para su distribución. Quizás en unas semanas.
Los plugins listados anteriormente deberían cubrir tus necesidades básicas por ahora, y en el futuro intentaré hacer el mío compatible con los datos almacenados por todos estos, en caso de que decidas usar el mío más adelante.
También podrías encontrar útil este post:

Recientemente he tenido que abordar un problema muy similar mientras trabajaba en un tema. La base del código provenía de esta publicación y había modificado parte del código.
Lo siguiente es la primera porción del código que había modificado.
add_action('init', 'limited_post_type');
function my_custom_limited_post_type()
{
$labels = array(
'name' => _x('Tipo de publicación limitada', 'nombre general del tipo de publicación'),
'singular_name' => _x('Película - DVD', 'nombre singular del tipo de publicación')
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','author','thumbnail','excerpt', 'page-attributes','custom-fields' ),
'show_in_nav_menus' => true
);
register_post_type('limited_post_type', $args);
}
Lo siguiente es la segunda porción del código que había modificado.
foreach ( $scope as $scopeItem ) {
switch ( $scopeItem ) {
case "post": {
// Mostrar en cualquier pantalla de publicación
if ( basename( $_SERVER['SCRIPT_FILENAME'] )=="post-new.php" || $post->post_type=="post" )
$output = true;
break;}
case "page": {
// Mostrar en cualquier pantalla de página
if ( basename( $_SERVER['SCRIPT_FILENAME'] )=="page-new.php" || $post->post_type=="page" )
$output = true;
break;}
case "limited_post_type": {
// Mostrar solo en el tipo de publicación limitada
if ((basename( $_SERVER['SCRIPT_FILENAME'] )=="post-new.php" && $post->post_type=="limited_post_type" ) || (basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" && $post->post_type=="film_dvd" ))
$output = true;
break;
}
Si lo deseas, envíame un mensaje y con gusto te enviaré mi archivo functions.php como referencia. Definitivamente esta es la forma de hacerlo funcionar, ya que pasé muchas noches de frustración al igual que tú.
