Files
wp-multisite-waas/inc/ui/class-tours.php
2025-02-15 23:19:24 -07:00

164 lines
3.1 KiB
PHP

<?php
/**
* Adds the Tours UI to the Admin Panel.
*
* @package WP_Ultimo
* @subpackage UI
* @since 2.0.0
*/
namespace WP_Ultimo\UI;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Adds the Tours UI to the Admin Panel.
*
* @since 2.0.0
*/
class Tours {
use \WP_Ultimo\Traits\Singleton;
/**
* Registered tours.
*
* @since 2.0.0
* @var array
*/
protected $tours = [];
/**
* Element construct.
*
* @since 2.0.0
*/
public function __construct() {
add_action('wp_ajax_wu_mark_tour_as_finished', [$this, 'mark_as_finished']);
add_action('admin_enqueue_scripts', [$this, 'register_scripts']);
add_action('in_admin_footer', [$this, 'enqueue_scripts']);
}
/**
* Mark the tour as finished for a particular user.
*
* @since 2.0.0
* @return void
*/
public function mark_as_finished(): void {
check_ajax_referer('wu_tour_finished', 'nonce');
$id = wu_request('tour_id');
if ($id) {
set_user_setting("wu_tour_$id", true);
wp_send_json_success();
}
wp_send_json_error();
}
/**
* Register the necessary scripts.
*
* @since 2.0.0
* @return void
*/
public function register_scripts(): void {
WP_Ultimo()->scripts->register_script('wu-shepherd', wu_get_asset('lib/shepherd.js', 'js'), []);
WP_Ultimo()->scripts->register_script('wu-tours', wu_get_asset('tours.js', 'js'), ['wu-shepherd', 'underscore']);
}
/**
* Enqueues the scripts, if we need to.
*
* @since 2.0.0
* @return void
*/
public function enqueue_scripts(): void {
if ($this->has_tours()) {
wp_localize_script('wu-tours', 'wu_tours', $this->tours);
wp_localize_script(
'wu-tours',
'wu_tours_vars',
[
'ajaxurl' => wu_ajax_url(),
'nonce' => wp_create_nonce('wu_tour_finished'),
'i18n' => [
'next' => __('Next', 'wp-multisite-waas'),
'finish' => __('Close', 'wp-multisite-waas'),
],
]
);
wp_enqueue_script('wu-tours');
}
}
/**
* Checks if we have registered tours.
*
* @since 2.0.0
* @return boolean
*/
public function has_tours() {
return ! empty($this->tours);
}
/**
* Register a new tour.
*
* @see https://shepherdjs.dev/docs/
*
* @since 2.0.0
*
* @param string $id The id of the tour.
* @param array $steps The tour definition. Check shepherd.js docs.
* @param boolean $once Whether or not we will show this more than once.
* @return void
*/
public function create_tour($id, $steps = [], $once = true): void {
if (did_action('in_admin_header')) {
return;
}
add_action(
'in_admin_header',
function () use ($id, $steps, $once) {
$force_hide = wu_get_setting('hide_tours', false);
if ($force_hide) {
return;
}
$finished = (bool) get_user_setting("wu_tour_$id", false);
$finished = apply_filters('wu_tour_finished', $finished, $id, get_current_user_id());
if ( ! $finished || ! $once) {
foreach ($steps as &$step) {
$step['text'] = is_array($step['text']) ? implode('</p><p>', $step['text']) : $step['text'];
$step['text'] = sprintf('<p>%s</p>', $step['text']);
}
$this->tours[ $id ] = $steps;
}
}
);
}
}