From 62327715a0d25eb2ab161cfd3ff72475209885f2 Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Fri, 21 May 2021 15:28:39 +0000 Subject: [PATCH] Revisions: add a new filter for revisions to keep by post type. Add a new `wp_{$post_type}_revisions_to_keep` filter that makes it convenient to filter the number of revisions created for a specific post type. Overrides both the value of WP_POST_REVISIONS and the `wp_revisions_to_keep` filter. Props dlh. Fixes #51550. git-svn-id: https://develop.svn.wordpress.org/trunk@50949 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/revision.php | 19 ++++++++- tests/phpunit/tests/post/revisions.php | 59 ++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/revision.php b/src/wp-includes/revision.php index a1aad16812..5a090aaf58 100644 --- a/src/wp-includes/revision.php +++ b/src/wp-includes/revision.php @@ -564,7 +564,24 @@ function wp_revisions_to_keep( $post ) { * @param int $num Number of revisions to store. * @param WP_Post $post Post object. */ - return (int) apply_filters( 'wp_revisions_to_keep', $num, $post ); + $num = apply_filters( 'wp_revisions_to_keep', $num, $post ); + + /** + * Filters the number of revisions to save for the given post by its post type. + * + * Overrides both the value of WP_POST_REVISIONS and the {@see 'wp_revisions_to_keep'} filter. + * + * The dynamic portion of the hook name, `$post->post_type`, refers to + * the post type slug. + * + * @since 5.8.0 + * + * @param int $num Number of revisions to store. + * @param WP_Post $post Post object. + */ + $num = apply_filters( "wp_{$post->post_type}_revisions_to_keep", $num, $post ); + + return (int) $num; } /** diff --git a/tests/phpunit/tests/post/revisions.php b/tests/phpunit/tests/post/revisions.php index 7883483e40..5f0131835f 100644 --- a/tests/phpunit/tests/post/revisions.php +++ b/tests/phpunit/tests/post/revisions.php @@ -576,4 +576,63 @@ class Tests_Post_Revisions extends WP_UnitTestCase { $this->assertSame( $revision_ids, array_values( wp_list_pluck( $revisions, 'ID' ) ) ); } + + /* + * @ticket 51550 + */ + public function test_wp_revisions_to_keep_filter() { + $post = self::factory()->post->create_and_get( + array( + 'post_title' => 'some-post', + 'post_type' => 'post', + 'post_content' => 'some_content', + ) + ); + + $default = wp_revisions_to_keep( $post ); + $expected = $default + 1; + + add_filter( + 'wp_revisions_to_keep', + function () use ( $expected ) { + return $expected; + } + ); + + $this->assertSame( $expected, wp_revisions_to_keep( $post ) ); + } + + /* + * @ticket 51550 + */ + public function test_wp_post_type_revisions_to_keep_filter() { + $post = self::factory()->post->create_and_get( + array( + 'post_title' => 'some-post', + 'post_type' => 'post', + 'post_content' => 'some_content', + ) + ); + + $default = wp_revisions_to_keep( $post ); + $generic = $default + 1; + + add_filter( + 'wp_revisions_to_keep', + function () use ( $generic ) { + return $generic; + } + ); + $this->assertSame( $generic, wp_revisions_to_keep( $post ) ); + + $expected = $generic + 1; + + add_filter( + "wp_{$post->post_type}_revisions_to_keep", + function () use ( $expected ) { + return $expected; + } + ); + $this->assertSame( $expected, wp_revisions_to_keep( $post ) ); + } }