Changeset 50169
- Timestamp:
- 02/02/2021 09:04:58 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/taxonomy.php
r50120 r50169 3892 3892 } 3893 3893 3894 $post_statuses = array( 'publish' ); 3895 3896 /** 3897 * Filters the post statuses for updating the term count. 3898 * 3899 * @since 5.7.0 3900 * 3901 * @param array $post_statuses List of post statuses to include in the count. Default is 'publish'. 3902 * @param WP_Taxonomy $taxonomy Current taxonomy object. 3903 */ 3904 $post_statuses = esc_sql( apply_filters( 'update_post_term_count_statuses', $post_statuses, $taxonomy ) ); 3905 3894 3906 foreach ( (array) $terms as $term ) { 3895 3907 $count = 0; … … 3897 3909 // Attachments can be 'inherit' status, we need to base count off the parent's status if so. 3898 3910 if ( $check_attachments ) { 3899 $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status = 'publish' OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) = 'publish' ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); 3911 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration 3912 $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status IN ('" . implode( "', '", $post_statuses ) . "') OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) IN ('" . implode( "', '", $post_statuses ) . "') ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); 3900 3913 } 3901 3914 3902 3915 if ( $object_types ) { 3903 3916 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration 3904 $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish'AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) );3917 $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status IN ('" . implode( "', '", $post_statuses ) . "') AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); 3905 3918 } 3906 3919 -
trunk/tests/phpunit/tests/term/termCounts.php
r49603 r50169 225 225 } 226 226 227 /** 228 * Term counts incremented correctly for posts with attachment. 229 * 230 * @covers ::wp_update_term_count 231 * @dataProvider data_term_count_changes_for_post_statuses_with_attachments 227 function add_custom_status_to_counted_statuses( $statuses ) { 228 array_push( $statuses, 'custom' ); 229 return $statuses; 230 } 231 232 /** 233 * Term counts incremented correctly when the `update_post_term_count_statuses` filter is used. 234 * 235 * @covers ::wp_update_term_count 236 * @dataProvider data_term_count_changes_for_update_post_term_count_statuses_filter 237 * @ticket 38843 232 238 * 233 239 * @param string $post_status New post status. 234 240 * @param int $change Expected change. 235 241 */ 236 public function test_term_count_changes_for_ post_statuses_with_attachments( $post_status, $change ) {242 public function test_term_count_changes_for_update_post_term_count_statuses_filter( $post_status, $change ) { 237 243 $term_count = get_term( self::$attachment_term )->count; 238 // Do not use shared fixture for this test as it relies on a new post. 244 245 add_filter( 'update_post_term_count_statuses', array( $this, 'add_custom_status_to_counted_statuses' ) ); 246 239 247 $post_id = $this->factory()->post->create( array( 'post_status' => $post_status ) ); 240 248 wp_add_object_terms( $post_id, self::$attachment_term, 'wp_test_tax_counts' ); … … 250 258 $expected = $term_count + $change; 251 259 $this->assertSame( $expected, get_term( self::$attachment_term )->count ); 252 } 253 254 /** 255 * Data provider for test_term_count_changes_for_post_statuses_with_attachments. 260 261 remove_filter( 'update_post_term_count_statuses', array( $this, 'add_custom_status_to_counted_statuses' ) ); 262 } 263 264 /** 265 * Data provider for test_term_count_changes_for_update_post_term_count_statuses_filter. 256 266 * 257 267 * @return array[] { … … 260 270 * } 261 271 */ 262 function data_term_count_changes_for_ post_statuses_with_attachments() {272 function data_term_count_changes_for_update_post_term_count_statuses_filter() { 263 273 return array( 264 274 // 0. Published post … … 270 280 // 3. Private post 271 281 array( 'private', 0 ), 282 // 4. Custom post status 283 array( 'custom', 2 ), 284 ); 285 } 286 287 /** 288 * Term counts incremented correctly for posts with attachment. 289 * 290 * @covers ::wp_update_term_count 291 * @dataProvider data_term_count_changes_for_post_statuses_with_attachments 292 * 293 * @param string $post_status New post status. 294 * @param int $change Expected change. 295 */ 296 public function test_term_count_changes_for_post_statuses_with_attachments( $post_status, $change ) { 297 $term_count = get_term( self::$attachment_term )->count; 298 // Do not use shared fixture for this test as it relies on a new post. 299 $post_id = $this->factory()->post->create( array( 'post_status' => $post_status ) ); 300 wp_add_object_terms( $post_id, self::$attachment_term, 'wp_test_tax_counts' ); 301 $attachment_id = self::factory()->attachment->create_object( 302 array( 303 'file' => 'image.jpg', 304 'post_parent' => $post_id, 305 'post_status' => 'inherit', 306 ) 307 ); 308 wp_add_object_terms( $attachment_id, self::$attachment_term, 'wp_test_tax_counts' ); 309 310 $expected = $term_count + $change; 311 $this->assertSame( $expected, get_term( self::$attachment_term )->count ); 312 } 313 314 /** 315 * Data provider for test_term_count_changes_for_post_statuses_with_attachments. 316 * 317 * @return array[] { 318 * @type string $post_status New post status. 319 * @type int $change Expected change. 320 * } 321 */ 322 function data_term_count_changes_for_post_statuses_with_attachments() { 323 return array( 324 // 0. Published post 325 array( 'publish', 2 ), 326 // 1. Auto draft 327 array( 'auto-draft', 0 ), 328 // 2. Draft 329 array( 'draft', 0 ), 330 // 3. Private post 331 array( 'private', 0 ), 272 332 ); 273 333 }
Note: See TracChangeset
for help on using the changeset viewer.