300, 'no_premium' => 140, 'already_exists' => 160, ); /** * Search Console table class constructor (subclasses list table). * * @param string $platform Platform (desktop, mobile, feature phone). * @param string $category Type of the issues. * @param array $items Set of the issues to display. */ public function __construct( $platform, $category, array $items ) { parent::__construct(); // Adding the thickbox. add_thickbox(); // Set search string. if ( ( $search_string = filter_input( INPUT_GET, 's' ) ) != '' ) { $this->search_string = $search_string; } $this->current_view = $category; // Set the crawl issue source. $this->show_fields( $platform ); $this->items = $items; } /** * Getting the screen id from this table * * @return string */ public function get_screen_id() { return $this->screen->id; } /** * Setup the table variables, fetch the items from the database, search, sort and format the items. */ public function prepare_items() { // Get variables needed for pagination. $this->per_page = $this->get_items_per_page( 'errors_per_page', $this->per_page ); $this->current_page = intval( ( $paged = filter_input( INPUT_GET, 'paged' ) ) ? $paged : 1 ); $this->setup_columns(); $this->views(); $this->parse_items(); } /** * Set the table columns * * @return array */ public function get_columns() { $columns = array( 'cb' => '', 'url' => __( 'URL', 'wordpress-seo' ), 'last_crawled' => __( 'Last crawled', 'wordpress-seo' ), 'first_detected' => __( 'First detected', 'wordpress-seo' ), 'response_code' => __( 'Response code', 'wordpress-seo' ), ); return $columns; } /** * Return the columns that are sortable * * @return array */ protected function get_sortable_columns() { $sortable_columns = array( 'url' => array( 'url', false ), 'last_crawled' => array( 'last_crawled', false ), 'first_detected' => array( 'first_detected', false ), 'response_code' => array( 'response_code', false ), ); return $sortable_columns; } /** * Return available bulk actions * * @return array */ protected function get_bulk_actions() { return array( 'mark_as_fixed' => __( 'Mark as fixed', 'wordpress-seo' ), ); } /** * Default method to display a column * * @param array $item Data array. * @param string $column_name Column name key. * * @return mixed */ protected function column_default( $item, $column_name ) { return $item[ $column_name ]; } /** * Checkbox column * * @param array $item Item data array. * * @return string */ protected function column_cb( $item ) { return sprintf( '', $item['url'] ); } /** * Formatting the output of the column last crawled into a dateformat * * @param array $item Item data array. * * @return string */ protected function column_last_crawled( $item ) { return date_i18n( get_option( 'date_format' ), strtotime( $item['last_crawled'] ) ); } /** * Formatting the output of the column first detected into a dateformat * * @param array $item Item data array. * * @return string */ protected function column_first_detected( $item ) { return date_i18n( get_option( 'date_format' ), strtotime( $item['first_detected'] ) ); } /** * URL column * * @param array $item Item data array. * * @return string */ protected function column_url( $item ) { $actions = array(); if ( $this->can_create_redirect() ) { /** * Modal box */ $modal_height = $this->modal_box( $item['url'] ); $actions['create_redirect'] = '' . __( 'Create redirect', 'wordpress-seo' ) . ''; } $actions['view'] = '' . __( 'View', 'wordpress-seo' ) . ''; $actions['markasfixed'] = '' . __( 'Mark as fixed', 'wordpress-seo' ) . ''; return sprintf( '%1$s %2$s', $item['url'], $this->row_actions( $actions ) ); } /** * Running the setup of the columns */ private function setup_columns() { $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns() ); } /** * Check if the current category allow creating redirects * * @return bool */ private function can_create_redirect() { return in_array( $this->current_view, array( 'soft_404', 'not_found', 'access_denied' ) ); } /** * Setting the table navigation * * @param int $total_items Total number of items. * @param int $posts_per_page Number of items per page. */ private function set_pagination( $total_items, $posts_per_page ) { $this->set_pagination_args( array( 'total_items' => $total_items, 'total_pages' => ceil( ( $total_items / $posts_per_page ) ), 'per_page' => $posts_per_page, ) ); } /** * Setting the items */ private function parse_items() { if ( is_array( $this->items ) && count( $this->items ) > 0 ) { if ( ! empty( $this->search_string ) ) { $this->do_search(); } $this->set_pagination( count( $this->items ), $this->per_page ); $this->sort_items(); $this->paginate_items(); } } /** * Search through the items */ private function do_search() { $results = array(); foreach ( $this->items as $item ) { foreach ( $item as $value ) { if ( stristr( $value, $this->search_string ) !== false ) { $results[] = $item; continue; } } } $this->items = $results; } /** * Running the pagination */ private function paginate_items() { // Setting the starting point. If starting point is below 1, overwrite it with value 0, otherwise it will be sliced of at the back. $slice_start = ( $this->current_page - 1 ); if ( $slice_start < 0 ) { $slice_start = 0; } // Apply 'pagination'. $this->items = array_slice( $this->items, ( $slice_start * $this->per_page ), $this->per_page ); } /** * Sort the items by callback */ private function sort_items() { // Sort the results. usort( $this->items, array( $this, 'do_reorder' ) ); } /** * Doing the sorting of the issues * * @param array $a First data set for comparison. * @param array $b Second data set for comparison. * * @return int */ private function do_reorder( $a, $b ) { // If no sort, default to title. $orderby = ( $orderby = filter_input( INPUT_GET, 'orderby' ) ) ? $orderby : 'url'; // If no order, default to asc. $order = ( $order = filter_input( INPUT_GET, 'order' ) ) ? $order : 'asc'; // When there is a raw field of it, sort by this field. if ( array_key_exists( $orderby . '_raw', $a ) && array_key_exists( $orderby . '_raw', $b ) ) { $orderby = $orderby . '_raw'; } // Determine sort order. $result = strcmp( $a[ $orderby ], $b[ $orderby ] ); // Send final sort direction to usort. return ( $order === 'asc' ) ? $result : ( - $result ); } /** * Modal box * * @param string $url URL string. * * @return string */ private function modal_box( $url ) { $current_redirect = false; $view_type = $this->modal_box_type( $url, $current_redirect ); require WPSEO_PATH . '/admin/google_search_console/views/gsc-create-redirect.php'; return $view_type; } /** * Determine which model box type should be rendered * * @param string $url URL string. * @param string $current_redirect Current redirect by reference. * * @return string */ private function modal_box_type( $url, &$current_redirect ) { if ( defined( 'WPSEO_PREMIUM_FILE' ) && class_exists( 'WPSEO_Redirect_Manager' ) ) { static $redirect_manager; if ( ! $redirect_manager ) { $redirect_manager = new WPSEO_Redirect_Manager(); } if ( $current_redirect = $redirect_manager->get_redirect( $url ) ) { return 'already_exists'; } return 'create'; } return 'no_premium'; } /** * Showing the hidden fields used by the AJAX requests * * @param string $platform Platform (desktop, mobile, feature phone). */ private function show_fields( $platform ) { echo ""; echo ""; echo ""; } }