好的,这就是我要实现的目标。我有一个名为“广告系列”的自定义帖子类型和一个已分配给广告系列帖子类型的自定义分类法“国家”。当用户添加新国家(向广告系列添加新国家标签)时,我要复制当前帖子,将新帖子命名为刚分配的国家/地区名称,并将其作为当前帖子的子代。
目前,我正在研究“ set_object_terms”,并保存确定哪些新术语已创建的术语。然后,我尝试为每个术语插入新的帖子,但是我正在创建一个无限循环。我尝试创建一个全局循环来停止循环,但是遇到了一些问题。到目前为止,这就是我所拥有的。
$GLOBALS['control_campaign_count'] = 0;
add_action('set_object_terms','save_terms',10,6);
function save_terms($object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids) {
//Assuming we only want terms from specific taxonomy
//If not simply remove this conditional
$our_taxonomy = 'country';
if($taxonomy == $our_taxonomy){
//Added terms are specified terms, that did not already exist
$added_tt_ids = array_diff($tt_ids, $old_tt_ids);
if ($append) {
//If appending terms - nothing was removed
$removed_tt_ids = array();
} else {
//Removed terms will be old terms, that were not specified in $tt_ids
$removed_tt_ids = array_diff($old_tt_ids, $tt_ids);
}
/*,
Currently we have the taxonomy term IDs */
foreach($added_tt_ids as $term){
$added_terms[] = get_term_by( 'term_taxonomy_id',$term,$taxonomy);
$name = $added_terms->name;
echo $name;
// Add New Post
add_action('wp_insert_post', 'add_new_campaign');
function add_new_campaign() {
if($GLOBALS['control_campaign_count'] === 1) {
return;
}
$GLOBALS['control_campaign_count']++;
$new_post_arguments = array(
'post_title' => 'Japan',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'campaigns',
'post_parent' => 1156
);
$id = wp_insert_post($new_post_arguments);
update_post_meta($id, 'keywords');
}
}
foreach($removed_tt_ids as $term){
$removed_terms[] = get_term_by( 'term_taxonomy_id',$term,$taxonomy);
}
//$added_terms contains added term objects
//$removed_terms contains removed term objects
}
}
想法?关于实现此目标的更好方法的想法?预先谢谢你。
答案 0 :(得分:0)
我会使用相同的钩子。但是..
这是我使用的代码,对我来说效果很好:
add_action( 'set_object_terms', 'auto_create_campaigns', 10, 6 );
function auto_create_campaigns( $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ) {
if ( 'campaigns' !== get_post_type( $object_id ) || 'country' !== $taxonomy ) {
return;
}
if ( $append ) {
$term_ids = $tt_ids;
} else {
$term_ids = array_diff( $tt_ids, $old_tt_ids );
}
$post = get_post( $object_id, ARRAY_A );
unset( $post['ID'] );
foreach ( $term_ids as $term_id ) {
// Remove the hook (to avoid infinite loop).
remove_action( 'set_object_terms', 'auto_create_campaigns', 10, 6 );
$term = get_term( $term_id, $taxonomy );
if ( is_wp_error( $term ) || empty( $term ) ) {
continue;
}
$post['post_title'] = $term->name;
$post['post_name'] = $term->slug;
$post['post_parent'] = $object_id;
$post_id = wp_insert_post( $post );
/*if ( $post_id ) {
// Copy the parent's "countries".
// wp_set_post_terms( $post_id, $terms, $taxonomy );
}*/
/*if ( $post_id ) {
// Copy the parent's custom fields.
// ..
}*/
// Add it back.
add_action( 'set_object_terms', 'auto_create_campaigns', 10, 6 );
}
}
该代码仅复制标准发布数据,例如post_title
;但是,也可以复制父帖子的“国家/地区” /术语和/或自定义字段。
删除钩子并将其添加回(在foreach
循环中每次迭代的 end 处)可能比使用全局{{ 1}}。
希望这对您处理孙子职位也有帮助:
我该如何设置条款,允许孙子发帖并且不参与 无限循环?
(您也可以尝试使用相同方法的this,但是 $_in_auto_create_campaigns
和remove_action()
放置在{{1 }} )