PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / trunk
Timetics – Appointment Booking Calendar & Scheduling vtrunk
1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 All 62 releases
timetics / core / admin / hooks.php

hooks.php in Timetics – Appointment Booking Calendar & Scheduling trunk, at core/admin/hooks.php

352 lines 11.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Admin hooks
4 *
5 * @package Timetics
6 */
7 namespace Timetics\Core\Admin;
8
9 defined( 'ABSPATH' ) || exit;
10
11 use Timetics\Utils\Singleton;
12
13
14 class Hooks {
15 use Singleton;
16
17 /**
18 * Initialize admin hooks
19 *
20 * @return void
21 */
22 public function init() {
23 add_action('admin_notices', [ $this, 'add_woocommerce_notice_on_admin_dashboard' ] );
24
25 // Dismiss the notice
26 add_action('wp_ajax_dismiss_woocommerce_notice', [ $this, 'dismiss_woocommerce_notice'] );
27
28 add_filter('plugin_action_links', [ $this, 'add_settings_plugin_tab' ], 10, 2);
29
30 add_action( 'admin_init', [ $this, 'redirect_onboard' ] );
31
32 // Update user roles and permissions for multisite.
33 add_action( 'wp_initialize_site', [ $this, 'update_user_role_on_insert_new_site' ], 110 );
34
35 add_action( 'set_user_role', [ $this, 'set_roles' ], 10, 2 );
36
37 add_filter( 'show_admin_bar', [ $this, 'hide_admin_bar_for_customers' ] );
38 add_action( 'admin_init', [ $this, 'block_admin_for_customers' ] );
39
40 add_filter( 'timetics_menu', [ $this, 'update_busyness_menu' ] );
41
42 add_filter( 'timetics_settings', [ $this, 'set_google_auth_url' ] );
43
44 add_filter( 'timetics_get_settings', [ $this, 'set_email_default_content' ] );
45
46 /**
47 * Added temporary for leagacy sass. It will remove in future.
48 */
49 do_action('timetics_admin_init');
50 }
51
52 /**
53 * Add admin notice for
54 *
55 * @return void
56 */
57 public function add_woocommerce_notice_on_admin_dashboard() {
58
59 $woocommerce_notice_dismiss = get_user_meta( get_current_user_id(), 'timetics_woocommerce_notice_dismissed', true );
60
61 if ( $woocommerce_notice_dismiss ) {
62 return;
63 }
64
65 if ( ! timetics_get_option( 'wc_integration' ) ) {
66 return;
67 }
68
69 if ( function_exists( 'WC' ) ) {
70 return;
71 }
72
73 $notice = '<div class="notice notice-danger is-dismissible error">';
74 $notice .= sprintf('<p><strong>%s</strong></p>', __( 'Timetics requires WooCommerce to enable woocommerce integration. You can download <a href="https://wordpress.org/plugins/woocommerce/" target="_blank">WooCommerce</a> here.', 'timetics' ) );
75 $notice .= '</div>';
76
77 echo wp_kses_post( $notice );
78
79 $admin_ajax_url = admin_url('admin-ajax.php');
80 $nonce = wp_create_nonce( 'timetics_dismiss_wc_notice' );
81
82 ?>
83 <script>
84 jQuery(document).ready(function($) {
85 $('.notice.is-dismissible').on('click', '.notice-dismiss', function() {
86 var data = {
87 action: 'dismiss_woocommerce_notice',
88 nonce: '<?php echo esc_js( $nonce ); ?>',
89 };
90
91 $.post('<?php echo esc_url( $admin_ajax_url ); ?>', data, function(response) {
92 console.log(response);
93 });
94 });
95 });
96 </script>
97 <?php
98 }
99
100 /**
101 * Update admin notice
102 *
103 * @return void
104 */
105 public function dismiss_woocommerce_notice() {
106 check_ajax_referer( 'timetics_dismiss_wc_notice', 'nonce' );
107
108 // Store the notice state in user meta
109 update_user_meta( get_current_user_id(), 'timetics_woocommerce_notice_dismissed', true );
110
111 wp_send_json_success('Notice dismissed successfully.');
112 }
113
114 /**
115 * Add settings on plugin action row
116 *
117 * @param array $actions
118 * @param string $plugin_file
119 *
120 * @return array
121 */
122 public function add_settings_plugin_tab( $actions, $plugin_file ) {
123 // Check if the plugin file matches your target plugin
124 if ( 'timetics/timetics.php' === $plugin_file ) {
125 // Add your custom tab
126 $settings_tab = array(
127 'timetics-settings' => sprintf( '<a href="%s">%s</a>', esc_url( admin_url('admin.php?page=timetics#/settings') ), __( 'Settings', 'timetics' ) ),
128 );
129 // Merge the custom tab with existing actions
130 $actions = array_merge( $settings_tab, $actions );
131 }
132 return $actions;
133 }
134
135 /**
136 * Redirect onboarding page after activating
137 *
138 * @return void
139 */
140 public function redirect_onboard() {
141 $onboarding_setup = get_option( 'timetics_onboard_settings' );
142
143 if ( ! $onboarding_setup ) {
144 return;
145 }
146
147 update_option( 'timetics_onboard_setup', true );
148 update_option( 'timetics_onboard_settings', false );
149
150 wp_safe_redirect( admin_url('admin.php?page=timetics#/onboard') );
151 exit;
152 }
153
154 /**
155 * Update site admin roles whne new site created
156 *
157 * @param WP_Site $site_object
158 *
159 * @return void
160 */
161 public function update_user_role_on_insert_new_site( $site_object ) {
162 global $wpdb;
163
164 $roles = wp_roles()->roles;
165 $blog_id = $site_object->blog_id;
166 $roles_option_key = $wpdb->get_blog_prefix( $blog_id ) . 'user_roles';
167
168 update_blog_option( $blog_id, $roles_option_key, $roles );
169 }
170
171 /**
172 * Update user role timetics staff and customer if user is admin
173 *
174 * @param integer $user_id
175 * @param string $role
176 *
177 * @return void
178 */
179 public function set_roles( $user_id, $role ) {
180 if ( 'administrator' !== $role ) {
181 return;
182 }
183
184 $user = get_userdata( $user_id );
185 $user->add_role('timetics-staff');
186 $user->add_role('timetics-customer');
187 }
188
189 /**
190 * Hide the WP admin toolbar for customer-only users.
191 *
192 * @param bool $show
193 *
194 * @return bool
195 */
196 public function hide_admin_bar_for_customers( $show ) {
197 $user = wp_get_current_user();
198
199 if ( ! $user || ! $user->exists() ) {
200 return $show;
201 }
202
203 if ( $this->is_customer_only( $user ) ) {
204 return false;
205 }
206
207 return $show;
208 }
209
210 /**
211 * Redirect customer-only users away from /wp-admin/.
212 *
213 * @return void
214 */
215 public function block_admin_for_customers() {
216 if ( wp_doing_ajax() ) {
217 return;
218 }
219
220 $user = wp_get_current_user();
221
222 if ( $user && $user->exists() && $this->is_customer_only( $user ) ) {
223 wp_safe_redirect( home_url() );
224 exit;
225 }
226 }
227
228 /**
229 * Whether the given user's only Timetics-relevant role is timetics-customer.
230 *
231 * @param \WP_User $user
232 *
233 * @return bool
234 */
235 private function is_customer_only( $user ) {
236 $roles = (array) $user->roles;
237
238 return in_array( 'timetics-customer', $roles, true )
239 && ! array_intersect( $roles, [ 'administrator', 'editor', 'author', 'contributor', 'timetics-staff' ] );
240 }
241
242 /**
243 * Update busyness menu item
244 *
245 * @param array $menu_items
246 *
247 * @return array
248 */
249 public function update_busyness_menu($menu_items) {
250 $busyness_category = timetics_get_busyness_category();
251
252 if ( ! $busyness_category ) {
253 return $menu_items;
254 }
255
256 $busyness = timetics_get_busyness( $busyness_category );
257 $new_menu_items = [];
258
259 foreach ( $menu_items as $menu ) {
260 if ( empty( $menu['id'] ) ) {
261 continue;
262 }
263
264 if ( ! empty( $busyness[$menu['id']] ) ) {
265 $menu['title'] = $busyness[$menu['id']];
266 }
267
268 $new_menu_items[] = $menu;
269 }
270
271 return $new_menu_items;
272 }
273
274 /**
275 * Set google auth url
276 *
277 * @param array $settings
278 *
279 * @return array
280 */
281 public function set_google_auth_url( $settings ) {
282 $settings['google_auth_redirect_uri'] = timetics_get_auth_redirect_uri( 'google-auth' );
283
284 return $settings;
285 }
286
287 /**
288 * Set default settings
289 *
290 * @param array $settings [$settings description]
291 *
292 * @return mixed
293 */
294 public function set_email_default_content( $settings ) {
295
296
297 $admin_email = get_option( 'admin_email' );
298
299 /* translators: {%customer_name%} is a token replaced at runtime with the recipient customer's name */
300 $customer_greeting = __( 'Hi {%customer_name%}', 'timetics' );
301 /* translators: {%host_name%} is a token replaced at runtime with the recipient host's name */
302 $host_greeting = __( 'Hi {%host_name%}', 'timetics' );
303 $new_meeting_msg = __( 'A new meeting has been scheduled.', 'timetics' );
304 /* translators: {%meeting_title%} is a token replaced at runtime with the meeting title */
305 $canceled_msg = __( '{%meeting_title%} has been canceled.', 'timetics' );
306 /* translators: {%meeting_title%} is a token replaced at runtime with the meeting title */
307 $rescheduled_msg = __( '{%meeting_title%} has been rescheduled', 'timetics' );
308 /* translators: {%meeting_title%}, {%meeting_date%}, {%meeting_time%} are tokens replaced at runtime with the meeting details */
309 $reminder_msg = __( '{%meeting_title%} at {%meeting_date%} {%meeting_time%}', 'timetics' );
310
311 $defaults = [
312
313 'booking_created_customer_email_from' => $admin_email,
314 'booking_created_customer_email_title' => sprintf('%s', __( 'New meeting scheduled!', 'timetics' )),
315 'booking_created_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $new_meeting_msg),
316
317 'booking_created_host_email_from' => $admin_email,
318 'booking_created_host_email_title' => sprintf('%s', __( 'New meeting scheduled!', 'timetics' )),
319 'booking_created_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $new_meeting_msg),
320
321
322 'booking_canceled_customer_email_from' => $admin_email,
323 'booking_canceled_customer_email_title' => sprintf('%s', __( 'Meeting cancelled', 'timetics' )),
324 'booking_canceled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $canceled_msg),
325
326 'booking_canceled_host_email_from' => $admin_email,
327 'booking_canceled_host_email_title' => sprintf('%s', __( 'Meeting cancelled', 'timetics' )),
328 'booking_canceled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $canceled_msg),
329
330 'booking_rescheduled_customer_email_from' => $admin_email,
331 'booking_rescheduled_customer_email_title' => sprintf('%s', __( 'Meeting rescheduled!', 'timetics' )),
332 'booking_rescheduled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $rescheduled_msg),
333
334 'booking_rescheduled_host_email_from' => $admin_email,
335 'booking_rescheduled_host_email_title' => sprintf('%s', __('Meeting rescheduled!', 'timetics' )),
336 'booking_rescheduled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $rescheduled_msg),
337
338 'booking_reminder_customer_email_from' => $admin_email,
339 'booking_reminder_customer_email_title' => sprintf('%s', __( 'Meeting time reminder', 'timetics' )),
340 'booking_reminder_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $reminder_msg),
341
342 'booking_reminder_host_email_from' => $admin_email,
343 'booking_reminder_host_email_title' => sprintf('%s', __( 'Meeting time reminder', 'timetics' )),
344 'booking_reminder_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $reminder_msg),
345 ];
346
347 $settings = wp_parse_args( $settings, $defaults );
348
349 return $settings;
350 }
351 }
352