PluginProbe
Bubble Menu – Floating Button Menu with Sticky Navigation / 2.2
Bubble Menu – Floating Button Menu with Sticky Navigation v2.2
trunk 1.3 2.0 2.2 2.2.1 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1 3.1.1 4.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.1 4.1.1
bubble-menu / admin / partials / class-list-table.php

class-list-table.php in Bubble Menu – Floating Button Menu with Sticky Navigation 2.2, at admin/partials/class-list-table.php

342 lines 9.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php if ( ! defined( 'ABSPATH' ) ) {
2 exit;
3 }
4
5 // WP_List_Table is not loaded automatically so we need to load it in our application
6 if ( ! class_exists( 'WP_List_Table' ) ) {
7 require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
8 }
9
10 /**
11 * Create a new table class that will extend the WP_List_Table
12 *
13 */
14 class Wow_List_Table extends WP_List_Table {
15
16 /**
17 * Number of items per page
18 *
19 * @var int
20 * @since 1.5
21 */
22 public $per_page = 30;
23
24 private $data;
25 private $plugin;
26
27 /**
28 * Wow_List_Table constructor.
29 *
30 * @param string $data - Name of the datatable
31 * @param array $plugin - Information about the plugin
32 */
33 public function __construct( $data, $plugin ) {
34 $this->data = $data;
35 $this->plugin = $plugin;
36
37 // Set parent defaults
38 parent::__construct( array(
39 'ajax' => false,
40 ) );
41 $this->process_bulk_action();
42 }
43
44 /**
45 * Process the bulk actions
46 *
47 * @access public
48 * @return void
49 * @since 1.4
50 */
51 public function process_bulk_action() {
52 $ids = isset( $_POST['ID'] ) ? $_POST['ID'] : false;
53 $action = $this->current_action();
54 if ( ! is_array( $ids ) ) {
55 $ids = array( $ids );
56 }
57 if ( empty( $action ) ) {
58 return;
59 }
60 global $wpdb;
61 $table = $this->data;
62 foreach ( $ids as $id ) {
63 if ( 'delete-items' === $this->current_action() ) {
64 $wpdb->delete( $table, array( 'id' => $id ) );
65 }
66 }
67
68 }
69
70 public function search_box( $text, $input_id ) {
71 $input_id = $input_id . '-search-input';
72 if ( ! empty( $_REQUEST['orderby'] ) ) {
73 echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
74 }
75 if ( ! empty( $_REQUEST['order'] ) ) {
76 echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
77 }
78 ?>
79 <p class="search-box">
80 <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
81 <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>"/>
82 <?php submit_button( $text, 'button', false, false, array( 'ID' => 'search-submit' ) ); ?>
83 </p>
84 <?php
85 }
86
87 /**
88 * Define what data to show on each column of the table
89 *
90 * @param array $item Data
91 * @param String $column_name - Current column name
92 *
93 * @return Mixed
94 */
95 public function column_default( $item, $column_name ) {
96 $value = $item[ $column_name ];
97
98 return $value;
99 }
100
101 public function column_title( $item ) {
102 $slug = $this->plugin['slug'];
103 $text = $this->plugin['text'];
104 $title = ! empty( $item['title'] ) ? $item['title'] : '<em>Untitle</em>';
105 $edit_url = admin_url( '/admin.php?page=' . $slug . '&tab=add-new&act=update&id='
106 . urlencode( $item['ID'] ) );
107 $duplicate_url = admin_url( '/admin.php?page=' . $slug . '&tab=add-new&act=duplicate&id='
108 . urlencode( $item['ID'] ) );
109 $delete_url = admin_url( '/admin.php?page=' . $slug . '&info=delete&did=' . urlencode( $item['ID'] ) );
110 $actions = array(
111 'edit' => '<a href="' . $edit_url . '">' . esc_attr__( 'Edit', $text ) . '</a>',
112 'duplicate' => '<a href="' . $duplicate_url . '" style="color:green;">' . esc_attr__( 'Duplicate', $text )
113 . '</a>',
114 'delete' => '<a href="' . $delete_url . '" style="color:red;">' . esc_attr__( 'Delete', $text ) . '</a>',
115 );
116
117 return '<a href="' . esc_url( $edit_url ) . '">' . $title . '</a>' . $this->row_actions( $actions );
118 }
119
120 /**
121 * Prepare the items for the table to process
122 *
123 * @return Void
124 */
125 public function prepare_items() {
126 $columns = $this->get_columns();
127 $hidden = $this->get_hidden_columns();
128 $sortable = $this->get_sortable_columns();
129 $data = $this->table_data();
130 $perPage = 30;
131 $currentPage = $this->get_pagenum();
132 if ( $data ) {
133 usort( $data, array( &$this, 'sort_data' ) );
134 $data = array_slice( $data, ( ( $currentPage - 1 ) * $perPage ), $perPage );
135 }
136 $totalItems = $this->list_count();
137 $this->_column_headers = array( $columns, $hidden, $sortable );
138 $this->items = $data;
139 $this->set_pagination_args( array(
140 'total_items' => $totalItems,
141 'per_page' => $perPage,
142 'total_pages' => ceil( $totalItems / $perPage ),
143 ) );
144 }
145
146 /**
147 * Override the parent columns method. Defines the columns to use in your listing table
148 *
149 * @return Array
150 */
151 public function get_columns() {
152 $columns = array(
153 'cb' => '<input type="checkbox" />',
154 'title' => 'Title',
155 'code' => 'Shortcode',
156 // 'view' => 'Views',
157 // 'action' => 'Actions',
158 // 'conversion' => 'Conversion',
159 'edit' => 'Edit',
160 'delete' => 'Delete',
161 'duplicate' => 'Duplicate',
162 );
163
164 return $columns;
165
166 }
167
168 /**
169 * Define which columns are hidden
170 *
171 * @return Array
172 */
173 public function get_hidden_columns() {
174 return array();
175 }
176
177 /**
178 * Define the sortable columns
179 *
180 * @return array
181 */
182 public function get_sortable_columns() {
183 return array(
184 'ID' => array( 'ID', false ),
185 );
186 }
187
188 /**
189 * Get the table data
190 *
191 * @return Array
192 */
193 private function table_data() {
194 global $wpdb;
195 $data = array();
196 $paged = $this->get_paged();
197 $offset = $this->per_page * ( $paged - 1 );
198 $search = $this->get_search();
199
200 $table = $this->data;
201
202
203 if ( ! $search || empty( $search ) ) {
204 $result = $wpdb->get_results( "SELECT * FROM " . $table . " order by id desc" );
205 } elseif ( is_numeric( $search ) ) {
206 $result = $wpdb->get_results( "SELECT * FROM " . $table . " WHERE id=" . $search );
207 } else {
208 $result = $wpdb->get_results( "SELECT * FROM " . $table . " WHERE title='" . $search
209 . "' order by id desc" );
210 }
211
212 $slug = $this->plugin['slug'];
213 $text = $this->plugin['text'];
214 $shortcode = $this->plugin['shortcode'];
215 $prefix = $this->plugin['prefix'];
216
217
218 if ( $result ) {
219 foreach ( $result as $key => $value ) {
220 $option_name_view = '_' . $prefix . '_view_counter_' . $value->id;
221 $option_name_action = '_' . $prefix . '_action_counter_' . $value->id;
222 $tool_view = get_option( $option_name_view, '0' );
223 $tool_action = get_option( $option_name_action, '0' );
224 if ( ! empty( $tool_view ) ) {
225 $conversion = round( $tool_action / $tool_view * 100, 2 ) . '%';
226 } else {
227 $conversion = '0%';
228 }
229 $title = ! empty( $value->title ) ? $value->title : '<em>' . esc_attr__( 'Untitle', $text ) . '</em>';
230 $data[] = array(
231 'ID' => $value->id,
232 'title' => '<a href="admin.php?page=' . $slug . '&tab=add-new&act=update&id=' . $value->id
233 . '">' . $title . '</a>',
234 'code' => '[' . $shortcode . ' id="' . $value->id . '"]',
235 'view' => $tool_view,
236 'action' => $tool_action,
237 'conversion' => $conversion,
238 'edit' => '<a href="admin.php?page=' . $slug . '&tab=add-new&act=update&id='
239 . $value->id . '">edit</a>',
240 'delete' => '<a href="admin.php?page=' . $slug . '&info=delete&did=' . $value->id
241 . '" style="color:red;">delete</a>',
242 'duplicate' => '<a href="admin.php?page=' . $slug . '&tab=add-new&act=duplicate&id='
243 . $value->id . '" style="color:green;">duplicate</a>',
244 );
245 }
246 }
247
248 return $data;
249 }
250
251 /**
252 * Retrieve the current page number
253 *
254 * @access public
255 * @return int Current page number
256 * @since 1.5
257 */
258 public function get_paged() {
259 return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
260 }
261
262 /**
263 * Retrieves the search query string
264 *
265 * @access public
266 * @return mixed string If search is present, false otherwise
267 * @since 1.0
268 */
269 public function get_search() {
270 return ! empty( $_POST['s'] ) ? urldecode( trim( $_POST['s'] ) ) : false;
271 }
272
273 public function list_count() {
274 global $wpdb;
275 $data = $this->data;
276 $result = $wpdb->get_results( "SELECT * FROM " . $data . " order by id asc" );
277 $count = count( $result );
278
279 return $count;
280 }
281
282 /**
283 * Render the checkbox column
284 *
285 * @access public
286 *
287 * @param array $item Contains all the data for the checkbox column
288 *
289 * @return string Displays a checkbox
290 * @since 1.0
291 */
292 public function column_cb( $item ) {
293 return sprintf( '<input type="checkbox" name="%1$s[]" value="%2$s" />', 'ID', $item['ID'] );
294 }
295
296 /**
297 * Retrieve the bulk actions
298 *
299 * @access public
300 * @return array $actions Array of the bulk actions
301 * @since 1.4
302 */
303 public function get_bulk_actions() {
304 $actions = array(
305 'delete-items' => 'Delate',
306 );
307
308 return $actions;
309 }
310
311 /**
312 * Gets the name of the primary column.
313 *
314 * @return string Name of the primary column.
315 * @since 1.0
316 * @access protected
317 *
318 */
319 protected function get_primary_column_name() {
320 return 'ID';
321 }
322
323 /**
324 * Allows you to sort the data by the variables set in the $_GET
325 *
326 * @return Mixed
327 */
328 private function sort_data( $a, $b ) {
329 // If no sort, default to title
330 $orderby = ( ! empty( $_GET['orderby'] ) ) ? sanitize_text_field( $_GET['orderby'] ) : 'ID';
331 // If no order, default to asc
332 $order = ( ! empty( $_GET['order'] ) ) ? sanitize_text_field( $_GET['order'] ) : 'desc';
333 // Determine sort order
334 $result = strnatcmp( $a[ $orderby ], $b[ $orderby ] );
335
336 // Send final sort direction to usort
337 return ( $order === 'asc' ) ? $result : - $result;
338
339 }
340
341 }
342