<?php /* * Copyright (C) 2014 Panagiotis Vagenas <pan.vagenas@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /** * @author Panagiotis Vagenas <pan.vagenas@gmail.com> * @url https://bitbucket.org/vagenas/wp-admin-notices/wiki/Home * @ */ if (!class_exists('WP_Admin_Notices')) { /** * Singleton class of WP_Admin_Notices * Please see https://bitbucket.org/vagenas/wp-admin-notices/wiki/Home * * @author Panagiotis Vagenas <pan.vagenas@gmail.com> */ class WP_Admin_Notices { /** * Instance of this class. * * @since 1.0.0 * @var WP_Admin_Notices */ protected static $instance = null; /** * Name of the array that will be stored in DB * @var string * @since 1.0.0 */ protected $noticesArrayName = 'WCQDWPAdminNotices'; /** * Name of the GET / POST that will be to remove the msg * @var string * @since 1.0.0 */ protected $REQUESTID = 'WCQDRMSG'; /** * Notices array as loaded from DB * @var array * @since 1.0.0 */ protected $notices = array(); /** * Costructor (private since this is a singleton) */ private function __construct() { $this->loadNotices(); $this->auto_remove_Notice(); add_action('admin_notices', array($this, 'displayNotices')); } /** * Returns an instance of this class. * * @since 1.0.0 * @return WP_Admin_Notices */ public static function getInstance() { if (null == self::$instance) { self::$instance = new self(); } return self::$instance; } /** * Loads notices from DB */ private function loadNotices() { $notices = get_option($this->noticesArrayName); if (is_array($notices)) { $this->notices = $notices; } } /** * Action hook to display notices. * Just echoes notices that should be displayed. */ public function displayNotices() { foreach ($this->notices as $key => $notice) { if ($this->isTimeToDisplay($notice)) { echo $notice->getContentFormated($notice->getWrapper()); $notice->incrementDisplayedTimes(); } if($notice->getTimes() > 0){ if ($notice->isTimeToDie()) { unset($this->notices[$key]); } } } $this->storeNotices(); } /** * Removes Notice By Getting ID From GET / POST METHOD */ public function auto_remove_Notice(){ if(isset($_REQUEST[$this->REQUESTID])){ $nonce = $_REQUEST['_wpnonce']; //var_dump($nonce); exit; //if (wp_verify_nonce( $nonce, 'WCQDREMOVEMSG' ) ) { $this->deleteNotice($_REQUEST[$this->REQUESTID]); if (wp_get_referer()){ wp_safe_redirect( wp_get_referer() ); } //} } } /** * Stores notices in DB */ private function storeNotices() { update_option($this->noticesArrayName, $this->notices); } /** * Deletes a notice * @param int $notId The notice unique id */ public function deleteNotice($notId) { foreach ($this->notices as $key => $notice) { if ($notice->getId() === $notId) { unset($this->notices[$key]); break; } } $this->storeNotices(); } /** * Adds a notice to be displayed * @param erpAdminMessage $notice */ public function addNotice(WP_Notice $notice) { $this->notices[] = $notice; $this->storeNotices(); } /** * Checks if is time to display a notice * @param WP_Notice $notice * @return bool */ private function isTimeToDisplay(WP_Notice $notice) { $screens = $notice->getScreen(); if (!empty($screens)) { $curScreen = get_current_screen(); if (!is_array($screens) || !in_array($curScreen->id, $screens)) { return false; } } $usersArray = $notice->getUsers(); if (!empty($usersArray)) { $curUser = get_current_user_id(); if (!is_array($usersArray) || !in_array($curUser, $usersArray) || $usersArray[$curUser] >= $notice->getTimes()) { return false; } } else if ($notice->getTimes() == 0) { return true; } else if ($notice->getTimes() <= $notice->getDisplayedTimes()) { return false; } return true; } } } if (!class_exists('WP_Notice')) { /** * Abstract class of a notice * * @author Panagiotis Vagenas <pan.vagenas@gmail.com> */ abstract class WP_Notice { /** * Notice message to be displayed * @var string */ protected $content; /** * Notice type * @var string */ protected $type; /** * In which screens the notice to be displayed * @var array */ protected $screen; /** * Unique identifier for notice * @var int */ protected $id; /** * Number of times to be displayed * @var int */ protected $times = 1; /** * User ids this notice should be displayed * @var array */ protected $users = array(); /** * Number of times this message is displayed * @var int */ protected $displayedTimes = 0; /** * Keeps track of how many times and to * which users this notice is displayed * @var array */ protected $displayedToUsers = array(); /** * With Or WithOut Wraper * @var array */ protected $WithWraper = true; /** * * @param type $content Coantent to be displayed * @param type $times How many times this notice will be displayed * @param array $screen The admin screens this notice will be displayed into (empty for all screens) * @param array $users Array of users this notice concernes (empty for all users) */ public function __construct($content, $times = 1, Array $screen = array(), Array $users = array(), $WithWraper = true) { $this->content = $content; $this->screen = $screen; $this->id = uniqid(); $this->times = $times; $this->users = $users; $this->WithWraper = $WithWraper; } /** * Get the content of the notice * @param bool $wrapInParTag If the content should be wrapped in a paragraph tag * @return string Formated content */ public function getContentFormated($wrapInParTag = true) { $before = '<div class="' . $this->type . '">'; $before .= $wrapInParTag ? '<p>' : ''; $after = $wrapInParTag ? '</p>' : ''; $after .= '</div>'; return $before . $this->getContent() . $after; } /** * Increment displayed times of the notice * @return \WP_Notice */ public function incrementDisplayedTimes() { $this->displayedTimes++; if (array_key_exists(get_current_user_id(), $this->displayedToUsers)) { $this->displayedToUsers[get_current_user_id()] ++; } else { $this->displayedToUsers[get_current_user_id()] = 1; } return $this; } /** * Checks if the notice should me destroyed * @return boolean True iff notice is deprecated */ public function isTimeToDie() { if (empty($this->users)) { return $this->displayedTimes >= $this->times; } else { $i = 0; foreach ($this->users as $key => $value) { if (isset($this->displayedToUsers[$value]) && $this->displayedToUsers[$value] >= $this->times) { $i++; } } if ($i >= count($this->users)) { return true; } } return false; } /** * Get the $WithWraper Value */ public function getWrapper(){ return $this->WithWraper; } /** * Set the $WithWraper Value * @param boolean $screen */ public function setWrapper($wrapper = true){ $this->WithWraper = $wrapper; return $this; } /** * Get the current screen slug * @return string Current screen slug */ public function getScreen() { return $this->screen; } /** * Set the screens the notice will be displayed * @param array $screen * @return \WP_Notice */ public function setScreen(Array $screen) { $this->screen = $screen; return $this; } /** * Get the notice string unformated * @return string */ public function getContent() { return $this->content; } /** * * @param string $content * @return \WP_Notice */ public function setContent($content) { $this->content = $content; return $this; } /** * * @return string */ public function getId() { return $this->id; } /** * * @return int */ public function getTimes() { return $this->times; } /** * * @return array */ public function getUsers() { return $this->users; } /** * * @param int $times * @return \WP_Notice */ public function setTimes($times) { $this->times = $times; return $this; } /** * * @param array $users * @return \WP_Notice */ public function setUsers(Array $users) { $this->users = $users; return $this; } /** * * @return int */ public function getDisplayedTimes() { return $this->displayedTimes; } /** * * @return array */ public function getDisplayedToUsers() { return $this->displayedToUsers; } /** * * @param int $displayedTimes * @return \WP_Notice */ public function setDisplayedTimes($displayedTimes) { $this->displayedTimes = $displayedTimes; return $this; } /** * * @param array $displayedToUsers * @return \WP_Notice */ public function setDisplayedToUsers(Array $displayedToUsers) { $this->displayedToUsers = $displayedToUsers; return $this; } } /** * Type of notices */ class WP_Error_Notice extends WP_Notice { protected $type = 'error wcQD'; } class WP_Updated_Notice extends WP_Notice { protected $type = 'updated'; } class WP_UpdateNag_Notice extends WP_Notice { protected $type = 'update-nag'; } } /** * Hook action to admin init */ if(!has_action('init', array('WP_Admin_Notices', 'getInstance'))){ add_action('init', array('WP_Admin_Notices', 'getInstance')); } //WP_Admin_Notices::getInstance(); if ( ! function_exists( 'wc_qd_notice' ) ) { function wc_qd_notice( $message, $type = 'update',$args = array()) { $notice = ''; $defaults = array('times' => 1,'screen' => array(),'users' => array(), 'wraper' => true); $args = wp_parse_args( $args, $defaults ); extract($args); if($type == 'error'){$notice = new WP_Error_Notice($message,$times, $screen, $users);} if($type == 'update'){$notice = new WP_Updated_Notice($message,$times, $screen, $users);} if($type == 'upgrade'){$notice = new WP_UpdateNag_Notice($message,$times, $screen, $users);} $msgID = $notice->getId(); $message = str_replace('$msgID$',$msgID,$message); $notice->setContent($message); $notice->setWrapper($wraper); WP_Admin_Notices::getInstance()->addNotice($notice); } } if ( ! function_exists( 'wc_qd_remove_link' ) ) { function wc_qd_remove_link($attributes = '',$msgID = '$msgID$', $text = 'Remove Notice') { if(!empty($msgID)){ $url = admin_url().'?WCQDRMSG='.$msgID ; $url = wp_nonce_url($url, 'WCQDREMOVEMSG'); $url = urldecode($url); $tag = '<a '.$attributes.' href="'.$url.'">'.__($text,'woocommerce-quick-donation').'</a>'; return $tag; } } } ?>