Publicar programáticamente una entrada (tipo de contenido personalizado) con campos personalizados
Tengo un tipo de contenido personalizado 'Participant' con muchos campos personalizados. También tengo un formulario con campos de entrada correspondientes para que el usuario los complete. Cuando envía el formulario, quiero que se genere una nueva publicación con cada campo personalizado conteniendo el valor elegido por el usuario.
¿Es posible hacerlo y si es así, cómo?

Utiliza wp_insert_post() y add_post_meta(), así:
// inserta el post y establece la categoría
$post_id = wp_insert_post(array (
'post_type' => 'your_post_type',
'post_title' => $your_title,
'post_content' => $your_content,
'post_status' => 'publish',
'comment_status' => 'closed', // si lo prefieres
'ping_status' => 'closed', // si lo prefieres
));
if ($post_id) {
// inserta metadatos del post
add_post_meta($post_id, '_your_custom_1', $custom1);
add_post_meta($post_id, '_your_custom_2', $custom2);
add_post_meta($post_id, '_your_custom_3', $custom3);
}

actualmente, puedes agregar campos meta fácilmente usando la clave meta_input en wp_insert_post: 'meta_input' => ['_your_custom_1' => $custom1, '_your_custom_2' => custom2]

Buen punto @Andreas, te sugiero que agregues eso como una nueva respuesta y dejes que comience a recibir votos. Debería ser la respuesta correcta ahora.

Además de la excelente respuesta de @webaware mencionada anteriormente, esto se puede manejar desde WordPress 4.4.0 completamente mediante la llamada wp_insert_post:
$post_id = wp_insert_post(array (
'post_content' => $content,
'post_title' => $title,
'post_type' => 'your_custom_post_type',
'post_status' => 'publish',
// un simple array de clave/valor
'meta_input' => array(
'your_custom_key1' => 'your_custom_value1',
'your_custom_key2' => 'your_custom_value2'
// y así sucesivamente ;)
)
));
if ($post_id) {
// funcionó :)
}

Esto se puede lograr bastante fácilmente utilizando el plugin Gravity Forms. Puedes construir un formulario que rellene un Tipo de Entrada Personalizado (Custom Post Type) en el backend. Esta entrada se puede configurar para que aparezca como borrador o como publicada. No hay problema para añadir campos personalizados. En mi caso, lo usé para recopilar testimonios de clientes.
