| @@ -4,11 +4,13 @@ | ||
| 4 | 4 | * |
| 5 | 5 | * @package Timetics |
| 6 | 6 | */ |
| 7 | 7 | namespace Timetics\Core\Admin; |
| 8 | + | |
| 9 | +defined( 'ABSPATH' ) || exit; | |
| 10 | + | |
| 8 | 11 | use Timetics\Utils\Singleton; |
| 9 | 12 | |
| 10 | -use function Timetics\timetics; | |
| 11 | 13 | |
| 12 | 14 | class Hooks { |
| 13 | 15 | use Singleton; |
| 14 | 16 | |
| @@ -31,8 +33,11 @@ | ||
| 31 | 33 | add_action( 'wp_initialize_site', [ $this, 'update_user_role_on_insert_new_site' ], 110 ); |
| 32 | 34 | |
| 33 | 35 | add_action( 'set_user_role', [ $this, 'set_roles' ], 10, 2 ); |
| 34 | 36 | |
| 37 | + add_filter( 'show_admin_bar', [ $this, 'hide_admin_bar_for_customers' ] ); | |
| 38 | + add_action( 'admin_init', [ $this, 'block_admin_for_customers' ] ); | |
| 39 | + | |
| 35 | 40 | add_filter( 'timetics_menu', [ $this, 'update_busyness_menu' ] ); |
| 36 | 41 | |
| 37 | 42 | add_filter( 'timetics_settings', [ $this, 'set_google_auth_url' ] ); |
| 38 | 43 | |
| @@ -71,8 +76,9 @@ | ||
| 71 | 76 | |
| 72 | 77 | echo wp_kses_post( $notice ); |
| 73 | 78 | |
| 74 | 79 | $admin_ajax_url = admin_url('admin-ajax.php'); |
| 80 | + $nonce = wp_create_nonce( 'timetics_dismiss_wc_notice' ); | |
| 75 | 81 | |
| 76 | 82 | ?> |
| 77 | 83 | <script> |
| 78 | 84 | jQuery(document).ready(function($) { |
| @@ -78,8 +84,9 @@ | ||
| 78 | 84 | jQuery(document).ready(function($) { |
| 79 | 85 | $('.notice.is-dismissible').on('click', '.notice-dismiss', function() { |
| 80 | 86 | var data = { |
| 81 | 87 | action: 'dismiss_woocommerce_notice', |
| 88 | + nonce: '<?php echo esc_js( $nonce ); ?>', | |
| 82 | 89 | }; |
| 83 | 90 | |
| 84 | 91 | $.post('<?php echo esc_url( $admin_ajax_url ); ?>', data, function(response) { |
| 85 | 92 | console.log(response); |
| @@ -95,8 +102,10 @@ | ||
| 95 | 102 | * |
| 96 | 103 | * @return void |
| 97 | 104 | */ |
| 98 | 105 | public function dismiss_woocommerce_notice() { |
| 106 | + check_ajax_referer( 'timetics_dismiss_wc_notice', 'nonce' ); | |
| 107 | + | |
| 99 | 108 | // Store the notice state in user meta |
| 100 | 109 | update_user_meta( get_current_user_id(), 'timetics_woocommerce_notice_dismissed', true ); |
| 101 | 110 | |
| 102 | 111 | wp_send_json_success('Notice dismissed successfully.'); |
| @@ -137,9 +146,10 @@ | ||
| 137 | 146 | |
| 138 | 147 | update_option( 'timetics_onboard_setup', true ); |
| 139 | 148 | update_option( 'timetics_onboard_settings', false ); |
| 140 | 149 | |
| 141 | - exit( wp_redirect( admin_url('admin.php?page=timetics#/onboard') ) ); | |
| 150 | + wp_safe_redirect( admin_url('admin.php?page=timetics#/onboard') ); | |
| 151 | + exit; | |
| 142 | 152 | } |
| 143 | 153 | |
| 144 | 154 | /** |
| 145 | 155 | * Update site admin roles whne new site created |
| @@ -176,8 +186,61 @@ | ||
| 176 | 186 | $user->add_role('timetics-customer'); |
| 177 | 187 | } |
| 178 | 188 | |
| 179 | 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 | + /** | |
| 180 | 243 | * Update busyness menu item |
| 181 | 244 | * |
| 182 | 245 | * @param array $menu_items |
| 183 | 246 | * |
| @@ -225,47 +288,61 @@ | ||
| 225 | 288 | * Set default settings |
| 226 | 289 | * |
| 227 | 290 | * @param array $settings [$settings description] |
| 228 | 291 | * |
| 229 | - * @return array | |
| 292 | + * @return mixed | |
| 230 | 293 | */ |
| 231 | 294 | public function set_email_default_content( $settings ) { |
| 295 | + | |
| 296 | + | |
| 232 | 297 | $admin_email = get_option( 'admin_email' ); |
| 233 | 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 | + | |
| 234 | 311 | $defaults = [ |
| 235 | 312 | |
| 236 | 313 | 'booking_created_customer_email_from' => $admin_email, |
| 237 | 314 | 'booking_created_customer_email_title' => sprintf('%s', __( 'New meeting scheduled!', 'timetics' )), |
| 238 | - 'booking_created_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%customer_name%}', 'timetics' ), __( 'A new meeting has been scheduled.', 'timetics' )), | |
| 315 | + 'booking_created_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $new_meeting_msg), | |
| 239 | 316 | |
| 240 | 317 | 'booking_created_host_email_from' => $admin_email, |
| 241 | 318 | 'booking_created_host_email_title' => sprintf('%s', __( 'New meeting scheduled!', 'timetics' )), |
| 242 | - 'booking_created_host_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%host_name%}', 'timetics' ), __( 'A new meeting has been scheduled.', 'timetics' )), | |
| 319 | + 'booking_created_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $new_meeting_msg), | |
| 243 | 320 | |
| 244 | 321 | |
| 245 | 322 | 'booking_canceled_customer_email_from' => $admin_email, |
| 246 | 323 | 'booking_canceled_customer_email_title' => sprintf('%s', __( 'Meeting cancelled', 'timetics' )), |
| 247 | - 'booking_canceled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%customer_name%}', 'timetics' ), __( '{%meeting_title%} has been canceled.', 'timetics' )), | |
| 324 | + 'booking_canceled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $canceled_msg), | |
| 248 | 325 | |
| 249 | 326 | 'booking_canceled_host_email_from' => $admin_email, |
| 250 | 327 | 'booking_canceled_host_email_title' => sprintf('%s', __( 'Meeting cancelled', 'timetics' )), |
| 251 | - 'booking_canceled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%host_name%}', 'timetics' ), __( '{%meeting_title%} has been canceled.', 'timetics' )), | |
| 328 | + 'booking_canceled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $canceled_msg), | |
| 252 | 329 | |
| 253 | 330 | 'booking_rescheduled_customer_email_from' => $admin_email, |
| 254 | 331 | 'booking_rescheduled_customer_email_title' => sprintf('%s', __( 'Meeting rescheduled!', 'timetics' )), |
| 255 | - 'booking_rescheduled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%host_name%}', 'timetics' ), __( '{%meeting_title%} has been rescheduled', 'timetics' )), | |
| 332 | + 'booking_rescheduled_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $rescheduled_msg), | |
| 256 | 333 | |
| 257 | 334 | 'booking_rescheduled_host_email_from' => $admin_email, |
| 258 | 335 | 'booking_rescheduled_host_email_title' => sprintf('%s', __('Meeting rescheduled!', 'timetics' )), |
| 259 | - 'booking_rescheduled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%host_name%}', 'timetics' ), __( '{%meeting_title%} has been rescheduled', 'timetics' )), | |
| 336 | + 'booking_rescheduled_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $rescheduled_msg), | |
| 260 | 337 | |
| 261 | 338 | 'booking_reminder_customer_email_from' => $admin_email, |
| 262 | 339 | 'booking_reminder_customer_email_title' => sprintf('%s', __( 'Meeting time reminder', 'timetics' )), |
| 263 | - 'booking_reminder_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%customer_name%}', 'timetics' ), __( '{%meeting_title%} at {%meeting_date%} {%meeting_time%}', 'timetics' )), | |
| 340 | + 'booking_reminder_customer_email_body' => sprintf('<p>%s</p><p>%s</p>', $customer_greeting, $reminder_msg), | |
| 264 | 341 | |
| 265 | 342 | 'booking_reminder_host_email_from' => $admin_email, |
| 266 | 343 | 'booking_reminder_host_email_title' => sprintf('%s', __( 'Meeting time reminder', 'timetics' )), |
| 267 | - 'booking_reminder_host_email_body' => sprintf('<p>%s</p><p>%s</p>', __( 'Hi {%host_name%}', 'timetics' ), __( '{%meeting_title%} at {%meeting_date%} {%meeting_time%}', 'timetics' )), | |
| 344 | + 'booking_reminder_host_email_body' => sprintf('<p>%s</p><p>%s</p>', $host_greeting, $reminder_msg), | |
| 268 | 345 | ]; |
| 269 | 346 | |
| 270 | 347 | $settings = wp_parse_args( $settings, $defaults ); |
| 271 | 348 | |