PluginProbe
پارسی دیت – Parsi Date / 6.3
پارسی دیت – Parsi Date v6.3
6.3 6.2.1 6.2 6.1 5.1.6 5.1.7 5.1.8 5.1.8.2 6.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.0.0-alpha 2.1 2.1.1 2.1.2 2.1.3 2.1.5 All 49 releases
wp-parsidate / inc / Core / Posts.php
Posts.php
253 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Posts class
4 *
5 * Fix post query based on Jalali date
6 */
7
8 namespace WPParsidate\Core;
9
10 defined( 'ABSPATH' ) || exit;
11
12 use WPParsidate\Helper\{Cache, Number, Param};
13
14 class Posts {
15 public function __construct() {
16 add_action( 'load-edit.php', [ $this, 'editPostHooks' ] );
17 }
18
19 /**
20 * Converts post date pointer to Jalali pointer
21 *
22 * @param string $where
23 * @param \WP_Query|string $wp_query
24 *
25 * @return string
26 */
27 public static function getPostsWhere( $where, $wp_query = '' ): string {
28 global $wpdb;
29
30 if ( empty( $wp_query ) ) {
31 global $wp_query;
32 }
33
34 if ( empty( $wp_query->query_vars ) || ! $wp_query->is_main_query() ) {
35 return $where;
36 }
37
38 $pd = WPP_ParsiDate::getInstance();
39
40 $m = sanitize_text_field( $wp_query->query_vars['m'] ?? '' );
41 $hour = $wp_query->query_vars['hour'] ?? '';
42 $minute = $wp_query->query_vars['minute'] ?? '';
43 $second = $wp_query->query_vars['second'] ?? '';
44 $year = $wp_query->query_vars['year'] ?? '';
45 $month = $wp_query->query_vars['monthnum'] ?? '';
46 $day = $wp_query->query_vars['day'] ?? '';
47
48 if ( ! empty( $m ) ) {
49 $len = strlen( $m );
50 $year = substr( $m, 0, 4 );
51
52 if ( $len > 5 ) {
53 $month = substr( $m, 4, 2 );
54 }
55
56 if ( $len > 7 ) {
57 $day = substr( $m, 6, 2 );
58 }
59
60 if ( $len > 9 ) {
61 $hour = substr( $m, 8, 2 );
62 }
63 if ( $len > 11 ) {
64 $minute = substr( $m, 10, 2 );
65 }
66
67 if ( $len > 13 ) {
68 $second = substr( $m, 12, 2 );
69 }
70 }
71
72 $hour = (int) $hour;
73 $minute = (int) $minute;
74 $second = (int) $second;
75 $year = (int) $year;
76 $month = (int) $month;
77 $day = (int) $day;
78
79 if ( empty( $year ) || $year > 1700 ) {
80 return $where;
81 }
82
83 $stamon = 1;
84 $staday = 1;
85 $stahou = '00';
86 $stamin = '00';
87 $stasec = '00';
88 $endmon = 1;
89 $endday = 1;
90 $endhou = '00';
91 $endmin = '00';
92 $endsec = '00';
93 $stayear = $year;
94 $endyear = $year + 1;
95
96 if ( ! empty( $month ) ) {
97 $stamon = $month;
98 $endmon = ( $month == 12 ? 1 : $month + 1 );
99 $endyear = ( $endmon == 1 ? $stayear + 1 : $stayear );
100 }
101
102 if ( ! empty( $day ) ) {
103 $staday = $day;
104 $endday = ( $day == $pd->j_days_in_month[ (int) $month - 1 ] ? 1 : $day + 1 );
105 $endmon = ( $endday == 1 ? $stamon + 1 : $stamon );
106 }
107
108 if ( ! empty( $hour ) ) {
109 $stahou = $hour;
110 $endhou = ( $hour == 24 ? '00' : $hour + 1 );
111 $endday = ( $endhou == '00' ? $staday + 1 : $staday );
112 }
113
114 if ( ! empty( $minute ) ) {
115 $stamin = $minute;
116 $endmin = ( $minute == 59 ? '00' : $minute + 1 );
117 $endhou = ( $endmin == '00' ? $stahou + 1 : $stahou );
118 }
119
120 if ( ! empty( $second ) ) {
121 $stasec = $second;
122 $endsec = ( $second == 59 ? '00' : $second + 1 );
123 $endmin = ( $endsec == '00' ? $stamin + 1 : $stamin );
124 }
125
126 $stadate = "$stayear-$stamon-$staday";
127 $enddate = "$endyear-$endmon-$endday";
128 $stadate = gregdate( 'Y-m-d', $stadate );
129 $enddate = gregdate( 'Y-m-d', $enddate );
130 $stadate .= " $stahou:$stamin:$stasec";
131 $enddate .= " $endhou:$endmin:$endsec";
132
133 $patterns = array(
134 '/YEAR\((.*?)post_date\s*\)\s*=\s*[0-9\']*/',
135 '/DAYOFMONTH\((.*?)post_date\s*\)\s*=\s*[0-9\']*/',
136 '/MONTH\((.*?)post_date\s*\)\s*=\s*[0-9\']*/',
137 '/HOUR\((.*?)post_date\s*\)\s*=\s*[0-9\']*/',
138 '/MINUTE\((.*?)post_date\s*\)\s*=\s*[0-9\']*/',
139 '/SECOND\((.*?)post_date\s*\)\s*=\s*[0-9\']*/'
140 );
141
142 foreach ( $patterns as $pattern ) {
143 $where = preg_replace( $pattern, '1 = 1', $where );
144 }
145
146 $prefixp = "$wpdb->posts.";
147 $prefixp = ( strpos( $where, $prefixp ) === false ) ? '' : $prefixp;
148 $where .= " AND {$prefixp}post_date >= '$stadate' AND {$prefixp}post_date < '$enddate' ";
149
150 return $where;
151 }
152
153 /**
154 * Hooks admin functions for restrict posts in edit pages
155 *
156 * @return void
157 */
158 public function editPostHooks(): void {
159 add_action( 'restrict_manage_posts', [ $this, 'addMonthYearSelectPostFilter' ] );
160 add_filter( 'posts_where', [ $this, 'adminPostsWhere' ] );
161 }
162
163 /**
164 * Limits posts to a certain date, if date set
165 *
166 * @param string $where Query pointer
167 *
168 * @return string New Pointer
169 */
170 public function adminPostsWhere( $where ): string {
171 global $wp_query;
172
173 if ( isset( $_GET['mfa'] ) && Param::get( 'mfa' ) !== '0' ) {
174 $wp_query->query_vars['m'] = Param::get( 'mfa', 0, FILTER_SANITIZE_NUMBER_INT );
175 $where = self::getPostsWhere( $where, $wp_query );
176 }
177
178 return $where;
179 }
180
181 /**
182 * Restrict posts to given date
183 * @return void
184 */
185 public function addMonthYearSelectPostFilter(): void {
186 global $post_type, $post_status, $wpdb;
187
188 if ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) {
189 return;
190 }
191
192 $postType = is_string( $post_type ) ? $post_type : '';
193 $postStatus = is_string( $post_status ) ? $post_status : ( is_array( $post_status ) ? implode( ',', $post_status ) : '' );
194
195 $cacheKey = 'post_select_months_list_' . md5( $postType . $postStatus );
196 $list = Cache::get( $cacheKey );
197
198 if ( false === $list ) {
199 $postStatusWhere = " AND post_status IN ('publish', 'future', 'draft', 'pending', 'private')";
200
201 if ( is_array( $post_status ) && ! empty( $post_status ) ) {
202 $postStatusWhere = $wpdb->prepare( " AND post_status IN ('" . implode( "','", $post_status ) . "')" );
203
204 } elseif ( $postStatus !== "" && is_string( $postStatus ) ) {
205 $postStatusWhere = $wpdb->prepare( " AND post_status = %s", $postStatus );
206 }
207
208 $query = $wpdb->prepare( "
209 SELECT post_date
210 FROM {$wpdb->posts}
211 WHERE post_type = %s
212 {$postStatusWhere}
213 AND post_date > '1000-01-01 00:00:00'
214 GROUP BY YEAR(post_date), MONTH(post_date)
215 ORDER BY post_date DESC
216 ", $postType );
217
218 $list = $wpdb->get_col( $query );
219
220 if ( ! empty( $list ) ) {
221 Cache::set( $cacheKey, $list, 2 * HOUR_IN_SECONDS );
222 }
223 }
224
225 if ( empty( $list ) ) {
226 return;
227 }
228
229 $m = (int) Param::get( 'mfa', 0 );
230 $predate = '';
231 $monthsName = Names::getMonths();
232
233 echo '<select name="mfa">';
234 echo '<option ' . selected( $m, 0, false ) . ' value="0">' . esc_html__( 'Show All Dates', 'wp-parsidate' ) . '</option>' . PHP_EOL;
235
236 foreach ( $list as $date ) {
237 $date = parsidate( 'Ym', $date, 'eng' );
238 $year = substr( $date, 0, 4 );
239 $month = substr( $date, 4, 2 );
240 $monthName = $monthsName[ (int) $month ];
241
242 if ( $predate !== $date ) {
243 echo sprintf( '<option %s value="%s">%s</option>',
244 selected( $m, $date, false ),
245 esc_html( $date ),
246 esc_html( $monthName . ' ' . Number::toPersian( $year ) ) );
247 }
248 $predate = $date;
249 }
250 echo '</select>';
251 }
252 }
253