PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.2.7
Post Views Counter v1.2.7
1.7.13 1.7.12 1.7.11 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.2 1.3.2.1 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.7.10 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9
post-views-counter / includes / query.php
post-views-counter / includes Last commit date
columns.php 9 years ago counter.php 9 years ago crawler-detect.php 9 years ago cron.php 9 years ago dashboard.php 9 years ago frontend.php 9 years ago functions.php 9 years ago query.php 9 years ago settings.php 9 years ago update.php 9 years ago widgets.php 9 years ago
query.php
259 lines
1 <?php
2 // exit if accessed directly
3 if ( ! defined( 'ABSPATH' ) )
4 exit;
5
6 /**
7 * Post_Views_Counter_Query class.
8 *
9 * @class Post_Views_Counter_Query
10 */
11 class Post_Views_Counter_Query {
12
13 public function __construct() {
14 // actions
15 add_action( 'pre_get_posts', array( $this, 'extend_pre_query' ), 1 );
16
17 // filters
18 add_filter( 'query_vars', array( $this, 'query_vars' ) );
19 add_filter( 'posts_join', array( $this, 'posts_join' ), 10, 2 );
20 add_filter( 'posts_groupby', array( $this, 'posts_groupby' ), 10, 2 );
21 add_filter( 'posts_orderby', array( $this, 'posts_orderby' ), 10, 2 );
22 add_filter( 'posts_fields', array( $this, 'posts_fields' ), 10, 2 );
23 add_filter( 'the_posts', array( $this, 'the_posts' ), 10, 2 );
24 }
25
26 /**
27 * Register views_query var.
28 *
29 * @param array $query_vars
30 * @return array
31 */
32 public function query_vars( $query_vars ) {
33 $query_vars[] = 'views_query';
34
35 return $query_vars;
36 }
37
38 /**
39 * Extend query with post_views orderby parameter.
40 *
41 * @param object $query
42 */
43 public function extend_pre_query( $query ) {
44 if ( isset( $query->query_vars['orderby'] ) && $query->query_vars['orderby'] === 'post_views' )
45 $query->pvc_orderby = true;
46 }
47
48 /**
49 * Modify the db query to use post_views parameter.
50 *
51 * @global object $wpdb
52 * @param string $join
53 * @param object $query
54 * @return string
55 */
56 public function posts_join( $join, $query ) {
57 $sql = '';
58
59 if ( ! empty( $query->query['views_query'] ) ) {
60 if ( isset( $query->query['views_query']['year'] ) )
61 $year = (int) $query->query['views_query']['year'];
62
63 if ( isset( $query->query['views_query']['month'] ) )
64 $month = (int) $query->query['views_query']['month'];
65
66 if ( isset( $query->query['views_query']['week'] ) )
67 $week = (int) $query->query['views_query']['week'];
68
69 if ( isset( $query->query['views_query']['day'] ) )
70 $day = (int) $query->query['views_query']['day'];
71
72 // year
73 if ( isset( $year ) ) {
74 // year, week
75 if ( isset( $week ) && $this->is_valid_date( 'yw', $year, 0, 0, $week ) ) {
76 $sql = " AND pvc.type = 1 AND pvc.period = '" . str_pad( $year, 4, 0, STR_PAD_LEFT ) . str_pad( $week, 2, 0, STR_PAD_LEFT ) . "'";
77 // year, month
78 } elseif ( isset( $month ) ) {
79 // year, month, day
80 if ( isset( $day ) && $this->is_valid_date( 'ymd', $year, $month, $day ) ) {
81 $sql = " AND pvc.type = 0 AND pvc.period = '" . str_pad( $year, 4, 0, STR_PAD_LEFT ) . str_pad( $month, 2, 0, STR_PAD_LEFT ) . str_pad( $day, 2, 0, STR_PAD_LEFT ) . "'";
82 // year, month
83 } elseif ( $this->is_valid_date( 'ym', $year, $month ) ) {
84 $sql = " AND pvc.type = 2 AND pvc.period = '" . str_pad( $year, 4, 0, STR_PAD_LEFT ) . str_pad( $month, 2, 0, STR_PAD_LEFT ) . "'";
85 }
86 // year
87 } elseif ( $this->is_valid_date( 'y', $year ) ) {
88 $sql = " AND pvc.type = 3 AND pvc.period = '" . str_pad( $year, 4, 0, STR_PAD_LEFT ) . "'";
89 }
90 // month
91 } elseif ( isset( $month ) ) {
92 // month, day
93 if ( isset( $day ) && $this->is_valid_date( 'md', 0, $month, $day ) ) {
94 $sql = " AND pvc.type = 0 AND RIGHT( pvc.period, 4 ) = '" . str_pad( $month, 2, 0, STR_PAD_LEFT ) . str_pad( $day, 2, 0, STR_PAD_LEFT ) . "'";
95 // month
96 } elseif ( $this->is_valid_date( 'm', 0, $month ) ) {
97 $sql = " AND pvc.type = 2 AND RIGHT( pvc.period, 2 ) = '" . str_pad( $month, 2, 0, STR_PAD_LEFT ) . "'";
98 }
99 // week
100 } elseif ( isset( $week ) && $this->is_valid_date( 'w', 0, 0, 0, $week ) ) {
101 $sql = " AND pvc.type = 1 AND RIGHT( pvc.period, 2 ) = '" . str_pad( $week, 2, 0, STR_PAD_LEFT ) . "'";
102 // day
103 } elseif ( isset( $day ) && $this->is_valid_date( 'd', 0, 0, $day ) ) {
104 $sql = " AND pvc.type = 0 AND RIGHT( pvc.period, 2 ) = '" . str_pad( $day, 2, 0, STR_PAD_LEFT ) . "'";
105 }
106
107 if ( $sql !== '' )
108 $query->pvc_query = true;
109 }
110
111 // is it sorted by post views?
112 if ( ( $sql === '' && isset( $query->pvc_orderby ) && $query->pvc_orderby ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true )
113 $sql = ' AND pvc.type = 4';
114
115 // add date range
116 if ( $sql !== '' ) {
117 global $wpdb;
118
119 $join .= " LEFT JOIN " . $wpdb->prefix . "post_views pvc ON pvc.id = " . $wpdb->prefix . "posts.ID" . $sql;
120 }
121
122 return $join;
123 }
124
125 /**
126 * Group posts using the post ID.
127 *
128 * @global object $wpdb
129 * @param string $groupby
130 * @param object $query
131 * @return string
132 */
133 public function posts_groupby( $groupby, $query ) {
134 // is it sorted by post views or views_query is used?
135 if ( ( isset( $query->pvc_orderby ) && $query->pvc_orderby ) || ( isset( $query->pvc_query ) && $query->pvc_query ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true ) {
136 global $wpdb;
137
138 $groupby = trim( $groupby );
139
140 if ( strpos( $groupby, $wpdb->prefix . 'posts.ID' ) === false )
141 $groupby = ( $groupby !== '' ? $groupby . ', ' : '') . $wpdb->prefix . 'posts.ID';
142
143 if ( ! isset( $query->query['views_query']['hide_empty'] ) || $query->query['views_query']['hide_empty'] === true )
144 $groupby .= ' HAVING post_views > 0';
145 }
146
147 return $groupby;
148 }
149
150 /**
151 * Order posts by post views.
152 *
153 * @global object $wpdb
154 * @param string $orderby
155 * @param object $query
156 * @return string
157 */
158 public function posts_orderby( $orderby, $query ) {
159 // is it sorted by post views?
160 if ( ( isset( $query->pvc_orderby ) && $query->pvc_orderby ) ) {
161 global $wpdb;
162
163 $order = $query->get( 'order' );
164 $orderby = ( ! isset( $query->query['views_query']['hide_empty'] ) || $query->query['views_query']['hide_empty'] === true ? 'post_views' : 'pvc.count' ) . ' ' . $order . ', ' . $wpdb->prefix . 'posts.ID ' . $order;
165 }
166
167 return $orderby;
168 }
169
170 /**
171 * Return post views in queried post objects.
172 *
173 * @param string $fields
174 * @param object $query
175 * @return string
176 */
177 public function posts_fields( $fields, $query ) {
178 if ( ( ! isset( $query->query['fields'] ) || $query->query['fields'] === '' ) && ( ( isset( $query->pvc_orderby ) && $query->pvc_orderby ) || ( isset( $query->pvc_query ) && $query->pvc_query ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true ) )
179 $fields = $fields . ', SUM( IFNULL( pvc.count, 0 ) ) AS post_views';
180
181 return $fields;
182 }
183
184 /**
185 * Extend query object with total post views.
186 *
187 * @param array $posts
188 * @param object $query
189 * @return array
190 */
191 public function the_posts( $posts, $query ) {
192 if ( ( isset( $query->pvc_orderby ) && $query->pvc_orderby ) || ( isset( $query->pvc_query ) && $query->pvc_query ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true ) {
193 $sum = 0;
194
195 // any posts found?
196 if ( ! empty( $posts ) ) {
197 foreach ( $posts as $post ) {
198 if ( ! empty( $post->post_views ) )
199 $sum += (int) $post->post_views;
200 }
201 }
202
203 // pass total views
204 $query->total_views = $sum;
205 }
206
207 return $posts;
208 }
209
210 /**
211 * Validate date helper function.
212 *
213 * @param string $type
214 * @param int $year
215 * @param int $month
216 * @param int $day
217 * @param int $week
218 * @return bool
219 */
220 private function is_valid_date( $type, $year = 0, $month = 0, $day = 0, $week = 0 ) {
221 switch ( $type ) {
222 case 'y':
223 $bool = ( $year >= 1 && $year <= 32767 );
224 break;
225
226 case 'yw':
227 $bool = ( $year >= 1 && $year <= 32767 && $week >= 0 && $week <= 53 );
228 break;
229
230 case 'ym':
231 $bool = ( $year >= 1 && $year <= 32767 && $month >= 1 && $month <= 12 );
232 break;
233
234 case 'ymd':
235 $bool = checkdate( $month, $day, $year );
236 break;
237
238 case 'm':
239 $bool = ( $month >= 1 && $month <= 12 );
240 break;
241
242 case 'md':
243 $bool = ( $month >= 1 && $month <= 12 && $day >= 1 && $day <= 31 );
244 break;
245
246 case 'w':
247 $bool = ( $week >= 0 && $week <= 53 );
248 break;
249
250 case 'd':
251 $bool = ( $day >= 1 && $day <= 31 );
252 break;
253 }
254
255 return $bool;
256 }
257
258 }
259