Make WordPress Core

Changeset 62968


Ignore:
Timestamp:
08/02/2026 10:23:00 PM (7 days ago)
Author:
joedolson
Message:

Widgets: Show post excerpts in On This Day widget if no title.

Match the behavior of posts in list tables by showing a short excerpt in the On This Day widget when the post does not have a saved title.

Developed in https://github.com/WordPress/wordpress-develop/pull/12581

Props alshakero, softglaze, iamraju, mirmpro, shailu25, bph, nazmulasif, wildworks, annezazu, mukesh27, peterwilsoncc, joedolson.
Fixes #65658.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/dashboard-on-this-day.php

    r62681 r62968  
    115115                                                <?php foreach ( $year_posts as $year_post ) : ?>
    116116                                                        <?php
    117                                                         $title = get_the_title( $year_post );
     117                                                        $title            = get_the_title( $year_post );
     118                                                        $no_title_excerpt = '';
    118119
    119120                                                        if ( '' === trim( $title ) ) {
    120121                                                                $title = __( '(no title)' );
     122
     123                                                                if ( current_user_can( 'read_post', $year_post->ID ) && ! post_password_required( $year_post ) ) {
     124                                                                        $excerpt = get_the_excerpt( $year_post );
     125
     126                                                                        if ( is_string( $excerpt ) && '' !== $excerpt ) {
     127                                                                                $no_title_excerpt = wp_trim_words( $excerpt, 15 );
     128                                                                        }
     129                                                                }
    121130                                                        }
    122131
     
    126135                                                        ?>
    127136                                                        <li>
    128                                                                 <a href="<?php echo esc_url( get_permalink( $year_post ) ); ?>"><?php echo esc_html( $title ); ?></a>
     137                                                                <a href="<?php echo esc_url( get_permalink( $year_post ) ); ?>">
     138                                                                        <?php echo esc_html( $title ); ?>
     139                                                                        <?php
     140                                                                        if ( '' !== $no_title_excerpt ) {
     141                                                                                echo esc_html( $no_title_excerpt );
     142                                                                        }
     143                                                                        ?>
     144                                                                </a>
    129145                                                                <?php if ( $show_author ) : ?>
    130146                                                                        <?php
  • trunk/tests/phpunit/tests/admin/wpDashboardOnThisDay.php

    r62852 r62968  
    5959         * @param int    $years_ago Number of years before today.
    6060         * @param string $time      Post time.
     61         * @param array  $post_args Additional post arguments.
    6162         * @return int Post ID.
    6263         */
     
    6566                string $title = 'A memory from last year',
    6667                int $years_ago = 1,
    67                 string $time = '12:00:00'
     68                string $time = '12:00:00',
     69                array $post_args = array()
    6870        ): int {
    6971                $post_date = current_datetime()->modify( '-' . $years_ago . ' years' )->format( 'Y-m-d' ) . ' ' . $time;
    7072
    7173                return self::factory()->post->create(
    72                         array(
    73                                 'post_author'   => $author_id,
    74                                 'post_date'     => $post_date,
    75                                 'post_date_gmt' => get_gmt_from_date( $post_date ),
    76                                 'post_status'   => 'publish',
    77                                 'post_title'    => $title,
     74                        array_merge(
     75                                array(
     76                                        'post_author'   => $author_id,
     77                                        'post_date'     => $post_date,
     78                                        'post_date_gmt' => get_gmt_from_date( $post_date ),
     79                                        'post_status'   => 'publish',
     80                                        'post_title'    => $title,
     81                                ),
     82                                $post_args
    7883                        )
    7984                );
     
    340345         *
    341346         * @covers ::wp_dashboard_on_this_day
     347         */
     348        public function test_widget_includes_trimmed_excerpt_for_untitled_posts() {
     349                wp_set_current_user( self::$user_id );
     350
     351                $words = array();
     352                for ( $n = 1; $n <= 20; $n++ ) {
     353                        $words[] = 'word' . $n;
     354                }
     355
     356                $this->create_matching_post(
     357                        self::$user_id,
     358                        '',
     359                        1,
     360                        '12:00:00',
     361                        array(
     362                                'post_excerpt' => implode( ' ', $words ),
     363                        )
     364                );
     365
     366                ob_start();
     367                wp_dashboard_on_this_day();
     368                $output = ob_get_clean();
     369
     370                $this->assertStringContainsString( '(no title)', $output );
     371                $this->assertStringContainsString( 'word15', $output, 'The 15th word should be present.' );
     372                $this->assertStringNotContainsString( 'word16', $output, 'The 16th word should be trimmed.' );
     373                $this->assertStringContainsString( '&hellip;', $output, 'The excerpt should end with an ellipsis.' );
     374        }
     375
     376        /**
     377         * @ticket 65116
     378         *
     379         * @covers ::wp_dashboard_on_this_day
     380         */
     381        public function test_widget_does_not_append_excerpt_to_titled_posts() {
     382                wp_set_current_user( self::$user_id );
     383
     384                $this->create_matching_post(
     385                        self::$user_id,
     386                        'A titled anniversary memory',
     387                        1,
     388                        '12:00:00',
     389                        array(
     390                                'post_excerpt' => 'This excerpt should not be shown.',
     391                        )
     392                );
     393
     394                ob_start();
     395                wp_dashboard_on_this_day();
     396                $output = ob_get_clean();
     397
     398                $this->assertStringContainsString( 'A titled anniversary memory', $output );
     399                $this->assertStringNotContainsString( 'This excerpt should not be shown.', $output );
     400        }
     401
     402        /**
     403         * @ticket 65116
     404         *
     405         * @covers ::wp_dashboard_on_this_day
     406         */
     407        public function test_widget_includes_trimmed_excerpt_for_untitled_private_posts_authored_by_current_user() {
     408                $this->set_up_dashboard_screen();
     409
     410                wp_set_current_user( self::$user_id );
     411
     412                $this->create_matching_post(
     413                        self::$user_id,
     414                        '',
     415                        1,
     416                        '12:00:00',
     417                        array(
     418                                'post_excerpt' => 'Readable private anniversary memory.',
     419                                'post_status'  => 'private',
     420                        )
     421                );
     422
     423                add_filter( 'wp_dashboard_on_this_day_query_args', array( $this, 'filter_on_this_day_query_private_posts' ) );
     424
     425                ob_start();
     426                try {
     427                        wp_dashboard_on_this_day();
     428                        $output = ob_get_clean();
     429                } finally {
     430                        remove_filter( 'wp_dashboard_on_this_day_query_args', array( $this, 'filter_on_this_day_query_private_posts' ) );
     431                }
     432
     433                $this->assertStringContainsString( '(no title)', $output );
     434                $this->assertStringContainsString( 'Readable private anniversary memory.', $output );
     435        }
     436
     437        /**
     438         * @ticket 65116
     439         *
     440         * @covers ::wp_dashboard_on_this_day
     441         */
     442        public function test_widget_hides_untitled_post_excerpt_for_unreadable_posts() {
     443                $this->set_up_dashboard_screen();
     444
     445                wp_set_current_user( self::$user_id );
     446
     447                $post_id = $this->create_matching_post(
     448                        self::$other_user_id,
     449                        '',
     450                        1,
     451                        '12:00:00',
     452                        array(
     453                                'post_excerpt' => 'Unreadable private anniversary memory.',
     454                                'post_status'  => 'private',
     455                        )
     456                );
     457
     458                add_filter( 'wp_dashboard_on_this_day_query_args', array( $this, 'filter_on_this_day_query_private_posts' ) );
     459
     460                ob_start();
     461                try {
     462                        wp_dashboard_on_this_day();
     463                        $output = ob_get_clean();
     464                } finally {
     465                        remove_filter( 'wp_dashboard_on_this_day_query_args', array( $this, 'filter_on_this_day_query_private_posts' ) );
     466                }
     467
     468                $this->assertFalse( current_user_can( 'read_post', $post_id ) );
     469                $this->assertStringContainsString( '(no title)', $output );
     470                $this->assertStringNotContainsString( 'Unreadable private anniversary memory.', $output );
     471        }
     472
     473        /**
     474         * @ticket 65116
     475         *
     476         * @covers ::wp_dashboard_on_this_day
     477         */
     478        public function test_widget_hides_untitled_post_excerpt_for_password_protected_posts() {
     479                $this->set_up_dashboard_screen();
     480
     481                wp_set_current_user( self::$user_id );
     482
     483                $this->create_matching_post(
     484                        self::$user_id,
     485                        '',
     486                        1,
     487                        '12:00:00',
     488                        array(
     489                                'post_excerpt'  => 'Private anniversary memory.',
     490                                'post_password' => 'secret',
     491                        )
     492                );
     493
     494                ob_start();
     495                wp_dashboard_on_this_day();
     496                $output = ob_get_clean();
     497
     498                $this->assertStringNotContainsString( 'Private anniversary memory.', $output );
     499        }
     500
     501        /**
     502         * @covers ::wp_dashboard_on_this_day
    342503         * @covers ::wp_dashboard_on_this_day_get_posts
    343504         */
     
    354515
    355516                $this->assertStringContainsString( '10 posts have been published on <strong>' . wp_date( 'F jS' ) . '</strong>:', $output );
    356                 $this->assertStringContainsString( 'Anniversary post 1<', $output );
    357                 $this->assertStringContainsString( 'Anniversary post 10<', $output );
     517                $this->assertMatchesRegularExpression( '/>\s*Anniversary post 1\s*<\/a>/', $output );
     518                $this->assertMatchesRegularExpression( '/>\s*Anniversary post 10\s*<\/a>/', $output );
    358519                $this->assertStringNotContainsString( 'Anniversary post 11', $output );
    359520        }
     521
     522        /**
     523         * Filters the On This Day query to include private posts.
     524         *
     525         * @param array $args WP_Query arguments.
     526         * @return array Filtered query arguments.
     527         */
     528        public function filter_on_this_day_query_private_posts( $args ) {
     529                $args['post_status'] = array( 'private' );
     530
     531                return $args;
     532        }
    360533}
Note: See TracChangeset for help on using the changeset viewer.