Skip to content
Snippets Groups Projects
Select Git revision
  • 2f081692bef70dae62affad84c9a299d50d3a676
  • master default protected
  • fix/body-raw
  • devel
  • 1.0.5
  • 1.0.4
  • 1.0.3
  • 1.0.2
  • 1.0.1
  • 1.0
10 results

composer.json

Blame
  • This project manages its dependencies using Composer. Learn more
    RatingPetitionNotice.php 5.41 KiB
    <?php
    /**
     * Repository rating.
     *
     * @package Flexible Shipping Fedex
     */
    
    namespace WPDesk\RepositoryRating;
    
    use WPDesk\PluginBuilder\Plugin\Hookable;
    
    /**
     * Can display rating notices based on watcher time time.
     */
    class RatingPetitionNotice implements Hookable {
    
    	const CLOSE_TEMPORARY_NOTICE = 'close-temporary-notice';
    
    	const NOTICES_OFFSET = 1209600; // Two weeks in seconds.
    
    	/**
    	 * First notice start time.
    	 *
    	 * @var string
    	 */
    	private $first_notice_start_time;
    
    	/**
    	 * Second notice start time.
    	 *
    	 * @var string
    	 */
    	private $second_notice_start_time;
    
    	/**
    	 * Unique namespace for id/option generation
    	 *
    	 * @var string
    	 */
    	private $namespace;
    
    	/**
    	 * Plugin name in notice content.
    	 *
    	 * @var string
    	 */
    	private $plugin_name;
    
    	/**
    	 * RatingPetitionNotice constructor.
    	 *
    	 * @param TimeWatcher $method_watcher Watcher to decide when should first notice be displayed.
    	 * @param string      $namespace Unique namespace for id/option generation.
    	 * @param string      $plugin_name Plugin name in notice content.
    	 */
    	public function __construct( TimeWatcher $method_watcher, $namespace, $plugin_name ) {
    		$this->namespace   = $namespace;
    		$this->plugin_name = $plugin_name;
    
    		$this->second_notice_start_time = get_option( $this->prepare_notice_start_time_option_name(), '' );
    		$this->first_notice_start_time  = '';
    
    		if ( '' === $this->second_notice_start_time && '' !== $method_watcher->get_creation_time() ) {
    			$this->first_notice_start_time = gmdate( 'Y-m-d H:i:s', strtotime( $method_watcher->get_creation_time() ) + self::NOTICES_OFFSET );
    		}
    	}
    
    	/**
    	 * Return option name for second notice timer.
    	 *
    	 * @return string
    	 */
    	private function prepare_notice_start_time_option_name() {
    		return $this->namespace . '_second_notice_time';
    	}
    
    	/**
    	 * Init hooks (actions and filters).
    	 */
    	public function hooks() {
    		add_action( 'admin_notices', array( $this, 'maybe_show_first_notice' ) );
    		add_action( 'admin_notices', array( $this, 'maybe_show_second_notice' ) );
    		add_action(
    			'wpdesk_notice_dismissed_notice',
    			array( $this, 'maybe_start_second_notice_on_dismiss_first_notice' ),
    			10,
    			2
    		);
    	}
    
    	/**
    	 * Maybe reset counter.
    	 *
    	 * @param string $notice_name .
    	 * @param string $source .
    	 */
    	public function maybe_start_second_notice_on_dismiss_first_notice( $notice_name, $source = null ) {
    		if ( $this->prepare_notice_name( 1 ) === $notice_name && ( empty( $source ) || self::CLOSE_TEMPORARY_NOTICE === $source ) ) {
    			update_option( $this->prepare_notice_start_time_option_name(), gmdate( 'Y-m-d H:i:s', intval( current_time( 'timestamp' ) ) + self::NOTICES_OFFSET ) );
    		}
    	}
    
    	/**
    	 * Returns notice name for Notice class.
    	 *
    	 * @param int $notice_number Notice number as there are two notices.
    	 *
    	 * @return string
    	 */
    	private function prepare_notice_name( $notice_number ) {
    		return $this->namespace . '_rating_' . $notice_number;
    	}
    
    	/**
    	 * Maybe show first notice.
    	 */
    	public function maybe_show_first_notice() {
    		if ( $this->should_display_notice() ) {
    			if ( '' !== $this->first_notice_start_time && current_time( 'mysql' ) > $this->first_notice_start_time ) {
    				$this->show_notice( $this->prepare_notice_name( 1 ) );
    			}
    		}
    	}
    
    	/**
    	 * Should display notice.
    	 *
    	 * @return bool
    	 */
    	private function should_display_notice() {
    		$current_screen     = get_current_screen();
    		$display_on_screens = [ 'shop_order', 'edit-shop_order', 'woocommerce_page_wc-settings' ];
    		if ( ! empty( $current_screen ) && in_array( $current_screen->id, $display_on_screens, true ) ) {
    			return true;
    		}
    
    		return false;
    	}
    
    	/**
    	 * Show notice.
    	 *
    	 * @param string $notice_name .
    	 */
    	private function show_notice( $notice_name ) {
    		new \WPDesk\Notice\PermanentDismissibleNotice(
    			$this->get_notice_content(),
    			$notice_name,
    			\WPDesk\Notice\Notice::NOTICE_TYPE_INFO
    		);
    	}
    
    	/**
    	 * Get notice content.
    	 *
    	 * @return string
    	 */
    	private function get_notice_content() {
    		// Translators: plugin name.
    		$content  = sprintf( __( 'Awesome, you\'ve been using %s for more than 2 weeks. Could you please do me a BIG favor and give it a 5-star rating on WordPress? ~ Peter', 'wpdesk-rating-petition' ), $this->plugin_name );
    		$content .= '<br/>';
    		$content .= implode( ' | ', $this->action_links() );
    
    		return $content;
    	}
    
    	/**
    	 * Action links
    	 *
    	 * @return array
    	 */
    	protected function action_links() {
    		$actions[] = sprintf( // phpcs:ignore
    			// Translators: link.
    			__( '%1$sOk, you deserved it%2$s', 'wpdesk-rating-petition' ),
    			'<a class="fs-response-deserved" target="_blank" href="' . esc_url( 'https://wordpress.org/plugins/wpdesk-rating-petition/#reviews' ) . '">',
    			'</a>'
    		);
    		$actions[] = sprintf(
    			// Translators: link.
    			__( '%1$sNope, maybe later%2$s', 'wpdesk-rating-petition' ),
    			'<a class="fs-response-close-temporary-notice notice-dismiss-link" data-source="' . self::CLOSE_TEMPORARY_NOTICE . '" href="#">',
    			'</a>'
    		);
    		$actions[] = sprintf(
    			// Translators: link.
    			__( '%1$sI already did%2$s', 'wpdesk-rating-petition' ),
    			'<a class="fs-response-already-did notice-dismiss-link" data-source="already-did" href="#">',
    			'</a>'
    		);
    
    		return $actions;
    	}
    
    	/**
    	 * Maybe show second notice.
    	 */
    	public function maybe_show_second_notice() {
    		if ( $this->should_display_notice() ) {
    			if ( ( '' !== $this->second_notice_start_time ) && ( current_time( 'mysql' ) > $this->second_notice_start_time ) ) {
    				$this->show_notice( $this->prepare_notice_name( 2 ) );
    			}
    		}
    	}
    }