PluginProbe
Analytify – Google Analytics Dashboard For WordPress (GA4 analytics tracking) / trunk
Analytify – Google Analytics Dashboard For WordPress (GA4 analytics tracking) vtrunk
9.1.2 9.1.1 9.1.0 9.0.2 9.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.1.0 1.1.1 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 All 153 releases
wp-analytify / inc / core-traits / dates.php

dates.php in Analytify – Google Analytics Dashboard For WordPress (GA4 analytics tracking) trunk, at inc/core-traits/dates.php

198 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Core Date Functions for WP Analytify
4 *
5 * This file contains all date and time related functions that were previously
6 * in wpa-core-functions.php. Functions are kept as standalone functions for
7 * simplicity and backward compatibility.
8 *
9 * @package WP_Analytify
10 * @since 8.0.0
11 */
12
13 /**
14 * Validate a dashboard date string (Y-m-d).
15 *
16 * @since 9.1.0
17 * @param string $date Date string.
18 * @return bool
19 */
20 function analytify_is_valid_dashboard_date( $date ) {
21 if ( ! is_string( $date ) || '' === $date ) {
22 return false;
23 }
24
25 $parsed = DateTime::createFromFormat( 'Y-m-d', $date );
26
27 return $parsed && $parsed->format( 'Y-m-d' ) === $date;
28 }
29
30 /**
31 * Persist the shared dashboard date range across all Analytify admin dashboards.
32 *
33 * @since 9.1.0
34 * @param string $start_date Start date (Y-m-d).
35 * @param string $end_date End date (Y-m-d).
36 * @param string|null $date_differ Preset key (e.g. last_7_days), empty string to clear, or null to leave unchanged.
37 * @return void
38 */
39 function analytify_persist_dashboard_dates( $start_date, $end_date, $date_differ = null ) {
40 if ( analytify_is_valid_dashboard_date( $start_date ) && analytify_is_valid_dashboard_date( $end_date ) ) {
41 update_option( 'analytify_date_start', $start_date );
42 update_option( 'analytify_date_end', $end_date );
43 }
44
45 if ( null !== $date_differ ) {
46 update_option( 'analytify_date_differ', sanitize_text_field( $date_differ ) );
47 }
48 }
49
50 /**
51 * Apply a saved preset date-differ key to start/end dates.
52 *
53 * @since 9.1.0
54 * @param string $date_differ Preset key.
55 * @param string $start_date Default start date (Y-m-d).
56 * @param string $end_date Default end date (Y-m-d).
57 * @return array{start_date: string, end_date: string}
58 */
59 function analytify_apply_dashboard_date_differ( $date_differ, $start_date, $end_date ) {
60 if ( 'current_day' === $date_differ ) {
61 $start_date = wp_date( 'Y-m-d' );
62 } elseif ( 'yesterday' === $date_differ ) {
63 $start_date = wp_date( 'Y-m-d', strtotime( '-1 day' ) );
64 $end_date = wp_date( 'Y-m-d', strtotime( '-1 day' ) );
65 } elseif ( 'last_7_days' === $date_differ ) {
66 $start_date = wp_date( 'Y-m-d', strtotime( '-7 days' ) );
67 } elseif ( 'last_14_days' === $date_differ ) {
68 $start_date = wp_date( 'Y-m-d', strtotime( '-14 days' ) );
69 } elseif ( 'last_30_days' === $date_differ ) {
70 $start_date = wp_date( 'Y-m-d', strtotime( '-1 month' ) );
71 } elseif ( 'this_month' === $date_differ ) {
72 $start_date = wp_date( 'Y-m-01' );
73 } elseif ( 'last_month' === $date_differ ) {
74 $start_date = wp_date( 'Y-m-01', strtotime( '-1 month' ) );
75 $end_date = wp_date( 'Y-m-t', strtotime( '-1 month' ) );
76 } elseif ( 'last_3_months' === $date_differ ) {
77 $start_date = wp_date( 'Y-m-01', strtotime( '-3 month' ) );
78 $end_date = wp_date( 'Y-m-t', strtotime( '-1 month' ) );
79 } elseif ( 'last_6_months' === $date_differ ) {
80 $start_date = wp_date( 'Y-m-01', strtotime( '-6 month' ) );
81 $end_date = wp_date( 'Y-m-t', strtotime( '-1 month' ) );
82 } elseif ( 'last_year' === $date_differ ) {
83 $start_date = wp_date( 'Y-m-01', strtotime( '-1 year' ) );
84 $end_date = wp_date( 'Y-m-t', strtotime( '-1 month' ) );
85 }
86
87 return array(
88 'start_date' => $start_date,
89 'end_date' => $end_date,
90 );
91 }
92
93 /**
94 * This function returns dates for the date picker.
95 *
96 * @version 9.1.0
97 * @since 5.0.4
98 * @return array<string, mixed> Array with start_date and end_date
99 */
100 function analytify_datepicker_dates() {
101
102 $wp_analytify = $GLOBALS['WP_ANALYTIFY'];
103
104 $start_date_val = strtotime( '-1 month' );
105 $end_date_val = strtotime( 'now' );
106 $start_date = wp_date( 'Y-m-d', $start_date_val );
107 $end_date = wp_date( 'Y-m-d', $end_date_val );
108
109 /**
110 * Always remember the previously selected date.
111 */
112 $_differ = get_option( 'analytify_date_differ' );
113
114 if ( $_differ ) {
115 $dates = analytify_apply_dashboard_date_differ( $_differ, $start_date, $end_date );
116 $start_date = $dates['start_date'];
117 $end_date = $dates['end_date'];
118 } else {
119 $saved_start = get_option( 'analytify_date_start' );
120 $saved_end = get_option( 'analytify_date_end' );
121
122 if ( analytify_is_valid_dashboard_date( $saved_start ) && analytify_is_valid_dashboard_date( $saved_end ) ) {
123 $start_date = $saved_start;
124 $end_date = $saved_end;
125 }
126 }
127
128 /**
129 * Default dates.
130 * $_POST dates are checked incase the Per version is older than 5.0.0.
131 */
132 // phpcs:disable WordPress.Security.NonceVerification.Missing -- Nonce verification is handled by caller.
133 if ( isset( $_POST['analytify_date_start'] ) && ! empty( $_POST['analytify_date_start'] ) && isset( $_POST['analytify_date_end'] ) && ! empty( $_POST['analytify_date_end'] ) ) {
134 $start_date = sanitize_text_field( wp_unslash( $_POST['analytify_date_start'] ) );
135 $end_date = sanitize_text_field( wp_unslash( $_POST['analytify_date_end'] ) );
136
137 $posted_differ = isset( $_POST['analytify_date_diff'] ) ? sanitize_text_field( wp_unslash( $_POST['analytify_date_diff'] ) ) : '';
138
139 if ( analytify_is_valid_dashboard_date( $start_date ) && analytify_is_valid_dashboard_date( $end_date ) ) {
140 analytify_persist_dashboard_dates( $start_date, $end_date, $posted_differ );
141 }
142 }
143 // phpcs:enable WordPress.Security.NonceVerification.Missing
144
145 return array(
146 'start_date' => $start_date,
147 'end_date' => $end_date,
148 );
149 }
150
151 /**
152 * Persist shared dashboard dates from any wp-analytify REST request that includes sd/ed.
153 *
154 * @since 9.1.0
155 * @param mixed $response Result to send.
156 * @param array $handler Route handler.
157 * @param WP_REST_Request $request Request object.
158 * @return mixed
159 */
160 function analytify_persist_dashboard_dates_rest_middleware( $response, $handler, $request ) {
161 if ( ! $request instanceof WP_REST_Request ) {
162 return $response;
163 }
164
165 $route = $request->get_route();
166 if ( false === strpos( $route, '/wp-analytify/' ) ) {
167 return $response;
168 }
169
170 $start_date = $request->get_param( 'sd' );
171 $end_date = $request->get_param( 'ed' );
172
173 if ( ! $start_date || ! $end_date ) {
174 return $response;
175 }
176
177 $date_differ = $request->get_param( 'd_diff' );
178 if ( null === $date_differ ) {
179 $date_differ = $request->get_param( 'dd' );
180 }
181
182 analytify_persist_dashboard_dates(
183 sanitize_text_field( $start_date ),
184 sanitize_text_field( $end_date ),
185 null !== $date_differ ? sanitize_text_field( $date_differ ) : ''
186 );
187
188 return $response;
189 }
190
191 add_action(
192 'rest_api_init',
193 static function () {
194 add_filter( 'rest_request_before_callbacks', 'analytify_persist_dashboard_dates_rest_middleware', 10, 3 );
195 },
196 20
197 );
198