__( 'Tag Cloud', 'simple-tags' ), //singular name of the listed records 'plural' => __( 'Tags Cloud', 'simple-tags' ), //plural name of the listed records 'ajax' => false //does this table support ajax? ] ); } /** * Show single row item * * @param array $item */ public function single_row($item) { $class = ['st-tax-tr']; $id = 'st-tax-' . md5($item->slug); echo sprintf('', esc_attr($id), esc_attr(implode(' ', $class))); $this->single_row_columns($item); echo ''; } /** * Associative array of columns * * @return array */ function get_columns() { $columns = [ 'cb' => '', 'name' => __( 'Name', 'simple-tags' ), 'slug' => __( 'Slug', 'simple-tags' ), 'count' => __( 'Count', 'simple-tags' ) ]; return $columns; } /** * Columns to make sortable. * * @return array */ protected function get_sortable_columns() { $sortable_columns = array( 'name' => array( 'name', true ), 'slug' => array( 'slug', true ), 'count' => array( 'count', false ) ); return $sortable_columns; } /** * Render a column when no column specific method exist. * * @param array $item * @param string $column_name * * @return mixed */ public function column_default( $item, $column_name ) { return !empty($item->$column_name) ? $item->$column_name : '—'; } /** * Retrieve termcloud data from the database * * @param int $per_page * @param int $page_number * * @return mixed */ public static function get_termcloud() { $order = '&selectionby=name&selection=asc&orderby=name&order=asc'; $args = 'hide_empty=false&number=&color=false&get=all&title=' . $order . '&taxonomy=' . SimpleTags_Admin::$taxonomy ; $result = SimpleTags_Client_TagCloud::extendedTagResult( $args ); return $result; } /** * Delete a stterm record. * * @param int $id stterm ID */ public static function delete_stterm( $id ) { $term = get_term( $id ); wp_delete_term( $term->term_id, $term->taxonomy ); } /** * Returns the count of records in the database. * * @return null|string */ public static function record_count() { $order = '&selectionby=name&selection=asc&orderby=name&order=asc'; $args = 'hide_empty=false&number=&color=false&get=all&title=' . $order . '&taxonomy=' . SimpleTags_Admin::$taxonomy ; $result = SimpleTags_Client_TagCloud::extendedTagResult( $args ); return count($result); } /** Text displayed when no stterm data is available */ public function no_items() { _e( 'No term avaliable.', 'simple-tags' ); } /** * Render the bulk edit checkbox * * @param array $item * * @return string */ function column_cb( $item ) { return sprintf( '', $item->term_id ); } /** * Method for name column * * @param array $item * * @return string */ protected function column_name( $item ) { $title = sprintf( '%2$s', esc_url( get_term_link( $item, $item->taxonomy )), esc_html($item->name) ); return $title; } /** * The action column * * @param $item * * @return string */ protected function column_slug($item) { return !empty($item->slug) ? $item->slug : '—'; } /** * The action column * * @param $item * * @return string */ protected function column_count($item) { return sprintf('%s', add_query_arg( get_taxonomy($item->taxonomy)->query_var, esc_attr($item->slug), admin_url('edit.php') ), number_format_i18n($item->count)); } /** * Returns an associative array containing the bulk action * * @return array */ public function get_bulk_actions() { $actions = [ 'st-bulk-delete-term' => __('Delete', 'simple-tags') ]; return $actions; } public function process_bulk_action() { //Detect when a bulk action is being triggered... if ( 'delete' === $this->current_action() ) { // In our file that handles the request, verify the nonce. $nonce = sanitize_text_field( $_REQUEST['_wpnonce'] ); if ( ! wp_verify_nonce( $nonce, 'sp_delete_stterm' ) ) { die( 'Go get a life script kiddies' ); } else { self::delete_stterm( absint( $_GET['stterm'] ) ); } } // If the delete bulk action is triggered if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'st-bulk-delete-term' ) || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'st-bulk-delete-term' ) ) { $delete_ids = array_map('sanitize_text_field', $_POST['st-bulk-delete-term']); // loop over the array of record IDs and delete them foreach ( $delete_ids as $id ) { self::delete_stterm( $id ); } } } /** * Determine if a given string contains a given substring. * * @param string $haystack * @param string|array $needles * @param bool $sensitive Use case sensitive search * * @return bool */ public function str_contains($haystack, $needles, $sensitive = true) { foreach ((array)$needles as $needle) { $function = $sensitive ? 'mb_strpos' : 'mb_stripos'; if ($needle !== '' && $function($haystack, $needle) !== false) { return true; } } return false; } /** * Displays the search box. * * @param string $text The 'submit' button label. * @param string $input_id ID attribute value for the search input field. * * */ public function search_box($text, $input_id) { $input_id = $input_id . '-search-input'; if (!empty($_REQUEST['orderby'])) { echo ''; } if (!empty($_REQUEST['order'])) { echo ''; } if (!empty($_REQUEST['page'])) { echo ''; } if (!empty($_REQUEST['cpt'])) { echo ''; } if (!empty($_REQUEST['taxo'])) { echo ''; } $searchbox_search = (empty($_REQUEST['s']) && !$this->has_items()) ? 'visibility:hidden;' : ''; ?> _column_headers = $this->get_column_info(); /** * First, lets decide how many records per page to show */ $per_page = $this->get_items_per_page( 'termcloud_per_page', 10 ); /** * handle bulk actions. */ $this->process_bulk_action(); /** * Fetch the data */ $data = self::get_termcloud(); /** * Handle search */ if ((!empty($_REQUEST['s'])) && $search = sanitize_text_field($_REQUEST['s'])) { $data_filtered = []; foreach ($data as $item) { if ($this->str_contains($item->slug, $search, false) || $this->str_contains($item->name, $search, false)) { $data_filtered[] = $item; } } $data = $data_filtered; } /** * This checks for sorting input and sorts the data in our array accordingly. */ function usort_reorder($a, $b) { $orderby = (!empty($_REQUEST['orderby'])) ? sanitize_text_field($_REQUEST['orderby']) : 'name'; //If no sort, default to role $order = (!empty($_REQUEST['order'])) ? sanitize_text_field($_REQUEST['order']) : 'asc'; //If no order, default to asc $result = strnatcasecmp($a->$orderby, $b->$orderby); //Determine sort order, case insensitive, natural order return ($order === 'asc') ? $result : -$result; //Send final sort direction to usort } usort($data, 'usort_reorder'); /** * Pagination. */ $current_page = $this->get_pagenum(); $total_items = count($data); /** * The WP_List_Table class does not handle pagination for us, so we need * to ensure that the data is trimmed to only the current page. We can use * array_slice() to */ $data = array_slice($data, (($current_page - 1) * $per_page), $per_page); /** * Now we can add the data to the items property, where it can be used by the rest of the class. */ $this->items = $data; /** * We also have to register our pagination options & calculations. */ $this->set_pagination_args([ 'total_items' => $total_items, //calculate the total number of items 'per_page' => $per_page, //determine how many items to show on a page 'total_pages' => ceil($total_items / $per_page) //calculate the total number of pages ]); } }