site_oueb_2/wp-content/plugins/ocean-extra/includes/admin-bar/notifications.php

341 lines
10 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Ocean Notifications.
*/
class Ocean_Notifications {
protected static $instance = null;
public $option = false;
const SOURCE_URL = 'https://notifi.oceanwp.org/notifications/notifications-info.json';
const OPTION_KEY = 'ocean_notifications';
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
public function __construct() {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueues' ) );
add_action( 'ocean_notifications_content', array( $this, 'output' ) );
// Action for cron
add_action( 'ocean_admin_notifications_update', array( $this, 'update' ) );
add_action( 'wp_ajax_ocean_notification_block', array( $this, 'block' ) );
}
/**
* Get option value
*/
public function get_option( $cache = true ) {
if ( $this->option && $cache ) {
return $this->option;
}
$option = get_option( self::OPTION_KEY, array() );
$this->option = array(
'update' => ! empty( $option['update'] ) ? $option['update'] : 0,
'notifications' => ! empty( $option['notifications'] ) ? $option['notifications'] : array(),
'blocked' => ! empty( $option['blocked'] ) ? $option['blocked'] : array(),
);
return $this->option;
}
/**
* Fetch notifications from feed
*/
public function fetch_notifications() {
$res = wp_remote_get( self::SOURCE_URL );
if ( is_wp_error( $res ) ) {
return array();
}
$body = wp_remote_retrieve_body( $res );
if ( empty( $body ) ) {
return array();
}
return $this->validate( json_decode( $body, true ) );
}
/**
* Validate notification data before it is saved
*/
public function validate( $notifications ) {
$data = array();
if ( ! is_array( $notifications ) || empty( $notifications || empty( $notifications['notifications'] ) ) ) {
return $data;
}
$option = $this->get_option();
foreach ( $notifications['notifications'] as $notification ) {
if ( empty( $notification['content'] ) ) {
continue;
}
if ( ! empty( $notification['end_date'] ) && time() > strtotime( $notification['end_date'] ) ) {
continue;
}
if ( ! empty( $option['blocked'] ) && in_array( $notification['id'], $option['blocked'] ) ) {
continue;
}
$data[] = $notification;
}
return $data;
}
/**
* Check start and end dates
*/
public function check_dates( $notifications ) {
if ( ! is_array( $notifications ) || empty( $notifications ) ) {
return array();
}
foreach ( $notifications as $key => $notification ) {
if (
( ! empty( $notification['start_date'] ) && time() < strtotime( $notification['start_date'] ) ) ||
( ! empty( $notification['end_date'] ) && time() > strtotime( $notification['end_date'] ) )
) {
unset( $notifications[ $key ] );
}
}
return $notifications;
}
/**
* Get notification details
*/
public function get() {
$option = $this->get_option();
if ( empty( $option['update'] ) || time() > $option['update'] + DAY_IN_SECONDS ) {
if ( ! wp_next_scheduled( 'ocean_admin_notifications_update' ) ) {
wp_schedule_single_event( time() + 60, 'ocean_admin_notifications_update' );
}
}
$notifications = ! empty( $option['notifications'] ) ? $this->check_dates( $option['notifications'] ) : array();
return array_merge( $notifications, array() );
}
/**
* Get notifications count
*/
public function get_count() {
return count( $this->get() );
}
/**
* Update notification details from remote storage
*/
public function update() {
$notifications = $this->fetch_notifications();
$option = $this->get_option();
update_option(
self::OPTION_KEY,
array(
'update' => time(),
'notifications' => $notifications,
'blocked' => $option['blocked'],
)
);
}
public function enqueues() {
$notifications = $this->get();
if ( empty( $notifications ) ) {
return;
}
wp_enqueue_style(
'ocean-admin-notifications',
plugins_url( 'assets/css/notifications.min.css', __FILE__ ),
array(),
OCEANWP_THEME_VERSION
);
wp_enqueue_script(
'ocean-admin-notifications',
plugins_url( 'assets/js/notifications.min.js', __FILE__ ),
array( 'jquery' ),
OCEANWP_THEME_VERSION
);
wp_localize_script(
'ocean-admin-notifications',
'ocean_notifications_admin',
$this->get_localized_data()
);
}
/**
* Output notifications
*/
public function output() {
$notifications = $this->get();
if ( empty( $notifications ) ) {
return;
}
$notifications_html = '';
$current_class = ' current';
$content_allowed_tags = array(
'em' => array(),
'strong' => array(),
'span' => array(
'style' => array(),
),
'a' => array(
'href' => array(),
'target' => array(),
'rel' => array(),
),
);
foreach ( $notifications as $notification ) {
// Buttons HTML
$buttons_html = '';
if ( ! empty( $notification['button_1_data'] ) ) {
$buttons_html .= sprintf(
'<a href="%1$s" class="button button-%2$s"%3$s>%4$s</a>',
! empty( $notification['button_1_data']['url'] ) ? esc_url( $notification['button_1_data']['url'] ) : '',
$notification['button_1_data']['primary'] === 'yes' ? 'primary' : 'secondary',
! empty( $notification['button_1_data']['target'] ) && $notification['button_1_data']['target'] === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '',
! empty( $notification['button_1_data']['title'] ) ? sanitize_text_field( $notification['button_1_data']['title'] ) : ''
);
}
if ( ! empty( $notification['button_2_data'] ) ) {
$buttons_html .= sprintf(
'<a href="%1$s" class="button button-%2$s"%3$s>%4$s</a>',
! empty( $notification['button_2_data']['url'] ) ? esc_url( $notification['button_2_data']['url'] ) : '',
$notification['button_2_data']['primary'] === 'yes' ? 'primary' : 'secondary',
! empty( $notification['button_2_data']['target'] ) && $notification['button_2_data']['target'] === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '',
! empty( $notification['button_2_data']['title'] ) ? sanitize_text_field( $notification['button_2_data']['title'] ) : ''
);
}
$buttons_html = ! empty( $buttons_html ) ? '<div class="ocean-notifications-buttons">' . $buttons_html . '</div>' : '';
// Notification HTML
$notifications_html .= sprintf(
'<div class="ocean-notifications-message%5$s" data-message-id="%4$s">
<h3 class="ocean-notifications-title">%1$s</h3>
<p class="ocean-notifications-content">%2$s</p>
%3$s
</div>',
! empty( $notification['title'] ) ? sanitize_text_field( $notification['title'] ) : '',
! empty( $notification['content'] ) ? wp_kses( $notification['content'], $content_allowed_tags ) : '',
$buttons_html,
! empty( $notification['id'] ) ? esc_attr( sanitize_text_field( $notification['id'] ) ) : 0,
$current_class
);
$current_class = '';
}
?>
<div id="ocean-notifications">
<div class="ocean-notifications-header">
<div class="ocean-notifications-icon">
<svg id="Layer_1" height="17" viewBox="0 0 512 512" width="17" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-name="Layer 1"><linearGradient id="Blue_2" gradientUnits="userSpaceOnUse" x1="6" x2="506" y1="256" y2="256"><stop offset="0" stop-color="#2bc4f3"/><stop offset=".5" stop-color="#00aeee"/><stop offset="1" stop-color="#0095da"/></linearGradient><linearGradient id="linear-gradient" gradientUnits="userSpaceOnUse" x1="154.596" x2="432.772" y1="154.595" y2="432.771"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><circle cx="256" cy="256" fill="url(#Blue_2)" r="250"/><path d="m502.233 299.422-144.833-144.829c-25.354-23.019-60.438-36.482-101.185-36.482-84.388 0-144.607 57.661-144.607 137.889 0 41.369 16.012 76.738 43.093 101.3l144.91 144.9a250.221 250.221 0 0 0 202.622-202.778z" fill="url(#linear-gradient)" opacity=".49"/><path d="m256.219 393.889c-84.388 0-144.607-57.661-144.607-137.889s60.219-137.889 144.607-137.889c84.168 0 144.169 57.443 144.169 137.889s-60 137.885-144.169 137.885zm0-67.291c39.952 0 68.872-29.513 68.872-70.591s-28.92-70.594-68.872-70.594-69.31 29.727-69.31 70.587 29.352 70.59 69.31 70.59z" fill="#fff"/></svg>
</div>
<div class="ocean-notifications-title"><?php esc_html_e( 'OceanWP News', 'ocean-extra' ); ?></div>
</div>
<div class="ocean-notifications-body">
<button type="button" class="notice-dismiss"><span class="screen-reader-text"><?php echo esc_attr__( 'Block this message', 'ocean-extra' ); ?></span></button>
<?php if ( count( $notifications ) > 1 ) : ?>
<div class="navigation">
<a class="prev">
<span class="screen-reader-text"><?php esc_attr_e( 'Previous message', 'ocean-extra' ); ?></span>
<span aria-hidden="true"></span>
</a>
<a class="next">
<span class="screen-reader-text"><?php esc_attr_e( 'Next message', 'ocean-extra' ); ?>"></span>
<span aria-hidden="true"></span>
</a>
</div>
<?php endif; ?>
<div class="ocean-notifications-messages">
<?php
echo $notifications_html;
?>
</div>
</div>
</div>
<?php
}
/**
* Block notification
*/
public function block() {
check_ajax_referer( 'ocean-notifications-admin', 'nonce' );
if ( empty( $_POST['id'] ) ) {
wp_send_json_error();
}
$id = sanitize_text_field( wp_unslash( $_POST['id'] ) );
$option = $this->get_option();
$type = 'notifications';
$option['blocked'][] = $id;
$option['blocked'] = array_unique( $option['blocked'] );
if ( is_array( $option[ $type ] ) && ! empty( $option[ $type ] ) ) {
foreach ( $option[ $type ] as $key => $notification ) {
if ( (string) $notification['id'] === (string) $id ) {
unset( $option[ $type ][ $key ] );
break;
}
}
}
update_option( 'ocean_notifications', $option );
wp_send_json_success();
}
private function get_localized_data() {
$strings = array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'ocean-notifications-admin' ),
);
return $strings;
}
}
function ocean_notifications() {
return Ocean_Notifications::get_instance();
}
// Initialize Ocean_Notifications
ocean_notifications();