WordPress.org

Make WordPress Core

Ticket #45089: 45089-2.diff

File 45089-2.diff, 5.5 KB (added by birgire, 2 months ago)
  • src/wp-admin/includes/class-wp-list-table.php

    diff --git src/wp-admin/includes/class-wp-list-table.php src/wp-admin/includes/class-wp-list-table.php
    index 53ef0bc..f6a770e 100644
    class WP_List_Table { 
    909909        }
    910910
    911911        /**
    912          * Get a list of sortable columns. The format is:
    913          * 'internal-name' => 'orderby'
    914          * or
    915          * 'internal-name' => array( 'orderby', true )
     912         * Get a list of sortable columns.
    916913         *
    917          * The second format will make the initial sorting order be descending
     914         * The format is:
     915         * - `'internal-name' => 'orderby'`
     916         * - `'internal-name' => array( 'orderby', 'asc' )` - The second element set the initial sorting order.
     917         * - `'internal-name' => array( 'orderby', true )` - The second element will make the initial sorting order be descending.
    918918         *
    919919         * @since 3.1.0
    920920         *
    class WP_List_Table { 
    11261126                                        $class[] = 'sorted';
    11271127                                        $class[] = $current_order;
    11281128                                } else {
    1129                                         $order   = $desc_first ? 'desc' : 'asc';
     1129                                        if ( in_array( strtolower( $desc_first ), array( 'desc', 'asc' ), true ) ) {
     1130                                                $order = 'asc' === strtolower( $desc_first ) ? 'desc' : 'asc';
     1131                                        } else {
     1132                                                $order = $desc_first ? 'desc' : 'asc';
     1133                                        }
    11301134                                        $class[] = 'sortable';
    1131                                         $class[] = $desc_first ? 'asc' : 'desc';
     1135                                        $class[] = 'desc' === $order ? 'asc' : 'desc';
    11321136                                }
    11331137
    11341138                                $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
  • tests/phpunit/tests/admin/includesListTable.php

    diff --git tests/phpunit/tests/admin/includesListTable.php tests/phpunit/tests/admin/includesListTable.php
    index ff18d4a..a91c129 100644
    class Tests_Admin_includesListTable extends WP_UnitTestCase { 
    293293
    294294                $this->assertNotContains( 'id="delete_all"', $output );
    295295        }
     296
     297        /**
     298         * @ticket 45089
     299         */
     300        public function test_sortable_columns() {
     301                require_once ABSPATH . 'wp-admin/includes/class-wp-comments-list-table.php';
     302
     303                $override_sortable_columns = array(
     304                        'author'   => array( 'comment_author', true ),
     305                        'response' => 'comment_post_ID',
     306                        'date'     => array( 'comment_date', 'dEsC' ), // The ordering support should be case insensitive.
     307                );
     308
     309                // Stub the get_sortable_columns() method.
     310                $object = $this->getMockBuilder( 'WP_Comments_List_Table' )
     311                        ->setConstructorArgs( array( array( 'screen' => 'edit-comments' ) ) )
     312                        ->setMethods( array( 'get_sortable_columns' ) )
     313                        ->getMock();
     314
     315                // Change the null return value of the stubbed get_sortable_columns() method.
     316                $object->method( 'get_sortable_columns' )
     317                        ->willReturn( $override_sortable_columns );
     318
     319                $output = get_echo( array( $object, 'print_column_headers' ) );
     320
     321                $this->assertContains( '?orderby=comment_author&#038;order=desc', $output, 'Mismatch of the default link ordering for comment author column. Should be desc.' );
     322                $this->assertContains( 'column-author sortable asc', $output, 'Mismatch of CSS classes for the comment author column.' );
     323
     324                $this->assertContains( '?orderby=comment_post_ID&#038;order=asc', $output, 'Mismatch of the default link ordering for comment response column. Should be asc.' );
     325                $this->assertContains( 'column-response sortable desc', $output, 'Mismatch of CSS classes for the comment post ID column.' );
     326
     327                $this->assertContains( '?orderby=comment_date&#038;order=asc', $output, 'Mismatch of the default link ordering for comment author column. Should be asc.' );
     328                $this->assertContains( 'column-date sortable desc', $output, 'Mismatch of CSS classes for the comment date column.' );
     329        }
     330
     331        /**
     332         * @ticket 45089
     333         */
     334        public function test_sortable_columns_with_current_ordering() {
     335                require_once ABSPATH . 'wp-admin/includes/class-wp-comments-list-table.php';
     336
     337                $override_sortable_columns = array(
     338                        'author'   => array( 'comment_author', false ),
     339                        'response' => 'comment_post_ID',
     340                        'date'     => array( 'comment_date', 'asc' ), // We will override this with current ordering.
     341                );
     342
     343                // Current ordering.
     344                $_GET['orderby'] = 'comment_date';
     345                $_GET['order']   = 'desc';
     346
     347                // Stub the get_sortable_columns() method.
     348                $object = $this->getMockBuilder( 'WP_Comments_List_Table' )
     349                        ->setConstructorArgs( array( array( 'screen' => 'edit-comments' ) ) )
     350                        ->setMethods( array( 'get_sortable_columns' ) )
     351                        ->getMock();
     352
     353                // Change the null return value of the stubbed get_sortable_columns() method.
     354                $object->method( 'get_sortable_columns' )
     355                        ->willReturn( $override_sortable_columns );
     356
     357                $output = get_echo( array( $object, 'print_column_headers' ) );
     358
     359                $this->assertContains( '?orderby=comment_author&#038;order=asc', $output, 'Mismatch of the default link ordering for comment author column. Should be asc.' );
     360                $this->assertContains( 'column-author sortable desc', $output, 'Mismatch of CSS classes for the comment author column.' );
     361
     362                $this->assertContains( '?orderby=comment_post_ID&#038;order=asc', $output, 'Mismatch of the default link ordering for comment response column. Should be asc.' );
     363                $this->assertContains( 'column-response sortable desc', $output, 'Mismatch of CSS classes for the comment post ID column.' );
     364
     365                $this->assertContains( '?orderby=comment_date&#038;order=asc', $output, 'Mismatch of the current link ordering for comment date column. Should be asc.' );
     366                $this->assertContains( 'column-date sorted desc', $output, 'Mismatch of CSS classes for the comment date column.' );
     367        }
     368
    296369}