_update_term_count_on_transition_post_status()
Updates the custom taxonomies' term counts when a post's status is changed.
For example, default posts term counts (for custom taxonomies) don't include private / draft posts.
Internal function — this function is designed to be used by the kernel itself. It is not recommended to use this function in your code.
Hooks from the function
Returns
null. Nothing (null).
Usage
_update_term_count_on_transition_post_status( $new_status, $old_status, $post );
- $new_status(string) (required)
- New post status.
- $old_status(string) (required)
- Old post status.
- $post(WP_Post) (required)
- Post object.
Changelog
| Since 3.3.0 | Introduced. |
_update_term_count_on_transition_post_status() update term count on transition post status code WP 7.0
function _update_term_count_on_transition_post_status( $new_status, $old_status, $post ) {
if ( $new_status === $old_status ) {
return;
}
// Update counts for the post's terms.
foreach ( (array) get_object_taxonomies( $post->post_type, 'objects' ) as $taxonomy ) {
/** This filter is documented in wp-includes/taxonomy.php */
$counted_statuses = apply_filters( 'update_post_term_count_statuses', array( 'publish' ), $taxonomy );
/*
* Do not recalculate term count if both the old and new status are not included in term counts.
* This accounts for a transition such as draft -> pending.
*/
if ( ! in_array( $old_status, $counted_statuses, true ) && ! in_array( $new_status, $counted_statuses, true ) ) {
continue;
}
/*
* Do not recalculate term count if both the old and new status are included in term counts.
*
* This accounts for transitioning between statuses which are both included in term counts. This can only occur
* if the `update_post_term_count_statuses` filter is in use to count more than just the 'publish' status.
*/
if ( in_array( $old_status, $counted_statuses, true ) && in_array( $new_status, $counted_statuses, true ) ) {
continue;
}
$tt_ids = wp_get_object_terms( $post->ID, $taxonomy->name, array( 'fields' => 'tt_ids' ) );
wp_update_term_count( $tt_ids, $taxonomy->name );
}
}