diff --git a/src/wp-includes/customize/class-wp-customize-custom-css-setting.php b/src/wp-includes/customize/class-wp-customize-custom-css-setting.php index 034e081484..ba4a58cf01 100644 --- a/src/wp-includes/customize/class-wp-customize-custom-css-setting.php +++ b/src/wp-includes/customize/class-wp-customize-custom-css-setting.php @@ -236,20 +236,9 @@ final class WP_Customize_Custom_CSS_Setting extends WP_Customize_Setting { ); // Update post if it already exists, otherwise create a new one. - $post_id = null; - $query = new WP_Query( array( - 'post_type' => 'custom_css', - 'post_status' => get_post_stati(), - 'name' => sanitize_title( $this->stylesheet ), - 'number' => 1, - 'no_found_rows' => true, - 'cache_results' => true, - 'update_post_meta_cache' => false, - 'update_term_meta_cache' => false, - 'suppress_filters' => true, - ) ); - if ( ! empty( $query->post ) ) { - $args['ID'] = $query->post->ID; + $post = wp_get_custom_css_post( $this->stylesheet ); + if ( $post ) { + $args['ID'] = $post->ID; $post_id = wp_update_post( wp_slash( $args ) ); } else { $post_id = wp_insert_post( wp_slash( $args ) ); diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php index 646b2e4553..baad12f52d 100644 --- a/src/wp-includes/theme.php +++ b/src/wp-includes/theme.php @@ -1574,32 +1574,26 @@ function wp_custom_css_cb() { } /** - * Fetch the saved Custom CSS content. - * - * Gets the content of a Custom CSS post that matches the - * current theme. + * Fetch the `custom_css` post for a given theme. * * @since 4.7.0 * @access public * * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the current theme. - * - * @return string The Custom CSS Post content. + * @return WP_Post|null The custom_css post or null if none exists. */ -function wp_get_custom_css( $stylesheet = '' ) { - $css = ''; - +function wp_get_custom_css_post( $stylesheet = '' ) { if ( empty( $stylesheet ) ) { $stylesheet = get_stylesheet(); } $custom_css_query_vars = array( - 'post_type' => 'custom_css', - 'post_status' => get_post_stati(), - 'name' => sanitize_title( $stylesheet ), - 'number' => 1, - 'no_found_rows' => true, - 'cache_results' => true, + 'post_type' => 'custom_css', + 'post_status' => get_post_stati(), + 'name' => sanitize_title( $stylesheet ), + 'number' => 1, + 'no_found_rows' => true, + 'cache_results' => true, 'update_post_meta_cache' => false, 'update_term_meta_cache' => false, ); @@ -1607,10 +1601,9 @@ function wp_get_custom_css( $stylesheet = '' ) { $post = null; if ( get_stylesheet() === $stylesheet ) { $post_id = get_theme_mod( 'custom_css_post_id' ); - if ( ! $post_id ) { + if ( ! $post_id || ! get_post( $post_id ) ) { $query = new WP_Query( $custom_css_query_vars ); $post = $query->post; - /* * Cache the lookup. See WP_Customize_Custom_CSS_Setting::update(). * @todo This should get cleared if a custom_css post is added/removed. @@ -1624,6 +1617,26 @@ function wp_get_custom_css( $stylesheet = '' ) { $post = $query->post; } + return $post; +} + +/** + * Fetch the saved Custom CSS content. + * + * @since 4.7.0 + * @access public + * + * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the current theme. + * @return string The Custom CSS Post content. + */ +function wp_get_custom_css( $stylesheet = '' ) { + $css = ''; + + if ( empty( $stylesheet ) ) { + $stylesheet = get_stylesheet(); + } + + $post = wp_get_custom_css_post( $stylesheet ); if ( $post ) { $css = $post->post_content; } diff --git a/tests/phpunit/tests/customize/custom-css-setting.php b/tests/phpunit/tests/customize/custom-css-setting.php index fea097644d..63c7c814c2 100644 --- a/tests/phpunit/tests/customize/custom-css-setting.php +++ b/tests/phpunit/tests/customize/custom-css-setting.php @@ -45,7 +45,7 @@ class Test_WP_Customize_Custom_CSS_Setting extends WP_UnitTestCase { $wp_customize = $this->wp_customize; do_action( 'customize_register', $this->wp_customize ); - $this->setting = new WP_Customize_Custom_CSS_Setting( $this->wp_customize, 'custom_css[twentysixteen]' ); + $this->setting = new WP_Customize_Custom_CSS_Setting( $this->wp_customize, 'custom_css[' . get_stylesheet() . ']' ); $this->wp_customize->add_setting( $this->setting ); } @@ -78,7 +78,7 @@ class Test_WP_Customize_Custom_CSS_Setting extends WP_UnitTestCase { function test_construct() { $this->assertTrue( post_type_exists( 'custom_css' ) ); $this->assertEquals( 'custom_css', $this->setting->type ); - $this->assertEquals( 'twentysixteen', $this->setting->stylesheet ); + $this->assertEquals( get_stylesheet(), $this->setting->stylesheet ); $this->assertEquals( 'edit_css', $this->setting->capability ); $exception = null; @@ -113,17 +113,36 @@ class Test_WP_Customize_Custom_CSS_Setting extends WP_UnitTestCase { $this->setting->default = '/* Hello World */'; $this->assertEquals( $this->setting->default, $this->setting->value() ); + $this->assertNull( wp_get_custom_css_post() ); + $this->assertNull( wp_get_custom_css_post( $this->setting->stylesheet ) ); + $this->assertNull( wp_get_custom_css_post( 'twentyten' ) ); + $original_css = 'body { color: black; }'; - $this->factory()->post->create( array( + $post_id = $this->factory()->post->create( array( 'post_title' => $this->setting->stylesheet, 'post_name' => $this->setting->stylesheet, - 'post_content' => 'body { color: black; }', + 'post_content' => $original_css, 'post_status' => 'publish', 'post_type' => 'custom_css', ) ); + $twentyten_css = 'body { color: red; }'; + $twentyten_post_id = $this->factory()->post->create( array( + 'post_title' => 'twentyten', + 'post_name' => 'twentyten', + 'post_content' => $twentyten_css, + 'post_status' => 'publish', + 'post_type' => 'custom_css', + ) ); + $twentyten_setting = new WP_Customize_Custom_CSS_Setting( $this->wp_customize, 'custom_css[twentyten]' ); + + $this->assertEquals( $post_id, wp_get_custom_css_post()->ID ); + $this->assertEquals( $post_id, wp_get_custom_css_post( $this->setting->stylesheet )->ID ); + $this->assertEquals( $twentyten_post_id, wp_get_custom_css_post( 'twentyten' )->ID ); $this->assertEquals( $original_css, wp_get_custom_css( $this->setting->stylesheet ) ); $this->assertEquals( $original_css, $this->setting->value() ); + $this->assertEquals( $twentyten_css, wp_get_custom_css( 'twentyten' ) ); + $this->assertEquals( $twentyten_css, $twentyten_setting->value() ); $updated_css = 'body { color: blue; }'; $this->wp_customize->set_post_value( $this->setting->id, $updated_css ); @@ -138,6 +157,14 @@ class Test_WP_Customize_Custom_CSS_Setting extends WP_UnitTestCase { $this->setting->preview(); $this->assertEquals( $previewed_css, $this->setting->value() ); $this->assertEquals( $previewed_css, wp_get_custom_css( $this->setting->stylesheet ) ); + + wp_delete_post( $post_id ); + $this->assertNull( wp_get_custom_css_post() ); + $this->assertNull( wp_get_custom_css_post( get_stylesheet() ) ); + $this->assertEquals( $previewed_css, wp_get_custom_css( get_stylesheet() ), 'Previewed value remains in spite of deleted post.' ); + wp_delete_post( $twentyten_post_id ); + $this->assertNull( wp_get_custom_css_post( 'twentyten' ) ); + $this->assertEquals( '', wp_get_custom_css( 'twentyten' ) ); } /**