WordPress.org

Make WordPress Core

Ticket #15459: 15459.5.diff

File 15459.5.diff, 7.1 KB (added by rodrigosprimo, 6 years ago)

Add basic test coverage

  • src/wp-admin/includes/class-wp-posts-list-table.php

    diff --git src/wp-admin/includes/class-wp-posts-list-table.php src/wp-admin/includes/class-wp-posts-list-table.php
    index 076ee7d..f1d83a8 100644
    class WP_Posts_List_Table extends WP_List_Table { 
    450450                $count = 0;
    451451                $start = ( $pagenum - 1 ) * $per_page;
    452452                $end = $start + $per_page;
     453                $to_display = array();
    453454
    454455                foreach ( $pages as $page ) {
    455456                        if ( $count >= $end )
    456457                                break;
    457458
    458459                        if ( $count >= $start ) {
    459                                 echo "\t";
    460                                 $this->single_row( $page, $level );
     460                                $to_display[$page->ID] = $level;
    461461                        }
    462462
    463463                        $count++;
    464464
    465465                        if ( isset( $children_pages ) )
    466                                 $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
     466                                $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
    467467                }
    468468
    469469                // If it is the last pagenum and there are orphaned pages, display them with paging as well.
    class WP_Posts_List_Table extends WP_List_Table { 
    474474                                                break;
    475475
    476476                                        if ( $count >= $start ) {
    477                                                 echo "\t";
    478                                                 $this->single_row( $op, 0 );
     477                                                $to_display[$op->ID] = 0;
    479478                                        }
    480479
    481480                                        $count++;
    482481                                }
    483482                        }
    484483                }
     484
     485                $ids = array_keys( $to_display );
     486                _prime_post_caches( $ids );
     487
     488                if ( ! isset( $GLOBALS['post'] ) ) {
     489                        // touch_time() requires a global post set
     490                        $GLOBALS['post'] = array_shift( $ids );
     491                }
     492
     493                foreach ( $to_display as $page_id => $level ) {
     494                        echo "\t";
     495                        $this->single_row( $page_id, $level );
     496                }
    485497        }
    486498
    487499        /**
    class WP_Posts_List_Table extends WP_List_Table { 
    496508         * @param int $level
    497509         * @param int $pagenum
    498510         * @param int $per_page
     511         * @param array $to_display list of pages to be displayed
    499512         */
    500         private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
     513        private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page, &$to_display ) {
    501514
    502515                if ( ! isset( $children_pages[$parent] ) )
    503516                        return;
    class WP_Posts_List_Table extends WP_List_Table { 
    515528                                $my_parents = array();
    516529                                $my_parent = $page->post_parent;
    517530                                while ( $my_parent ) {
    518                                         $my_parent = get_post( $my_parent );
     531                                        // Get the ID from the list or the attribute if my_parent is an object
     532                                        $parent_id = $my_parent;
     533                                        if ( is_object( $my_parent ) ) {
     534                                                $parent_id = $my_parent->ID;
     535                                        }
     536
     537                                        $my_parent = get_post( $parent_id );
    519538                                        $my_parents[] = $my_parent;
    520539                                        if ( !$my_parent->post_parent )
    521540                                                break;
    class WP_Posts_List_Table extends WP_List_Table { 
    523542                                }
    524543                                $num_parents = count( $my_parents );
    525544                                while ( $my_parent = array_pop( $my_parents ) ) {
    526                                         echo "\t";
    527                                         $this->single_row( $my_parent, $level - $num_parents );
     545                                        $to_display[$my_parent->ID] = $level - $num_parents;
    528546                                        $num_parents--;
    529547                                }
    530548                        }
    531549
    532550                        if ( $count >= $start ) {
    533                                 echo "\t";
    534                                 $this->single_row( $page, $level );
     551                                $to_display[$page->ID] = $level;
    535552                        }
    536553
    537554                        $count++;
    538555
    539                         $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
     556                        $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
    540557                }
    541558
    542559                unset( $children_pages[$parent] ); //required in order to keep track of orphans
    class WP_Posts_List_Table extends WP_List_Table { 
    547564                static $alternate;
    548565
    549566                $global_post = get_post();
     567
     568                if ( is_integer( $post ) ) {
     569                        $post = get_post( $post );
     570                }
     571
    550572                $GLOBALS['post'] = $post;
    551573                setup_postdata( $post );
    552574
  • src/wp-admin/includes/post.php

    diff --git src/wp-admin/includes/post.php src/wp-admin/includes/post.php
    index d230667..f30ddc6 100644
    function wp_edit_posts_query( $q = false ) { 
    985985                $query['order'] = 'asc';
    986986                $query['posts_per_page'] = -1;
    987987                $query['posts_per_archive_page'] = -1;
     988                $query['fields'] = 'id=>parent';
    988989        }
    989990
    990991        if ( ! empty( $q['show_sticky'] ) )
  • src/wp-includes/class-wp.php

    diff --git src/wp-includes/class-wp.php src/wp-includes/class-wp.php
    index 4edcaf7..98a140c 100644
    class WP { 
    2525         * @since 2.0.0
    2626         * @var array
    2727         */
    28         public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in' );
     28        public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in', 'fields' );
    2929
    3030        /**
    3131         * Extra query variables set by the user.
  • tests/phpunit/tests/admin/includesListTable.php

    diff --git tests/phpunit/tests/admin/includesListTable.php tests/phpunit/tests/admin/includesListTable.php
    index e69de29..e88f777 100644
     
     1<?php
     2
     3/**
     4 * @group admin
     5 */
     6class Tests_Admin_includesListTable extends WP_UnitTestCase {
     7        function setUp() {
     8                set_current_screen( 'edit-page' );
     9                $GLOBALS['hook_suffix'] = '';
     10                $this->table = _get_list_table( 'WP_Posts_List_Table' );
     11
     12                parent::setUp();
     13
     14                // create top level pages
     15                $num_posts = 5;
     16                foreach ( range( 1, $num_posts ) as $i ) {
     17                        $this->pages[] = $this->factory->post->create_and_get( array(
     18                                'post_type' => 'page',
     19                        ) );
     20                }
     21
     22                // create child pages
     23                $num_posts = 3;
     24                foreach ( $this->pages as $page ) {
     25                        foreach ( range( 1, $num_posts ) as $i ) {
     26                                $this->pages[] = $this->factory->post->create_and_get(
     27                                        array(
     28                                                'post_type' => 'page',
     29                                                'post_parent' => $page->ID,
     30                                        )
     31                                );
     32                        }
     33                }
     34        }
     35
     36        /**
     37         * @ticket 15459
     38         */
     39        function test_list_hierarchical_pages_first_page() {
     40                $this->_test_list_hierarchical_page( 1, array( 'post-3', 'post-8' ), 2 );
     41        }
     42
     43        /**
     44         * @ticket 15459
     45         */
     46        function test_list_hierarchical_pages_second_page() {
     47                $this->_test_list_hierarchical_page( 2, array( 'post-23', 'post-29', 'post-30' ), 3 );
     48        }
     49
     50        /**
     51         * Helper function to test the output of a
     52         * WP_Posts_List_Table page
     53         *
     54         * @param $page_num
     55         * @param $expected_ids
     56         * @param $expected_count
     57         */
     58        protected function _test_list_hierarchical_page( $page_num, $expected_ids, $expected_count ) {
     59                global $per_page;
     60
     61                $matches = array();
     62                $per_page = 2;
     63                $_REQUEST['paged'] = $page_num;
     64                $this->table->hierarchical_display = true;
     65
     66                ob_start();
     67                $this->table->display_rows( $this->pages );
     68                $output = ob_get_clean();
     69                preg_match_all( '|<tr[^>]*>|', $output, $matches );
     70
     71                $this->assertCount( $expected_count, array_keys( $matches[0] ) );
     72
     73                foreach ( $expected_ids as $id ) {
     74                        $this->assertContains( $id, $output );
     75                }
     76        }
     77}