MailPoet adds a link to the WooCommerce task list pointing to its own welcome wizard. We want to track users that arrive to the MP wizard from WooCommerce but at this point tracking is not enabled. So we store the information in a setting, and send the tracking event to Mixpanel, if it is enabled, after the user completes the wizard. [MAILPOET-4814]
345 lines
8.7 KiB
PHP
345 lines
8.7 KiB
PHP
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
|
|
|
|
namespace MailPoet\Twig;
|
|
|
|
use MailPoet\Referrals\UrlDecorator;
|
|
use MailPoet\Settings\SettingsController;
|
|
use MailPoet\Util\FreeDomains;
|
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
|
use MailPoet\WP\Functions as WPFunctions;
|
|
use MailPoetVendor\Carbon\Carbon;
|
|
use MailPoetVendor\Twig\Extension\AbstractExtension;
|
|
use MailPoetVendor\Twig\TwigFunction;
|
|
|
|
class Functions extends AbstractExtension {
|
|
|
|
/** @var SettingsController */
|
|
private $settings = null;
|
|
|
|
/** @var WooCommerceHelper */
|
|
private $woocommerceHelper = null;
|
|
|
|
/** @var WPFunctions */
|
|
private $wp = null;
|
|
|
|
/** @var UrlDecorator */
|
|
private $referralUrlDecorator = null;
|
|
|
|
private function getWooCommerceHelper(): WooCommerceHelper {
|
|
if ($this->woocommerceHelper === null) {
|
|
$this->woocommerceHelper = new WooCommerceHelper($this->getWp());
|
|
}
|
|
return $this->woocommerceHelper;
|
|
}
|
|
|
|
private function getreferralUrlDecorator(): UrlDecorator {
|
|
if ($this->referralUrlDecorator === null) {
|
|
$this->referralUrlDecorator = new UrlDecorator($this->getWp(), $this->getSettings());
|
|
}
|
|
return $this->referralUrlDecorator;
|
|
}
|
|
|
|
private function getSettings(): SettingsController {
|
|
if ($this->settings === null) {
|
|
$this->settings = SettingsController::getInstance();
|
|
}
|
|
return $this->settings;
|
|
}
|
|
|
|
private function getWp(): WPFunctions {
|
|
if ($this->wp === null) {
|
|
$this->wp = WPFunctions::get();
|
|
}
|
|
return $this->wp;
|
|
}
|
|
|
|
public function getFunctions() {
|
|
return [
|
|
new TwigFunction(
|
|
'json_encode',
|
|
'json_encode',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'json_decode',
|
|
'json_decode',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_nonce_field',
|
|
'wp_nonce_field',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'params',
|
|
[$this, 'params'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'admin_url',
|
|
'admin_url',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'get_option',
|
|
'get_option',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'sending_frequency',
|
|
[$this, 'getSendingFrequency'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_date_format',
|
|
[$this, 'getWPDateFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_version',
|
|
[$this, 'getMailPoetVersion'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_premium_version',
|
|
[$this, 'getMailPoetPremiumVersion'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_date_format',
|
|
[$this, 'getWPDateFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_time_format',
|
|
[$this, 'getWPTimeFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_datetime_format',
|
|
[$this, 'getWPDateTimeFormat'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'do_action',
|
|
'do_action',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_rtl',
|
|
[$this, 'isRtl'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'number_format_i18n',
|
|
'number_format_i18n',
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_locale',
|
|
[$this, 'getTwoLettersLocale'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'mailpoet_free_domains',
|
|
[$this, 'getFreeDomains'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_woocommerce_active',
|
|
[$this, 'isWoocommerceActive'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'get_woocommerce_version',
|
|
[$this, 'getWooCommerceVersion'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'wp_start_of_week',
|
|
[$this, 'getWPStartOfWeek'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'stats_color',
|
|
[$this, 'statsColor'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'clicked_stats_text',
|
|
[$this, 'clickedStatsText'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'stats_number_format_i18n',
|
|
[$this, 'statsNumberFormatI18n'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'add_referral_id',
|
|
[$this, 'addReferralId'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_loading_3rd_party_enabled',
|
|
[$this, 'libs3rdPartyEnabled'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
new TwigFunction(
|
|
'is_dotcom_ecommerce_plan',
|
|
[$this, 'isDotcomEcommercePlan'],
|
|
['is_safe' => ['all']]
|
|
),
|
|
];
|
|
}
|
|
|
|
public function getSendingFrequency() {
|
|
$args = func_get_args();
|
|
$value = (int)array_shift($args);
|
|
|
|
$label = null;
|
|
$labels = [
|
|
'minute' => __('every minute', 'mailpoet'),
|
|
// translators: %1$d is the amount of minutes.
|
|
'minutes' => __('every %1$d minutes', 'mailpoet'),
|
|
'hour' => __('every hour', 'mailpoet'),
|
|
// translators: %1$d is the amount of hours.
|
|
'hours' => __('every %1$d hours', 'mailpoet'),
|
|
];
|
|
|
|
if ($value >= 60) {
|
|
// we're dealing with hours
|
|
if ($value === 60) {
|
|
$label = $labels['hour'];
|
|
} else {
|
|
$label = $labels['hours'];
|
|
}
|
|
$value /= 60;
|
|
} else {
|
|
// we're dealing with minutes
|
|
if ($value === 1) {
|
|
$label = $labels['minute'];
|
|
} else {
|
|
$label = $labels['minutes'];
|
|
}
|
|
}
|
|
|
|
return sprintf($label, $value);
|
|
}
|
|
|
|
public function getWPDateFormat() {
|
|
return $this->getWp()->getOption('date_format') ?: 'F j, Y';
|
|
}
|
|
|
|
public function getWPStartOfWeek() {
|
|
return $this->getWp()->getOption('start_of_week') ?: 0;
|
|
}
|
|
|
|
public function getMailPoetVersion() {
|
|
return MAILPOET_VERSION;
|
|
}
|
|
|
|
public function getMailPoetPremiumVersion() {
|
|
return (defined('MAILPOET_PREMIUM_VERSION')) ? MAILPOET_PREMIUM_VERSION : false;
|
|
}
|
|
|
|
public function getWPTimeFormat() {
|
|
return $this->getWp()->getOption('time_format') ?: 'g:i a';
|
|
}
|
|
|
|
public function getWPDateTimeFormat() {
|
|
return sprintf('%s %s', $this->getWPDateFormat(), $this->getWPTimeFormat());
|
|
}
|
|
|
|
public function params($key = null) {
|
|
$args = $this->getWp()->stripslashesDeep($_GET);
|
|
if (array_key_exists($key, $args)) {
|
|
return $args[$key];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function installedInLastTwoWeeks() {
|
|
$maxNumberOfWeeks = 2;
|
|
$installedAt = Carbon::createFromFormat('Y-m-d H:i:s', $this->getSettings()->get('installed_at'));
|
|
if ($installedAt === false) {
|
|
return false;
|
|
}
|
|
return $installedAt->diffInWeeks(Carbon::now()) < $maxNumberOfWeeks;
|
|
}
|
|
|
|
public function isRtl() {
|
|
return $this->getWp()->isRtl();
|
|
}
|
|
|
|
public function getTwoLettersLocale() {
|
|
return explode('_', $this->getWp()->getLocale())[0];
|
|
}
|
|
|
|
public function getFreeDomains() {
|
|
return FreeDomains::FREE_DOMAINS;
|
|
}
|
|
|
|
public function isWoocommerceActive() {
|
|
return $this->getWooCommerceHelper()->isWooCommerceActive();
|
|
}
|
|
|
|
public function getWooCommerceVersion() {
|
|
return $this->getWooCommerceHelper()->getWooCommerceVersion();
|
|
}
|
|
|
|
public function statsColor($percentage) {
|
|
if ($percentage > 3) {
|
|
return '#7ed321';
|
|
} elseif ($percentage > 1) {
|
|
return '#ff9f00';
|
|
} else {
|
|
return '#f559c3';
|
|
}
|
|
}
|
|
|
|
public function clickedStatsText($clicked) {
|
|
if ($clicked > 3) {
|
|
return __('Excellent', 'mailpoet');
|
|
} elseif ($clicked > 1) {
|
|
return __('Good', 'mailpoet');
|
|
} else {
|
|
return __('Average', 'mailpoet');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Wrapper around number_format_i18n() to return two decimals digits if the number
|
|
* is smaller than 0.1 and one decimal digit if the number is equal or greater
|
|
* than 0.1.
|
|
*
|
|
* @param int|float $number
|
|
*
|
|
* @return string
|
|
*/
|
|
public function statsNumberFormatI18n($number) {
|
|
if ($number < 0.1) {
|
|
$decimals = 2;
|
|
} else {
|
|
$decimals = 1;
|
|
}
|
|
|
|
return number_format_i18n($number, $decimals);
|
|
}
|
|
|
|
public function addReferralId($url) {
|
|
return $this->getreferralUrlDecorator()->decorate($url);
|
|
}
|
|
|
|
public function libs3rdPartyEnabled(): bool {
|
|
return $this->getSettings()->get('3rd_party_libs.enabled') === '1';
|
|
}
|
|
|
|
public function isDotcomEcommercePlan(): bool {
|
|
if (function_exists('wc_calypso_bridge_is_ecommerce_plan')) {
|
|
return wc_calypso_bridge_is_ecommerce_plan();
|
|
}
|
|
return false;
|
|
}
|
|
}
|