Make WordPress Core

Ticket #40188: 40188.3.diff

File 40188.3.diff, 5.7 KB (added by whyisjake, 4 years ago)
  • src/wp-admin/includes/class-wp-comments-list-table.php

     
    387387                if ( ! isset( $has_items ) ) {
    388388                        $has_items = $this->has_items();
    389389                }
    390                 ?>
    391                 <div class="alignleft actions">
    392                 <?php
     390                echo '<div class="alignleft actions">';
    393391                if ( 'top' === $which ) {
    394                         ?>
    395         <label class="screen-reader-text" for="filter-by-comment-type"><?php _e( 'Filter by comment type' ); ?></label>
    396         <select id="filter-by-comment-type" name="comment_type">
    397                 <option value=""><?php _e( 'All comment types' ); ?></option>
    398                         <?php
    399                                 /**
    400                                  * Filters the comment types dropdown menu.
    401                                  *
    402                                  * @since 2.7.0
    403                                  *
    404                                  * @param string[] $comment_types An array of comment types. Accepts 'Comments', 'Pings'.
    405                                  */
    406                                 $comment_types = apply_filters(
    407                                         'admin_comment_types_dropdown',
    408                                         array(
    409                                                 'comment' => __( 'Comments' ),
    410                                                 'pings'   => __( 'Pings' ),
    411                                         )
    412                                 );
     392                        ob_start();
    413393
    414                         foreach ( $comment_types as $type => $label ) {
    415                                 echo "\t" . '<option value="' . esc_attr( $type ) . '"' . selected( $comment_type, $type, false ) . ">$label</option>\n";
    416                         }
    417                         ?>
    418         </select>
    419                         <?php
     394                        $this->comment_status_dropdown( $comment_type );
    420395                        /**
    421396                         * Fires just before the Filter submit button for comment types.
    422397                         *
    423398                         * @since 3.5.0
    424399                         */
    425400                        do_action( 'restrict_manage_comments' );
    426                         submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
     401
     402                        $output = ob_get_clean();
     403
     404                        if ( ! empty( $output ) && $this->has_items() ) {
     405                                echo $output;
     406                                submit_button( esc_html__( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
     407                        }
    427408                }
    428409
    429410                if ( ( 'spam' === $comment_status || 'trash' === $comment_status ) && current_user_can( 'moderate_comments' ) && $has_items ) {
     
    481462        }
    482463
    483464        /**
     465         * Displays a comment status drop-down for filtering on the Comments list table.
     466         *
     467         * @since 5.5.0
     468         *
     469         * @param string $comment_type The current comment type slug.
     470         */
     471        protected function comment_status_dropdown( $comment_type ) {
     472                /**
     473                 * Filters the comment types dropdown menu.
     474                 *
     475                 * @since 2.7.0
     476                 *
     477                 * @param array $comment_types An array of comment types. Accepts 'Comments', 'Pings'.
     478                 */
     479                $comment_types = apply_filters(
     480                        'admin_comment_types_dropdown',
     481                        array(
     482                                'comment' => esc_html__( 'Comments' ),
     483                                'pings'   => esc_html__( 'Pings' ),
     484                        )
     485                );
     486
     487                if ( $comment_types && is_array( $comment_types ) ) {
     488                        printf( '<label class="screen-reader-text" for="filter-by-comment-type">%s</label>', esc_html__( 'Filter by comment type' ) );
     489
     490                        echo '<select id="filter-by-comment-type" name="comment_type">';
     491
     492                        printf( "\t<option value=''>%s</option>", esc_html__( 'All comment types' ) );
     493
     494                        foreach ( $comment_types as $type => $label ) {
     495                                if ( get_comments(
     496                                        array(
     497                                                'number' => 1,
     498                                                'type'   => $type,
     499                                        )
     500                                ) ) {
     501                                        printf(
     502                                                "\t<option value='%s'%s>%s</option>\n",
     503                                                esc_attr( $type ),
     504                                                selected( $comment_type, $type, false ),
     505                                                esc_html( $label )
     506                                        );
     507                                }
     508                        }
     509                                echo '</select>';
     510                }
     511        }
     512
     513        /**
    484514         * @return array
    485515         */
    486516        protected function get_sortable_columns() {
     
    511541         */
    512542        public function display() {
    513543                wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
     544                static $has_items;
    514545
    515                 $this->display_tablenav( 'top' );
     546                if ( ! isset( $has_items ) ) {
     547                        $has_items = $this->has_items();
     548                        if ( $has_items ) {
     549                                $this->display_tablenav( 'top' );
     550                        }
     551                }
    516552
    517553                $this->screen->render_screen_reader_content( 'heading_list' );
    518554
  • tests/phpunit/tests/admin/includesListTable.php

     
    282282        }
    283283
    284284        /**
     285         * @ticket 40188
     286         */
     287        public function test_filter_button_should_not_be_shown_if_there_are_no_comments() {
     288                $table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
     289
     290                ob_start();
     291                $table->extra_tablenav( 'top' );
     292                $output = ob_get_clean();
     293       
     294                $this->assertNotContains( 'id="post-query-submit"', $output );
     295        }
     296
     297        /**
     298         * @ticket 40188
     299         */
     300        public function test_filter_button_should_be_shown_if_there_are_comments() {
     301                $post_id    = self::factory()->post->create();
     302                 $comment_id = self::factory()->comment->create( array( 'comment_post_ID' => $post_id, 'comment_approved' => '1' ) );
     303
     304                $table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
     305                $table->prepare_items();
     306
     307                ob_start();
     308                $table->extra_tablenav( 'top' );
     309                $output = ob_get_clean();
     310
     311                $this->assertContains( 'id="post-query-submit"', $output );
     312        }
     313
     314        /**
     315         * @ticket 40188
     316         */
     317        public function test_filter_comment_status_dropdown_should_be_shown_if_there_are_comments() {
     318                $post_id    = self::factory()->post->create();
     319                $comment_id = self::factory()->comment->create( array( 'comment_post_ID' => $post_id, 'comment_approved' => '1' ) );
     320
     321                $table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
     322                $table->prepare_items();
     323
     324                ob_start();
     325                $table->extra_tablenav( 'top' );
     326                $output = ob_get_clean();
     327
     328                $this->assertContains( 'id="filter-by-comment-type"', $output );
     329                $this->assertContains( "<option value='comment'>", $output );
     330        }
     331
     332        /**
    285333         * @ticket 38341
    286334         */
    287335        public function test_empty_trash_button_should_not_be_shown_if_there_are_no_comments() {