Añadir términos programáticamente a tipos de post personalizados
Lo que quiero hacer es asignar un término jerárquico a un tipo de post personalizado:
function create_frontles_posts() {
$x = 1;
do {
$post_id = wp_insert_post(array(
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => 1,
'post_name' => 'Tile'.$x,
'post_title' => 'Tile',
'post_status' => 'publish',
'post_type' => 'frontiles',
));
wp_set_object_terms($post_id, array('mosaic-home'), 'tiles_categories', true);
$x++;
} while ($x <= 24);
}
Logro crear automáticamente los 24 posts personalizados pero no consigo asignarles el término en ese proceso. Previamente, creé el término con esta función, sin problemas:
function example_insert_category() {
wp_insert_term(
'Mosaic - Home',
'tiles_categories',
array(
'description' => 'Añade Tiles aquí para cargar en el primer término',
'slug' => 'mosaic-home'
)
);
}
add_action('init','example_insert_category');
¿Qué estoy haciendo mal?

Descubrí el problema y la solución. Depuré "wp_set_object_terms" usando "is_wp_error" y recibí el mensaje "Taxonomía Inválida", entonces me di cuenta de que cuando se creaban los posts ese término no existía. Así que cambié el hook a "init" en la función programmatically_create_post(), y ¡voilà!
Debajo de esta línea el código funcionando:
<?php
// ACCIONES CUANDO EL TEMA SE ACTIVA ///////////////////////
if (isset($_GET['activated']) && is_admin()){
// 3. Añadir término "mosaic-home" a la taxonomía personalizada "tiles_categories"
function example_insert_category() {
wp_insert_term(
'Mosaic - Home',
'tiles_categories',
array(
'description' => 'Añade Tiles aquí para cargar en el primer término',
'slug' => 'mosaic-home'
)
);
}
add_action('init','example_insert_category');
// 4. Bucle para crear 24 posts
function create_frontles_posts() {
$x = 1;
do {
$post_id = wp_insert_post(array(
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => 1,
'post_name' => 'tile'.$x,
'post_title' => 'Tile',
'post_status' => 'publish',
'post_type' => 'frontiles',
// 'tax_input' => array('tiles_categories' => 2),
));
wp_set_object_terms($post_id, 'mosaic-home', 'tiles_categories', true);
$x++;
} while ($x <= 24);
}
// 5. Añadir el bucle a la función para crear posts
function programmatically_create_post() {
// Inicializar el ID de página a -1. Esto indica que no se ha tomado ninguna acción.
$post_id = -1;
$title='';
// Si la página no existe ya, entonces crearla
if( null == get_page_by_title( $title ) ) {
create_frontles_posts();
} else {
// De lo contrario, nos detendremos
$post_id = -2;
}
}
add_filter( 'init', 'programmatically_create_post' );
} // fin de acciones al activar
?>

Aquí tienes un ejemplo. He tratado de explicar cada proceso que ocurre en cada línea. Espero que este código pueda explicarte fácilmente cómo funciona.
<?php
//creando un array vacío para almacenar los IDs de los términos insertados
$terms = array();
//insertando el término "Kathmandu" en la taxonomía personalizada "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );
//si el término "Kathmandu" se inserta correctamente, se devuelve su term_id y se almacena en $tax_insert_id
//el term_id devuelto se añade al array $terms
$terms[] = $tax_insert_id['term_id'];
//insertando el término "Banepa" en la taxonomía personalizada "region"
$tax_insert_id = wp_insert_term('Banepa','region' );
//si el término "Banepa" se inserta correctamente, se devuelve su term_id y se almacena en $tax_insert_id
//el term_id devuelto se añade al array $terms
$terms[] = $tax_insert_id['term_id'];
//Creando un array para el post
$post = array(
'post_title' => 'Título',
'post_content' => 'Este es un texto de ejemplo',
'post_status' => 'publish',
'post_type' => 'post',
);
//Insertando el post en WordPress usando wp_insert_post()
//si el post se publica correctamente, se devuelve el post_id y se almacena en $the_post_id
$the_post_id = wp_insert_post( $post );
//asignar los términos almacenados en el array $terms al post con ID $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );

¡Gracias Karun! Pero estoy intentando probarlo y tengo este error en PHP "Fatal error: Cannot use object of type WP_Error as array in..." en esta línea: $terms[] = $tax_insert_id['term_id'];

Puedes ver cómo se ve ahora el código completo aquí: http://pastebin.com/embed_iframe.php?i=gxp71NLt
