oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/Notice/Notice.php
2025-03-31 21:42:48 +02:00

276 lines
6.9 KiB
PHP

<?php // phpcs:ignore WordPress.Files.FileName
/**
* Admin-Notices class.
*
* Creates an admin notice with consistent styling.
*
* @package pressmodo/wp-admin-notices
* @author WPTRT <themes@wordpress.org>
* @author Pressmodo <hello@pressmodo.com>
* @copyright 2019 WPTRT
* @copyright 2020 Sematico LTD
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL-3.0-or-later
* @link https://github.com/pressmodo/wp-admin-notices
*/
namespace CTXFeed\V5\Notice;
/**
* The Admin_Notice class, responsible for creating admin notices.
*
* Each notice is a new instance of the object.
*
* @since 1.0.0
*/
class Notice {
/**
* The notice-ID.
*
* @access private
* @since 1.0
* @var string
*/
private $id;
/**
* The notice message.
*
* @access private
* @since 1.0
* @var string
*/
private $message;
/**
* An instance of the \Pressmodo\AdminNotices\Dismiss object.
*
* @access public
* @since 1.0
* @var Dismiss
*/
public $dismiss;
/**
* The notice arguments.
*
* @access private
* @since 1.0
* @var array
*/
private $options = array(
'scope' => 'global',
'type' => 'info',
'alt_style' => false,
'capability' => 'edit_theme_options',
'option_prefix' => 'pressmodo_notice_dismissed',
'screens' => array(),
'dismissible' => true,
);
/**
* An array of allowed types.
*
* @access private
* @since 1.0
* @var array
*/
private $allowed_types = array(
'info',
'success',
'error',
'warning',
);
/**
* The title for our notice.
*
* @var string
*/
private $title;
/**
* Constructor.
*
* @access public
* @since 1.0
* @param string $id A unique ID for this notice. Can contain lowercase characters and underscores.
* @param string $title The title for our notice.
* @param string $message The message for our notice.
* @param array $options An array of additional options to change the defaults for this notice.
* [
* 'screens' => (array) An array of screens where the notice will be displayed.
* Leave empty to always show.
* Defaults to an empty array.
* 'scope' => (string) Can be "global" or "user".
* Determines if the dismissed status will be saved as an option or user-meta.
* Defaults to "global".
* 'type' => (string) Can be one of "info", "success", "warning", "error".
* Defaults to "info".
* 'alt_style' => (bool) Whether we want to use alt styles or not.
* Defaults to false.
* 'capability' => (string) The user capability required to see the notice.
* Defaults to "edit_theme_options".
* 'option_prefix' => (string) The prefix that will be used to build the option (or post-meta) name.
* Can contain lowercase latin letters and underscores.
* 'dismissible' => (bool) Whether or not the notice can be dismissed. Defaults to true.
* ].
*/
public function __construct( $id, $title, $message, $options = array() ) {
// Set the object properties.
$this->id = $id;
$this->title = $title;
$this->message = $message;
$this->options = wp_parse_args( $options, $this->options );
// Sanity check: Early exit if ID or message are empty.
if ( ! $this->id || ! $this->message ) {
return;
}
// Instantiate the Dismiss object.
$this->dismiss = new Dismiss( $this->id, $this->options['option_prefix'], $this->options['scope'] );
}
/**
* Prints the notice.
*
* @access public
* @since 1.0
* @return void
*/
public function the_notice() {
// Early exit if we don't want to show this notice.
if ( ! $this->show() ) {
return;
}
$html = $this->get_title();
$html .= $this->get_message();
// Print the notice.
printf(
'<div id="%1$s" class="%2$s">%3$s</div>',
'pressmodo-notice-' . esc_attr($this->id) , // The ID.
esc_attr($this->get_classes()) , // The classes.
wp_kses_post($html) // The HTML.
);
}
/**
* Determine if the notice should be shown or not.
*
* @access public
* @since 1.0
* @return bool
*/
public function show() {
// Don't show if the user doesn't have the required capability.
if ( ! current_user_can( $this->options['capability'] ) ) {
return false;
}
// Don't show if we're not on the right screen.
if ( ! $this->is_screen() ) {
return false;
}
// Don't show if notice has been dismissed.
if ( $this->dismiss->is_dismissed() ) {
return false;
}
return true;
}
/**
* Get the notice classes.
*
* @access public
* @since 1.0
* @return string
*/
public function get_classes() {
$classes = array(
'notice',
'is-dismissible',
);
// Make sure the defined type is allowed.
$this->options['type'] = in_array( $this->options['type'], $this->allowed_types, true ) ? $this->options['type'] : 'info';
// Add the class for notice-type.
$classes[] = 'notice-' . $this->options['type'];
// Do we want alt styles?
if ( $this->options['alt_style'] ) {
$classes[] = 'notice-alt';
}
if ( ! $this->options['dismissible'] ) {
if ( ( $key = array_search( 'is-dismissible', $classes, true ) ) !== false ) {
unset( $classes[ $key ] );
}
}
// Combine classes to a string.
return implode( ' ', $classes );
}
/**
* Returns the title.
*
* @access public
* @since 1.0
* @return string
*/
public function get_title() {
// Sanity check: Early exit if no title is defined.
if ( ! $this->title ) {
return '';
}
return sprintf(
'<h2 class="notice-title">%s</h2>',
wp_strip_all_tags( $this->title )
);
}
/**
* Returns the message.
*
* @access public
* @since 1.0
* @return string
*/
public function get_message() {
return wpautop( wp_kses_post( $this->message ) );
}
/**
* Evaluate if we're on the right place depending on the "screens" argument.
*
* @access private
* @since 1.0
* @return bool
*/
private function is_screen() {
// If screen is empty we want this shown on all screens.
if ( ! $this->options['screens'] || empty( $this->options['screens'] ) ) {
return true;
}
// Make sure the get_current_screen function exists.
if ( ! function_exists( 'get_current_screen' ) ) {
require_once ABSPATH . 'wp-admin/includes/screen.php';
}
// Check if we're on one of the defined screens.
return ( in_array( get_current_screen()->id, $this->options['screens'], true ) );
}
}