-
-
Save brenna/7377802 to your computer and use it in GitHub Desktop.
function custom_tax_init(){ | |
//set some options for our new custom taxonomy | |
$args = array( | |
'label' => __( 'My Custom Taxonomy' ), | |
'hierarchical' => true, | |
'capabilities' => array( | |
// allow anyone editing posts to assign terms | |
'assign_terms' => 'edit_posts', | |
/* but you probably don't want anyone | |
* except admins messing with what | |
* gets auto-generated! */ | |
'edit_terms' => 'administrator' | |
) | |
); | |
// create the custom taxonomy and attach it to a custom post type | |
register_taxonomy( 'my-taxonomy', 'post-type-A', $args); | |
} | |
add_action( 'init', 'custom_tax_init' ); | |
function update_custom_terms($post_id) { | |
// only update terms if it's a post-type-B post | |
if ( 'post-type-B' != get_post_type($post_id)) { | |
return; | |
} | |
// don't create or update terms for system generated posts | |
if (get_post_status($post_id) == 'auto-draft') { | |
return; | |
} | |
/* | |
* Grab the post title and slug to use as the new | |
* or updated term name and slug | |
*/ | |
$term_title = get_the_title($post_id); | |
$term_slug = get_post( $post_id )->post_name; | |
/* | |
* Check if a corresponding term already exists by comparing | |
* the post ID to all existing term descriptions. | |
*/ | |
$existing_terms = get_terms('my-taxonomy', array( | |
'hide_empty' => false | |
) | |
); | |
foreach($existing_terms as $term) { | |
if ($term->description == $post_id) { | |
//term already exists, so update it and we're done | |
wp_update_term($term->term_id, 'my-taxonomy', array( | |
'name' => $term_title, | |
'slug' => $term_slug | |
) | |
); | |
return; | |
} | |
} | |
/* | |
* If we didn't find a match above, this is a new post, | |
* so create a new term. | |
*/ | |
wp_insert_term($term_title, 'my-taxonomy', array( | |
'slug' => $term_slug, | |
'description' => $post_id | |
) | |
); | |
} | |
//run the update function whenever a post is created or edited | |
add_action('save_post', 'update_custom_terms'); |
You little legend! This is what I was looking for! :)
Thanks for this! Elegant solution.
Thanks a lot! Is it possible to auto select this created taxonomy?
Awesome. But how would one modify this to take into account deleted posts (i.e. delete the corresponding term when the post is deleted). I tried. No luck.
I could see why the auto delete feature was left out. I mean, it would just be another function you could call to do it, but if we're this deep into integration, there's a reason you wouldn't want that to happen. Most of the time it's not a one-way thing.
One up for auto delete function to be added. And whole snippet moved to a plugin with dynamically changeable CPTs, thumbs up
if anyone is interested I wrote a simple addition to this script that will create a custom meta field for your taxonomy, I named it post_id but you can name it whatever you like and have the script save to that custom field instead of the taxonomies description.
Any idea on how to auto-populate a taxonomy with another custom taxonomy entries ?
@dennisaskeland @burnified @brenna
Any idea on how to auto-populate a taxonomy with another custom taxonomy entries ?
@dennisaskeland @burnified
For anyone interested, you can auto select the created taxonomy by replacing this code:
wp_insert_term($term_title, 'location', array(
'slug' => $term_slug,
'description' => $post_id
)
);
With this code:
wp_set_object_terms( $post_id, $term_title, $tax, false );
The last argument is to set whether you're appending or replacing. Set it false to replace any currently selected terms.
I love this solution for generating taxonomy terms based on post types, however I was looking for a solution that didn't rely on term descriptions, since I needed to use those in my theme. I ended up using get_term_meta()
and update_term_meta()
instead of term descriptions.
Modified function below:
foreach($existing_terms as $term) {
$related_post_id = get_term_meta($term->term_id, 'related_post_id', true);
if ($related_post_id == $post_id) {
//term already exists, so update it and we're done
wp_update_term($term->term_id, 'my-taxonomy', array(
'name' => $term_title,
'slug' => $term_slug
)
);
return;
}
}
/*
* If we didn't find a match above, this is a new post,
* so create a new term.
*/
wp_insert_term($term_title, 'my-taxonomy', array(
'slug' => $term_slug,
) );
/*
* Add term meta to new term
*/
$new_term = get_term_by('slug', $term_slug, 'my-taxonomy');
if ( $new_term ) {
update_term_meta($new_term->term_id, 'related_post_id', $post_id);
}
@badfeather Could you please explain why you had to go this route?
@samabp Sure. I needed to use category/term descriptions for what they're intended for (writing a description of that category/term). It seemed to make more sense to take advantage of taxonomy term meta to save these relationship ID values, rather than hacking them into the description field.
@badfeather Thanks a lot, makes sense to me.
Is there a way to use woocommerce product attributes (which is a custom taxonomy) with this code?
Thanks!
hi @caesarsamsi, I wrote this a very long time ago and am not familiar with woocommerce so I'm not sure if that's possible or not. good luck!
This was exactly what I needed thanks so much for sharing!