Ticket #37703: 37703.unifinished.patch
File 37703.unifinished.patch, 8.0 KB (added by , 5 years ago) |
---|
-
src/wp-includes/comment.php
diff --git src/wp-includes/comment.php src/wp-includes/comment.php index b451c5b641..1d8a51c2c5 100644
function wp_count_comments( $post_id = 0 ) { 1376 1376 * 1377 1377 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. 1378 1378 * @param bool $force_delete Whether to bypass trash and force deletion. Default is false. 1379 * @param bool $bulk Some behaviours are delegate to the bulk function wp_delete_comments. Default is false. 1379 1380 * @return bool True on success, false on failure. 1380 1381 */ 1381 function wp_delete_comment( $comment_id, $force_delete = false ) {1382 function wp_delete_comment( $comment_id, $force_delete = false, $bulk = false ) { 1382 1383 global $wpdb; 1383 1384 $comment = get_comment( $comment_id ); 1384 1385 if ( ! $comment ) { … … function wp_delete_comment( $comment_id, $force_delete = false ) { 1400 1401 */ 1401 1402 do_action( 'delete_comment', $comment->comment_ID, $comment ); 1402 1403 1403 // Move children up a level. 1404 $children = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID ) ); 1405 if ( ! empty( $children ) ) { 1406 $wpdb->update( $wpdb->comments, array( 'comment_parent' => $comment->comment_parent ), array( 'comment_parent' => $comment->comment_ID ) ); 1407 clean_comment_cache( $children ); 1404 if ( !$bulk ) { 1405 // Move children up a level. 1406 $children = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID ) ); 1407 if ( ! empty( $children ) ) { 1408 $wpdb->update( $wpdb->comments, array( 'comment_parent' => $comment->comment_parent ), array( 'comment_parent' => $comment->comment_ID ) ); 1409 clean_comment_cache( $children ); 1410 } 1408 1411 } 1409 1412 1410 1413 // Delete metadata … … function wp_delete_comment( $comment_id, $force_delete = false ) { 1442 1445 return true; 1443 1446 } 1444 1447 1448 /** 1449 * Trashes or deletes comments. 1450 * 1451 * The comments are moved to trash instead of permanently deleted unless trash is 1452 * disabled, item is already in the trash, or $force_delete is true. 1453 * 1454 * The post comment count will be updated if the comments were approved and have a 1455 * post ID available. 1456 * 1457 * @since x.x.x 1458 * 1459 * @global wpdb $wpdb WordPress database abstraction object. 1460 * 1461 * @param array $comments_id Comment ID or WP_Comment object. 1462 * @param bool $force_delete Whether to bypass trash and force deletion. Default is false. 1463 * @return bool True on success, false on failure. 1464 */ 1465 function wp_delete_comments( $comments_id, $force_delete = false ) { 1466 global $wpdb; 1467 $grandparents = array(); 1468 $ancestors = array(); 1469 if ( empty( $comments_id ) ) { 1470 return true; 1471 } 1472 1473 // TODO: define a way to sanitize ids 1474 $comments_string = '(' . implode( ",", $comments_id ) . ')'; 1475 // Determine if a parent comment is being deleted from a comment that is not being deleted 1476 $parents = $wpdb->get_results( "SELECT comment_parent FROM $wpdb->comments WHERE comment_parent IN $comments_string AND comment_ID NOT IN $comments_string" , ARRAY_N); 1477 // Determine grandparents 1478 if ( !empty( $parents ) ) { 1479 // The next line doesn't work because is an associative arrays and we need only the values 1480 $parents_string = '(' . implode( ",", $parents ) . ')'; 1481 $grandparents = $wpdb->get_results( "SELECT comment_parent FROM $wpdb->comments WHERE comment_ID NOT IN $parents_string", ARRAY_N ); 1482 // Determine very old ancestors 1483 if ( !empty( $grandparents ) ) { 1484 $grandparents_string = '(' . implode( ",", $grandparents ) . ')'; 1485 $ancestors = $wpdb->get_results( "SELECT comment_parent FROM $wpdb->comments WHERE comment_ID NOT IN $grandparents_string", ARRAY_N ); 1486 } 1487 } 1488 1489 // TODO: Find grandfathers of this parents and do reparenting before delete them 1490 1491 foreach ( $comments_id as $comment_id ) { 1492 $single_comment = wp_delete_comment( $comment_id, $force_delete, true ); 1493 if ( !$single_comment ) { 1494 return false; 1495 } 1496 } 1497 1498 /** 1499 * Fires immediately after comments are deleted from the database. 1500 * 1501 * @since x.x.x 1502 * 1503 * @param int $comment_id The comment ID. 1504 */ 1505 do_action( 'deleted_comments', $comments_id ); 1506 return true; 1507 } 1508 1445 1509 /** 1446 1510 * Moves a comment to the Trash 1447 1511 * -
src/wp-includes/post.php
diff --git src/wp-includes/post.php src/wp-includes/post.php index deb215e17d..c44ff0d410 100644
function wp_delete_post( $postid = 0, $force_delete = false ) { 3003 3003 3004 3004 wp_defer_comment_counting( true ); 3005 3005 3006 $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $postid ) ); 3007 foreach ( $comment_ids as $comment_id ) { 3008 wp_delete_comment( $comment_id, true ); 3009 } 3006 $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $postid ) ); 3007 wp_delete_comments( $comment_ids, true ); 3010 3008 3011 3009 wp_defer_comment_counting( false ); 3012 3010 … … function wp_delete_attachment( $post_id, $force_delete = false ) { 5610 5608 wp_defer_comment_counting( true ); 5611 5609 5612 5610 $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) ); 5613 foreach ( $comment_ids as $comment_id ) { 5614 wp_delete_comment( $comment_id, true ); 5615 } 5611 wp_delete_comments( $comment_ids, true ); 5616 5612 5617 5613 wp_defer_comment_counting( false ); 5618 5614 -
tests/phpunit/tests/comment/query.php
diff --git tests/phpunit/tests/comment/query.php tests/phpunit/tests/comment/query.php index 372fa475c4..027135ec01 100644
class Tests_Comment_Query extends WP_UnitTestCase { 4381 4381 $this->assertEqualSets( array( $c ), $found ); 4382 4382 } 4383 4383 4384 /** 4385 * @ticket 37703 4386 */ 4387 public function test_delete_comments() { 4388 $parent1 = self::factory()->comment->create( 4389 array( 4390 'comment_post_ID' => self::$post_id, 4391 'comment_approved' => '1', 4392 ) 4393 ); 4394 4395 $parent2 = self::factory()->comment->create( 4396 array( 4397 'comment_post_ID' => self::$post_id, 4398 'comment_approved' => '1', 4399 'comment_parent' => $parent1, 4400 ) 4401 ); 4402 4403 $c1 = self::factory()->comment->create( 4404 array( 4405 'comment_post_ID' => self::$post_id, 4406 'comment_approved' => '1', 4407 'comment_parent' => $parent2, 4408 ) 4409 ); 4410 4411 $c2 = self::factory()->comment->create( 4412 array( 4413 'comment_post_ID' => self::$post_id, 4414 'comment_approved' => '1', 4415 'comment_parent' => $parent2, 4416 ) 4417 ); 4418 4419 $c3 = self::factory()->comment->create( 4420 array( 4421 'comment_post_ID' => self::$post_id, 4422 'comment_approved' => '1', 4423 'comment_parent' => $c2, 4424 ) 4425 ); 4426 4427 $parent3 = self::factory()->comment->create( 4428 array( 4429 'comment_post_ID' => self::$post_id, 4430 'comment_approved' => '1', 4431 ) 4432 ); 4433 4434 $c4 = self::factory()->comment->create( 4435 array( 4436 'comment_post_ID' => self::$post_id, 4437 'comment_approved' => '1', 4438 'comment_parent' => $parent3, 4439 ) 4440 ); 4441 4442 self::factory()->comment->create( 4443 array( 4444 'comment_post_ID' => self::$post_id, 4445 'comment_approved' => '1', 4446 'comment_parent' => $c4, 4447 ) 4448 ); 4449 4450 $c5 = self::factory()->comment->create( 4451 array( 4452 'comment_post_ID' => self::$post_id, 4453 'comment_approved' => '1', 4454 ) 4455 ); 4456 4457 self::factory()->comment->create( 4458 array( 4459 'comment_post_ID' => self::$post_id, 4460 'comment_approved' => '1', 4461 'comment_parent' => $c5, 4462 ) 4463 ); 4464 4465 $c6 = self::factory()->comment->create( 4466 array( 4467 'comment_post_ID' => self::$post_id, 4468 'comment_approved' => '1', 4469 ) 4470 ); 4471 4472 $c7 = self::factory()->comment->create( 4473 array( 4474 'comment_post_ID' => self::$post_id, 4475 'comment_approved' => '1', 4476 'comment_parent' => $c6, 4477 ) 4478 ); 4479 4480 self::factory()->comment->create( 4481 array( 4482 'comment_post_ID' => self::$post_id, 4483 'comment_approved' => '1', 4484 'comment_parent' => $c7, 4485 ) 4486 ); 4487 4488 $this->assertTrue( wp_delete_comments( array( $c1, $c2, $c3, $c4, $c5, $c6, $c7 ) ) ); 4489 } 4490 4384 4491 public function test_comment_query_should_be_cached() { 4385 4492 global $wpdb; 4386 4493