Make WordPress Core


Ignore:
Timestamp:
12/17/2019 02:23:51 AM (5 years ago)
Author:
SergeyBiryukov
Message:

Date/Time: In wp_insert_post(), when checking the post date to set future or publish status, use a proper delta comparison.

[3525] allowed a difference up to 59 seconds between the post date/time and the current time to consider the post published instead of scheduled, but that didn't take start of a new minute into account.

Rapidly creating post fixtures in unit tests could encounter a one-second discrepancy between current_time( 'mysql' ) and gmdate( 'Y-m-d H:i:s' ), returning values like 2019-12-16 23:43:00 vs. 2019-12-16 23:42:59, respectively, and setting the post to a future status instead of publish.

[45851], while working as intended, made the issue somewhat more likely to occur.

This caused all sorts of occasional random failures in various tests on Travis, mostly on PHP 7.1.

Fixes #48145.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/post.php

    r46696 r46968  
    37543754
    37553755    if ( 'attachment' !== $post_type ) {
     3756        $now = gmdate( 'Y-m-d H:i:s' );
     3757
    37563758        if ( 'publish' === $post_status ) {
    3757             // String comparison to work around far future dates (year 2038+) on 32-bit systems.
    3758             if ( $post_date_gmt > gmdate( 'Y-m-d H:i:59' ) ) {
     3759            if ( strtotime( $post_date_gmt ) - strtotime( $now ) >= MINUTE_IN_SECONDS ) {
    37593760                $post_status = 'future';
    37603761            }
    37613762        } elseif ( 'future' === $post_status ) {
    3762             if ( $post_date_gmt <= gmdate( 'Y-m-d H:i:59' ) ) {
     3763            if ( strtotime( $post_date_gmt ) - strtotime( $now ) < MINUTE_IN_SECONDS ) {
    37633764                $post_status = 'publish';
    37643765            }
Note: See TracChangeset for help on using the changeset viewer.