Passed
Push — master ( 3232cf...3b5782 )
by Brian
276:38 queued 189:29
created

WPInv_Customers_Table::get_primary_column_name()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 2
rs 10
1
<?php
2
/**
3
 * Customers Table Class
4
 *
5
 */
6
7
// Exit if accessed directly
8
if ( ! defined( 'ABSPATH' ) ) exit;
9
10
// Load WP_List_Table if not loaded
11
if ( ! class_exists( 'WP_List_Table' ) ) {
12
	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
13
}
14
15
/**
16
 * WPInv_Customers_Table Class
17
 *
18
 * Renders the Gateway Reports table
19
 *
20
 * @since 1.0.19
21
 */
22
class WPInv_Customers_Table extends WP_List_Table {
23
24
	/**
25
	 * @var int Number of items per page
26
	 * @since 1.0.19
27
	 */
28
	public $per_page = 10;
29
30
	/**
31
	 * Get things started
32
	 *
33
	 * @since 1.0.19
34
	 * @see WP_List_Table::__construct()
35
	 */
36
	public function __construct() {
37
38
		// Set parent defaults
39
		parent::__construct( array(
40
			'singular' => 'id',
41
			'plural'   => 'ids',
42
			'ajax'     => false,
43
		) );
44
45
	}
46
47
	/**
48
	 * Gets the name of the primary column.
49
	 *
50
	 * @since 1.0.19
51
	 * @access protected
52
	 *
53
	 * @return string Name of the primary column.
54
	 */
55
	protected function get_primary_column_name() {
56
		return 'name';
57
	}
58
59
	/**
60
	 * This function renders most of the columns in the list table.
61
	 *
62
	 * @since 1.0.19
63
	 *
64
	 * @param WP_User $item
65
	 * @param string $column_name The name of the column
66
	 *
67
	 * @return string Column Name
68
	 */
69
	public function column_default( $item, $column_name ) {
70
		$value = sanitize_text_field( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
0 ignored issues
show
Bug introduced by
It seems like get_user_meta($item->ID,...' . $column_name, true) can also be of type false; however, parameter $str of sanitize_text_field() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

70
		$value = sanitize_text_field( /** @scrutinizer ignore-type */ get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
Loading history...
71
		return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
72
	}
73
74
	/**
75
	 * Displays the country column.
76
	 *
77
	 * @since 1.0.19
78
	 *
79
	 * @param WP_User $user
80
	 *
81
	 * @return string Column Name
82
	 */
83
	public function column_country( $user ) {
84
		$country = wpinv_sanitize_country( $user->_wpinv_country );
85
		if ( $country ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $country of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
86
			$country = wpinv_country_name( $country );
87
		}
88
		return sanitize_text_field( $country );
89
	}
90
91
	/**
92
	 * Displays the state column.
93
	 *
94
	 * @since 1.0.19
95
	 *
96
	 * @param WP_User $user
97
	 *
98
	 * @return string Column Name
99
	 */
100
	public function column_state( $user ) {
101
		$country = wpinv_sanitize_country( $user->_wpinv_country );
102
		$state   = $user->_wpinv_state;
103
		if ( $state ) {
104
			$state = wpinv_state_name( $state, $country );
105
		}
106
107
		return sanitize_text_field( $state );
108
	}
109
110
	/**
111
	 * Generates content for a single row of the table
112
	 * @since 1.0.19
113
	 *
114
	 * @param int $item The user id.
115
	 */
116
	public function single_row( $item ) {
117
		$item = get_user_by( 'id', $item );
118
119
		if ( empty( $item ) ) {
120
			return;
121
		}
122
123
		echo '<tr>';
124
		$this->single_row_columns( $item );
125
		echo '</tr>';
126
	}
127
128
	/**
129
	 * Displays the customers name
130
	 *
131
	 * @param  WP_User $customer customer.
132
	 * @return string
133
	 */
134
	public function column_name( $customer ) {
135
136
		// Customer view URL.
137
		$view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
138
		$row_actions = $this->row_actions(
139
			array(
140
				'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
141
			)
142
		);
143
144
		// Get user's address.
145
		$address = wpinv_get_user_address( $customer->ID );
146
147
		// Customer email address.
148
		$email       = sanitize_email( $customer->user_email );
149
150
		// Customer's avatar.
151
		$avatar = esc_url( get_avatar_url( $email ) );
0 ignored issues
show
Bug introduced by
It seems like get_avatar_url($email) can also be of type false; however, parameter $url of esc_url() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

151
		$avatar = esc_url( /** @scrutinizer ignore-type */ get_avatar_url( $email ) );
Loading history...
152
		$avatar = "<img src='$avatar' height='32' width='32'/>";
153
154
		// Customer's name.
155
		$name   = sanitize_text_field( "{$address['first_name']} {$address['last_name']}" );
156
157
		if ( ! empty( $name ) ) {
158
			$name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
159
		}
160
161
		$email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
162
163
		return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
164
165
	}
166
167
	/**
168
	 * Retrieve the table columns
169
	 *
170
	 * @since 1.0.19
171
	 * @return array $columns Array of all the list table columns
172
	 */
173
	public function get_columns() {
174
175
		$columns = array(
176
			'name'     => __( 'Name', 'invoicing' ),
177
			'country'  => __( 'Country', 'invoicing' ),
178
			'state'    => __( 'State', 'invoicing' ),
179
			'city'     => __( 'City', 'invoicing' ),
180
			'zip'      => __( 'ZIP', 'invoicing' ),
181
			'address'  => __( 'Address', 'invoicing' ),
182
			'phone'    => __( 'Phone', 'invoicing' ),
183
			'company'  => __( 'Company', 'invoicing' ),
184
		);
185
		return apply_filters( 'wpinv_customers_table_columns', $columns );
186
187
	}
188
189
	/**
190
	 * Retrieve the current page number
191
	 *
192
	 * @since 1.0.19
193
	 * @return int Current page number
194
	 */
195
	public function get_paged() {
196
		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
197
	}
198
199
	/**
200
	 * Returns bulk actions.
201
	 *
202
	 * @since 1.0.19
203
	 * @return void
204
	 */
205
	public function bulk_actions( $which = '' ) {
206
		return array();
0 ignored issues
show
Bug Best Practice introduced by
The expression return array() returns the type array which is incompatible with the documented return type void.
Loading history...
207
	}
208
209
	/**
210
	 *  Prepares the display query
211
	 */
212
	public function prepare_query() {
213
		global $wpdb;
214
215
		// Users with invoices.
216
    	$customers = $wpdb->get_col(
217
			$wpdb->prepare(
218
				"SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE post_type=%s LIMIT %d,%d",
219
				'wpi_invoice',
220
				$this->get_paged() * 10 - 10,
221
				$this->per_page
222
			)
223
		);
224
225
		$this->items = $customers;
226
		$this->total = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE post_type=%s", 'wpi_invoice' ) );
0 ignored issues
show
Bug Best Practice introduced by
The property total does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
227
228
	}
229
230
	/**
231
	 * Setup the final data for the table
232
	 *
233
	 * @since 1.0.19
234
	 * @return void
235
	 */
236
	public function prepare_items() {
237
		$columns               = $this->get_columns();
238
		$hidden                = array(); // No hidden columns
239
		$sortable              = $this->get_sortable_columns();
240
		$this->_column_headers = array( $columns, $hidden, $sortable );
241
		$this->prepare_query();
242
	}
243
}
244