| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <?php
- /**
- * File for our cool review ask in the header
- *
- * @category Child Plugin
- * @version v0.1.0
- * @since v0.1.0
- * @author iClyde <kontakt@iclyde.pl>
- */
- // Namespace
- namespace Inisev\Subs;
- // Disallow direct access
- if (defined('ABSPATH')) {
- /**
- * Main class for handling the Review
- */
- if (!class_exists('Inisev\Subs\Inisev_Review')) {
- class Inisev_Review {
- /**
- * Local variables
- */
- private $root; // __ROOT__ of plugin's root
- private $file; // __FILE__ of plugin's root
- private $slug; // Plugin's slug
- private $name; // Name displayed in banner
- private $days; // Days displayed in banner
- private $minutes; // Minutes displayed in banner
- private $debug = false; // If true it will display minutes
- private $minimum_time = (30 * 24 * 60 * 60); // Minimum time required to display (in seconds)
- // private $minimum_time = (3 * 60); // Minimum time required to display (in seconds)
- private $remind_time = '+14 days'; // Time when banner will be reminded
- private $time_between = '+2 days'; // Time when new banner can be displayed
- /**
- * Local URLs
- */
- private $root_url; // Root URL for plugin's dir
- private $assets_url; // Root URL for review assets
- private $review_url; // Review URL
- private $plugin_menu_url; // Plugin's settings menu
- /**
- * __construct:
- * Compile some variables for "future use"
- * Such as slug of current plugin, root dir of plugin
- *
- * @param string $root_file __FILE__ of plugin's main file
- * @param string $root_dir __DIR__ of plugin's main file
- * @param string $individual_slug Individual slug - mostly plugin's slug
- * @param string $display_name The name that will be displayed in the banner
- * @param string $review_url The URL that will be served as review one
- * @param string $plugin_menu_url Plugin menu slug example.com/wp-admin/admin.php?page=<this slug here>
- * @return Inisev_Review The review object
- */
- function __construct($root_file, $root_dir, $individual_slug, $display_name, $review_url, $plugin_menu_url) {
- $this->file = $root_file;
- $this->root = $root_dir;
- $this->slug = $individual_slug;
- $this->name = $display_name;
- $this->review_url = $review_url;
- $this->plugin_menu_url = admin_url('admin.php?page=' . $plugin_menu_url);
- $this->root_url = plugin_dir_url($this->file);
- $this->assets_url = $this->root_url . 'modules/review/assets/';
- $this->option_name = '_irb_h_bn_review';
- $option_name = $this->option_name;
- $empty = ['users' => []];
- $empty[$individual_slug] = time();
- $data = get_option($option_name, false);
- if ($data != false && isset($data) && is_array($data)) {
- if (!array_key_exists($individual_slug, $data)) {
- $data[$individual_slug] = time();
- update_option($option_name, $data);
- }
- $this->using_since = $data;
- } else {
- if ($individual_slug == 'copy-delete-posts' && get_option('_cdp_review', false) != false) {
- if (isset(get_option('_cdp_review', false)['installed'])) {
- $empty[$individual_slug] = get_option('_cdp_review', false)['installed'];
- }
- }
- update_option($option_name, $empty);
- $this->using_since = $empty;
- }
- // Add handler for Ajax request
- if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
- // Check if slug is defined
- if (isset($_POST['slug']) && !empty($_POST['slug'])) {
- // Handle the request
- add_action('wp_ajax_inisev_review', [&$this, 'handle_review_action']);
- }
- // Stop for POST
- return;
- }
- add_action('wp_loaded', [&$this, 'init_review']);
- }
- /**
- * __asset - Loads assets
- *
- * @param string $file path relative
- * @return string file URL
- */
- private function __asset($file) {
- return $this->assets_url . $file;
- }
- /**
- * __dir_asset - Loads assets
- *
- * @param string $file path relative
- * @return string absolute path
- */
- private function __dir_asset($file) {
- return __DIR__ . '/assets' . '/' . $file;
- }
- /**
- * _asset - Loads assets and automatically echo
- *
- * @param string $file path relative
- * @echo string file URL
- */
- private function _asset($file) {
- echo $this->assets_url . $file;
- }
- /**
- * _dir_asset - Loads assets and automatically echo
- *
- * @param string $file path relative
- * @echo string absolute path
- */
- private function _dir_asset($file) {
- echo __DIR__ . '/assets' . '/' . $file;
- }
- /**
- * can_be_displayed - check if the banner should be displayed
- *
- * @return bool true if banner can be displayed
- */
- private function can_be_displayed() {
- $uid = get_current_user_id();
- if (!defined('IRB_H_CHECK_LOADED') && function_exists('get_current_user_id') && isset($uid) && intval($uid) > 0) {
- $since = intval($this->using_since[$this->slug]);
- $diff = time() - $since;
- if ($diff > $this->minimum_time) {
- $seconds = $diff;
- $minutes = intval($diff / 60);
- $hours = intval($minutes / 60);
- $days = intval($hours / 24);
- $this->days = $days;
- $this->minutes = $minutes;
- $data = $this->using_since;
- if (isset($data['users']) && isset($data['users'][$uid])) {
- if (isset($data['users'][$uid]['delay_between'])) {
- if (time() <= intval($data['users'][$uid]['delay_between'])) {
- return false;
- }
- }
- if (isset($data['users'][$uid][$this->slug])) {
- if (isset($data['users'][$uid][$this->slug]['remind'])) {
- if (time() <= intval($data['users'][$uid][$this->slug]['remind'])) {
- return false;
- }
- }
- if (isset($data['users'][$uid][$this->slug]['dismiss'])) {
- if ($data['users'][$uid][$this->slug]['dismiss'] == true || $data['users'][$uid][$this->slug]['dismiss'] == 'true') {
- return false;
- }
- }
- }
- }
- define('IRB_H_CHECK_LOADED', true);
- return true;
- } else return false;
- } else return false;
- }
- /**
- * add_assets - adds required assests by the banner
- *
- * @return void
- */
- public function add_assets() {
- if (!defined('IRB_H_ASSETS_LOADED')) {
- define('IRB_H_ASSETS_LOADED', true);
- wp_enqueue_script('inisev-review-script', $this->__asset('js/script.js'), [], filemtime($this->__dir_asset('js/script.js')), true);
- wp_enqueue_style('inisev-review-style', $this->__asset('css/style.css'), [], filemtime($this->__dir_asset('css/style.css')));
- }
- }
- /**
- * display_review - loads the HTML and prints it in the header only once
- *
- * @return void
- */
- public function display_review() {
- if (!defined('IRB_H_HTML_LOADED')) {
- define('IRB_H_HTML_LOADED', true);
- include_once __DIR__ . '/views/banner.php';
- }
- }
- /**
- * handle_review_action - Handles all POST actions
- *
- * @param string $_POST['token'] - must be === 'irbh'
- * @param string $_POST['slug'] - the unique slug
- * @param string $_POST['mode'] - the unique action remind/dismiss
- *
- * @return json returns it to browser
- */
- public function handle_review_action() {
- $slug = sanitize_text_field($_POST['slug']);
- $mode = sanitize_text_field($_POST['mode']);
- if (!empty($_POST['slug']) && isset($mode) && in_array($mode, ['dismiss', 'remind'])) {
- $option_name = $this->option_name;
- $data = get_option($option_name, false);
- if ($data != false) {
- $uid = get_current_user_id();
- if (!array_key_exists('users', $data)) $data['users'] = [];
- if (!array_key_exists($uid, $data['users'])) $data['users'][$uid] = [];
- if (!array_key_exists($slug, $data['users'][$uid])) $data['users'][$uid][$slug] = [];
- $data['users'][$uid]['delay_between'] = strtotime($this->time_between);
- if ($mode == 'remind') {
- $data['users'][$uid][$slug]['remind'] = strtotime($this->remind_time);
- }
- if ($mode == 'dismiss') {
- $data['users'][$uid][$slug]['dismiss'] = true;
- }
- update_option($option_name, $data);
- wp_send_json_success();
- } else wp_send_json_error();
- } else wp_send_json_error();
- }
- /**
- * init_review - initialization when the user is authenticated already
- *
- * @return void
- */
- public function init_review() {
- if ($this->can_be_displayed()) {
- add_action('admin_enqueue_scripts', [&$this, 'add_assets']);
- add_action('admin_notices', [&$this, 'display_review']);
- }
- }
- }
- }
- }
|