From e720a9ddc7ff7738584dc031e56727040dca0248 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 28 Nov 2019 13:40:19 +0000 Subject: [PATCH] Date/Time: Make `get_permalink()` more resilient against PHP timezone changes. Overriding default PHP timezone with `date_default_timezone_set()`, while not recommended, should not inadvertently result in changing existing permalinks. Add a unit test. Props Rarst, steevithak, archon810, maciejmackowiak, Ov3rfly, Cybr, hometowntrailers, scvleon, miette49. Fixes #48623. git-svn-id: https://develop.svn.wordpress.org/trunk@46795 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 15 +++++---- tests/phpunit/tests/date/getPermalink.php | 39 +++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 tests/phpunit/tests/date/getPermalink.php diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index 9419633632..5698ded47a 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -166,7 +166,6 @@ function get_permalink( $post = 0, $leavename = false ) { $permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename ); if ( '' != $permalink && ! in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft', 'future' ) ) ) { - $unixtime = strtotime( $post->post_date ); $category = ''; if ( strpos( $permalink, '%category%' ) !== false ) { @@ -212,9 +211,11 @@ function get_permalink( $post = 0, $leavename = false ) { $author = $authordata->user_nicename; } - $date = explode( ' ', gmdate( 'Y m d H i s', $unixtime ) ); - $rewritereplace = - array( + // This is not an API call because the permalink is based on the stored post_date value, + // which should be parsed as local time regardless of the default PHP timezone. + $date = explode( ' ', str_replace( array( '-', ':' ), ' ', $post->post_date ) ); + + $rewritereplace = array( $date[0], $date[1], $date[2], @@ -227,8 +228,10 @@ function get_permalink( $post = 0, $leavename = false ) { $author, $post->post_name, ); - $permalink = home_url( str_replace( $rewritecode, $rewritereplace, $permalink ) ); - $permalink = user_trailingslashit( $permalink, 'single' ); + + $permalink = home_url( str_replace( $rewritecode, $rewritereplace, $permalink ) ); + $permalink = user_trailingslashit( $permalink, 'single' ); + } else { // if they're not using the fancy permalink option $permalink = home_url( '?p=' . $post->ID ); } diff --git a/tests/phpunit/tests/date/getPermalink.php b/tests/phpunit/tests/date/getPermalink.php new file mode 100644 index 0000000000..0b6d86b13f --- /dev/null +++ b/tests/phpunit/tests/date/getPermalink.php @@ -0,0 +1,39 @@ +post->create( + array( + 'post_date' => '2018-07-22 21:13:23', + 'post_date_gmt' => '2018-07-23 03:13:23', + ) + ); + + $this->assertEquals( 'http://example.org/2018/07/22/21/13/23', get_permalink( $post_id ) ); + + date_default_timezone_set( $timezone ); + $this->assertEquals( 'http://example.org/2018/07/22/21/13/23', get_permalink( $post_id ) ); + } +}