Cum să adaugi termeni programatic la postări personalizate în WordPress
Ceea ce vreau să fac este să atribui un termen ierarhic unei postări personalizate:
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);
}
Am reușit să creez automat cele 24 de postări personalizate, dar nu reușesc să le atribui termenul în acel proces. Anterior, am creat termenul cu această funcție, fără probleme:
function example_insert_category() {
wp_insert_term(
'Mosaic - Home',
'tiles_categories',
array(
'description' => 'Adaugă Tile-uri aici pentru încărcare în prima secțiune',
'slug' => 'mosaic-home'
)
);
}
add_action('init','example_insert_category');
Ce fac greșit?

Am descoperit problema și soluția. Am depanat funcția "wp_set_object_terms" folosind "is_wp_error" și am primit mesajul "Invalid Taxonomy", apoi mi-am dat seama că atunci când postările erau create, acel termen nu exista. Așa că am schimbat hook-ul în "init" în funcția programmatically_create_post(), și voila!
Mai jos este codul care funcționează:
<?php
// DE EXECUTAT CÂND TEMA ESTE ACTIVATĂ ///////////////////////
if (isset($_GET['activated']) && is_admin()){
// 3. Adaugă termenul "mosaic-home" la taxonomia personalizată "tiles_categories"
function example_insert_category() {
wp_insert_term(
'Mosaic - Home',
'tiles_categories',
array(
'description' => 'Adaugă Tile-uri aici pentru a fi încărcate în prima categorie',
'slug' => 'mosaic-home'
)
);
}
add_action('init','example_insert_category');
// 4. Crează bucla pentru generarea a 24 de postări
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. adaugă bucla în funcția pentru crearea postărilor
function programmatically_create_post() {
// Inițializează ID-ul postării cu -1. Acest lucru indică faptul că nu s-a întâmplat nimic.
$post_id = -1;
$title='';
// Dacă postarea nu există deja, atunci o creează
if( null == get_page_by_title( $title ) ) {
create_frontles_posts();
} else {
// Altfel, se oprește
$post_id = -2;
}
}
add_filter( 'init', 'programmatically_create_post' );
} // sfârșitul acțiunilor la activare
?>

Iată un exemplu. Am încercat să explic fiecare proces care are loc în fiecare linie. Sper că acest cod vă poate explica ușor cum funcționează.
<?php
//creăm un array gol pentru a stoca ID-urile termenilor inserați
$terms = array();
//inserăm termenul "Kathmandu" într-o taxonomie personalizată "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );
//dacă termenul "Kathmandu" este inserat cu succes, term_id este returnat și stocat în $tax_insert_id
//term_id returnat este adăugat în array-ul $terms
$terms[] = $tax_insert_id['term_id'];
//inserăm termenul "Banepa" într-o taxonomie personalizată "region"
$tax_insert_id = wp_insert_term('Banepa','region' );
//dacă termenul "Banepa" este inserat cu succes, term_id este returnat și stocat în $tax_insert_id
//term_id returnat este adăugat în array-ul $terms
$terms[] = $tax_insert_id['term_id'];
//Creăm un array pentru postare
$post = array(
'post_title' => 'Titlu',
'post_content' => 'Acesta este un text dummy',
'post_status' => 'publish',
'post_type' => 'post',
);
//Inserăm postarea în WordPress folosind wp_insert_post()
//dacă postarea este creată cu succes, post_id este returnat și stocat în $the_post_id
$the_post_id = wp_insert_post( $post );
//atribuim termenii stocați în array-ul $terms postării cu ID-ul $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );

Mulțumesc Karun! Dar încerc să-l testez și primesc această eroare php "Fatal error: Cannot use object of type WP_Error as array in..." la această linie: $terms[] = $tax_insert_id['term_id'];

Poți vedea cum arată acum întregul cod aici: http://pastebin.com/embed_iframe.php?i=gxp71NLt
