wordpress-develop/tests/phpunit/tests/post/getTheExcerpt.php
Boone Gorges 30c21d2031 Posts: Avoid the use of globals in get_the_content() and related functions.
This changeset introduces `$post` parameters to `get_the_content()` and
`wp_trim_excerpt()`. When a `$post` object is passed to one of these functions,
the functions will operate on the data from that object, rather than from the
post globals (`$authordata`, `$page`, etc). This ensures that the functions work
in a predictable manner when used outside of the regular post loop.

The global-mismatch problem is surfaced in cases where `get_the_excerpt()` is
called outside of the post loop, on posts that don't have a defined excerpt. In
these cases, the post globals - used to generate a fallback excerpt - may refer
to the incorrect object, resulting in PHP notices or other unpredictable
behavior. See #36934 for a related issue.

Props spacedmonkey, kraftbj, Shital Patel.
Fixes #42814.

git-svn-id: https://develop.svn.wordpress.org/trunk@44941 602fd350-edb4-49c9-b593-d223f7449a82
2019-03-20 15:48:46 +00:00

149 lines
3.4 KiB
PHP

<?php
/**
* @group post
* @group formatting
*/
class Tests_Post_GetTheExcerpt extends WP_UnitTestCase {
/**
* @ticket 27246
*/
public function test_the_excerpt_invalid_post() {
$this->assertSame( '', get_echo( 'the_excerpt' ) );
$this->assertSame( '', get_the_excerpt() );
}
/**
* @ticket 27246
* @expectedDeprecated get_the_excerpt
*/
public function test_the_excerpt_deprecated() {
$this->assertSame( '', get_the_excerpt( true ) );
$this->assertSame( '', get_the_excerpt( false ) );
}
/**
* @ticket 27246
*/
public function test_the_excerpt() {
$GLOBALS['post'] = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Post excerpt' ) );
$this->assertSame( "<p>Post excerpt</p>\n", get_echo( 'the_excerpt' ) );
$this->assertSame( 'Post excerpt', get_the_excerpt() );
}
/**
* @ticket 27246
* @ticket 35486
*/
public function test_the_excerpt_password_protected_post() {
$post = self::factory()->post->create_and_get(
array(
'post_excerpt' => 'Post excerpt',
'post_password' => '1234',
)
);
$this->assertSame( 'There is no excerpt because this is a protected post.', get_the_excerpt( $post ) );
$GLOBALS['post'] = $post;
$this->assertSame( "<p>There is no excerpt because this is a protected post.</p>\n", get_echo( 'the_excerpt' ) );
}
/**
* @ticket 27246
*/
public function test_the_excerpt_specific_post() {
$GLOBALS['post'] = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Foo' ) );
$post_id = self::factory()->post->create( array( 'post_excerpt' => 'Bar' ) );
$this->assertSame( 'Bar', get_the_excerpt( $post_id ) );
}
/**
* @ticket 42814
*/
public function test_should_fall_back_on_post_content_if_excerpt_is_empty_and_post_is_inferred_from_context() {
$post_id = self::factory()->post->create(
array(
'post_content' => 'Foo',
'post_excerpt' => '',
)
);
$q = new WP_Query(
array(
'p' => $post_id,
)
);
while ( $q->have_posts() ) {
$q->the_post();
$found = get_the_excerpt();
}
$this->assertSame( 'Foo', $found );
}
/**
* @ticket 42814
*/
public function test_should_fall_back_on_post_content_if_excerpt_is_empty_and_post_is_provided() {
$GLOBALS['post'] = self::factory()->post->create_and_get(
array(
'post_content' => 'Foo',
'post_excerpt' => '',
)
);
$this->assertSame( 'Foo', get_the_excerpt( $GLOBALS['post'] ) );
}
/**
* @ticket 42814
*/
public function test_should_respect_post_parameter_in_the_loop() {
$p1 = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Foo' ) );
$p2 = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Bar' ) );
$q = new WP_Query(
array(
'p' => $p1->ID,
)
);
while ( $q->have_posts() ) {
$q->the_post();
$found = get_the_excerpt( $p2 );
}
$this->assertSame( 'Bar', $found );
}
/**
* @ticket 42814
*/
public function test_should_respect_post_parameter_in_the_loop_when_falling_back_on_post_content() {
$p1 = self::factory()->post->create_and_get(
array(
'post_content' => 'Foo',
'post_excerpt' => '',
)
);
$p2 = self::factory()->post->create_and_get(
array(
'post_content' => 'Bar',
'post_excerpt' => '',
)
);
$q = new WP_Query(
array(
'p' => $p1->ID,
)
);
while ( $q->have_posts() ) {
$q->the_post();
$found = get_the_excerpt( $p2 );
}
$this->assertSame( 'Bar', $found );
}
}