kollapsminoriteten/wp-content/themes/feather-magazine/inc/superbthemes-info-content/admin-notice/class-admin-notice-controll...

225 lines
7.4 KiB
PHP
Raw Permalink Normal View History

2025-02-28 08:42:11 +01:00
<?php
namespace SuperbThemesThemeInformationContent\AdminNotices;
defined('ABSPATH') || exit();
class AdminNoticeController
{
const PREFIX = 'spbtic_notice_';
const PREFIX_DELAY = 'spbtic_notice_delay_';
const ALLOWED_HTML = [
'div' => [
'class' => [],
],
'p' => [
'class' => [],
],
'h2' => [
'class' => [],
],
'ul' => [
'class' => [],
],
'li' => [
'class' => [],
],
'span' => [
'class' => [],
],
'a' => [
'class' => [],
'href' => [],
'rel' => [],
'target' => [],
],
'em' => [
'class' => [],
],
'strong' => [
'class' => [],
],
'img' => [
'class' => [],
'alt' => [],
'src' => [],
'width' => [],
'height' => [],
],
'br' => [],
'style' => [],
];
private static $notices = [];
public static function init($options)
{
$notices = [];
if (isset($options['notices']) && is_array($options['notices'])) {
foreach ($options['notices'] as $notice) {
if (!isset($notice['unique_id']) || !isset($notice['content'])) {
continue;
}
$notices[] = $notice;
}
}
$stylesheet = get_stylesheet();
$addons_notice = $stylesheet . '_addons_notification';
$addons_notice_def = $stylesheet . '_addons_notification_def';
$theme_notice = $stylesheet . '_theme_notification';
$notices[] = array(
'unique_id' => $addons_notice,
'content' => "addons-notice.php",
'remove_if_active' => 'superb-blocks/plugin.php'
);
$notices[] = array(
'unique_id' => $addons_notice_def,
'content' => "addons-notice-def.php",
'requires_dismiss' => $addons_notice,
'remove_if_active' => 'superb-blocks/plugin.php',
'delay' => '+3 days'
);
if (isset($options['theme_url'])) {
$notices[] = array(
'unique_id' => $theme_notice,
'content' => "theme-notice.php",
'data' => [
'theme_url' => $options['theme_url']
],
'delay' => '+2 days'
);
}
self::$notices = $notices;
add_action('admin_notices', array(__CLASS__, 'AdminNotices'));
add_action('wp_ajax_spbtic_dismiss_notice', array(__CLASS__, 'MaybeDismissNotice'));
}
public static function AdminNotices()
{
foreach (self::$notices as $notice) {
$notice_path = trailingslashit(get_template_directory()) . 'inc/superbthemes-info-content/admin-notice/notices/' . $notice['content'];
if (!file_exists($notice_path)) {
continue;
}
// Remove notice if the required plugin is active
if (isset($notice['remove_if_active'])) {
if (is_plugin_active($notice['remove_if_active'])) {
continue;
}
}
// Check if the notice requires another notice to be dismissed.
if (isset($notice['requires_dismiss'])) {
if (!get_user_meta(get_current_user_id(), self::PREFIX . $notice['requires_dismiss'], true)) {
continue;
}
}
// Check if the notice has been dismissed.
if (get_user_meta(get_current_user_id(), self::PREFIX . $notice['unique_id'], true)) {
continue;
}
// Check if the notice is delayed
if (isset($notice['delay'])) {
$delay_init = get_user_meta(get_current_user_id(), self::PREFIX_DELAY . $notice['unique_id'], true);
if (!$delay_init) {
update_user_meta(get_current_user_id(), self::PREFIX_DELAY . $notice['unique_id'], time());
continue;
}
$delay = strtotime($notice['delay'], $delay_init);
if ($delay > time()) {
continue;
}
}
ob_start();
include_once $notice_path;
$content = ob_get_clean();
echo wp_kses($content, self::ALLOWED_HTML);
}
self::PrintScripts();
}
public static function PrintScripts()
{
?>
<script>
window.addEventListener("load", function() {
setTimeout(function() {
var notice_ids = <?php echo json_encode(array_column(self::$notices, 'unique_id')); ?>;
var nonce = "<?php echo esc_attr(wp_create_nonce('spbtic_dismiss_notice')); ?>";
var ajaxurl = "<?php echo esc_url(admin_url('admin-ajax.php')); ?>";
notice_ids.forEach(function(notice) {
var dismissBtn = document.querySelector(
"." + notice + " .notice-dismiss"
);
if (!dismissBtn) return;
// Add an event listener to the dismiss button.
dismissBtn.addEventListener("click", function(event) {
var httpRequest = new XMLHttpRequest(),
postData = "";
// Build the data to send in our request.
// Data has to be formatted as a string here.
postData += "id=" + notice;
postData += "&action=spbtic_dismiss_notice";
postData += "&nonce=" + nonce;
httpRequest.open("POST", ajaxurl);
httpRequest.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);
httpRequest.send(postData);
});
});
}, 0);
});
</script>
<?php
}
public static function MaybeDismissNotice()
{
// Sanity check: Early exit if we're not on a spbtic_dismiss_notice action.
if (!isset($_POST['action']) || 'spbtic_dismiss_notice' !== $_POST['action']) {
return;
}
// Sanity check: Early exit if the ID of the notice does not exist.
if (!isset($_POST['id']) || !in_array($_POST['id'], array_column(self::$notices, 'unique_id'))) {
return;
}
// Notice ID exists in array, so we can safely use it.
$notice_id = sanitize_text_field($_POST['id']);
// Security check: Make sure nonce is OK. check_ajax_referer exits if it fails.
check_ajax_referer('spbtic_dismiss_notice', 'nonce', true);
update_user_meta(get_current_user_id(), self::PREFIX . $notice_id, true);
}
public static function Cleanup()
{
foreach (self::$notices as $notice) {
delete_user_meta(get_current_user_id(), self::PREFIX . $notice['unique_id']);
if (isset($notice['delay'])) {
delete_user_meta(get_current_user_id(), self::PREFIX_DELAY . $notice['unique_id']);
}
}
}
}