first commit

This commit is contained in:
2026-03-05 13:07:40 +01:00
commit 64ba0721ee
25709 changed files with 4691006 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
{
"name": "octolize\/wp-octolize-tracker",
"license": "MIT",
"authors": [
{
"name": "Grzegorz",
"email": "grzegorz@octolize.com"
}
],
"require": {
"ext-json": "*",
"php": ">=7.0",
"wpdesk\/wp-wpdesk-tracker": "^3.1",
"wpdesk\/wp-logs": "^1.7",
"wpdesk\/wp-wpdesk-tracker-deactivation": "^1.1"
},
"require-dev": {
"phpunit\/phpunit": "<7",
"wp-coding-standards\/wpcs": "^0.14.1",
"squizlabs\/php_codesniffer": "^3.0.2",
"mockery\/mockery": "*",
"10up\/wp_mock": "*",
"wimg\/php-compatibility": "^8",
"johnpbloch\/wordpress": "^6.0"
},
"autoload": {
"psr-4": {
"DPDVendor\\Octolize\\Tracker\\": "src\/"
}
},
"autoload-dev": {},
"scripts": {
"phpcs": "phpcs",
"phpunit-unit": "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never",
"phpunit-unit-fast": "phpunit --configuration phpunit-unit.xml --no-coverage",
"phpunit-integration": "phpunit --configuration phpunit-integration.xml --coverage-text --colors=never",
"phpunit-integration-fast": "phpunit --configuration phpunit-integration.xml --no-coverage"
},
"config": {
"allow-plugins": {
"johnpbloch\/wordpress-core-installer": false
},
"platform": {
"php": "7.0"
}
},
"extra": {
"text-domain": "wp-octolize-tracker",
"translations-folder": "lang",
"po-files": {
"pl_PL": "pl_PL.po",
"es_ES": "es_ES.po",
"en_AU": "en_AU.po",
"en_CA": "en_CA.po",
"en_GB": "en_GB.po",
"de_DE": "de_DE.po"
}
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
use DPDVendor\WPDesk\Notice\Notice;
use DPDVendor\WPDesk\Notice\PermanentDismissibleNotice;
use DPDVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Can display Opt In notice.
*/
class OptInNotice implements \DPDVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
/**
* @var string
*/
private $plugin_slug;
/**
* @var ShouldDisplay
*/
private $should_display;
/**
* @var string
*/
private $shop_url;
/**
* @param string $plugin_slug
* @param string $shop_url
* @param ShouldDisplay $should_display
*/
public function __construct(string $plugin_slug, string $shop_url, \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay $should_display)
{
$this->plugin_slug = $plugin_slug;
$this->should_display = $should_display;
$this->shop_url = $shop_url;
}
/**
* @return void
*/
public function hooks()
{
\add_action('admin_notices', [$this, 'display_notice_if_should']);
}
/**
* @return void
*/
public function display_notice_if_should()
{
if ($this->should_display->should_display()) {
$this->create_notice();
}
}
/**
* @return PermanentDismissibleNotice
*/
protected function create_notice()
{
$notice_name = 'octolize_opt_in_' . $this->plugin_slug;
new \DPDVendor\WPDesk\Notice\PermanentDismissibleNotice($this->prepare_notice_content(), $notice_name, \DPDVendor\WPDesk\Notice\Notice::NOTICE_TYPE_SUCCESS);
}
/**
* @return string
*/
private function prepare_notice_content()
{
$user = \wp_get_current_user();
$username = $user->first_name ? $user->first_name : $user->user_login;
$terms_url = \sprintf('%1$s/usage-tracking/', \untrailingslashit($this->shop_url));
$plugin_slug = $this->plugin_slug;
\ob_start();
include __DIR__ . '/views/html-notice.php';
return \ob_get_clean();
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display notice.
*/
interface ShouldDisplay
{
/**
* Notice should be displayed?
*
* @return bool
*/
public function should_display();
}

View File

@@ -0,0 +1,17 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display always.
*/
class ShouldDisplayAlways implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @inheritDoc
*/
public function should_display()
{
return \true;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display AND conditions.
*/
class ShouldDisplayAndConditions implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @var ShouldDisplay[]
*/
private $conditions = [];
/**
* @param ShouldDisplay $should_display
*
* @return void
*/
public function add_should_diaplay_condition(\DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay $should_display)
{
$this->conditions[] = $should_display;
}
/**
* @inheritDoc
*/
public function should_display()
{
foreach ($this->conditions as $condition) {
if (!$condition->should_display()) {
return \false;
}
}
return \true;
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display $_GET parameter present.
*/
class ShouldDisplayGetParameterPresent implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @var string
*/
private $parameter;
/**
* @param string $parameter
*/
public function __construct(string $parameter)
{
$this->parameter = $parameter;
}
/**
* @inheritDoc
*/
public function should_display()
{
return isset($_GET[$this->parameter]);
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display $_GET parameter value.
*/
class ShouldDisplayGetParameterValue implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @var string
*/
private $parameter;
/**
* @var string
*/
private $value;
/**
* @param string $parameter
* @param string $value
*/
public function __construct(string $parameter, string $value)
{
$this->parameter = $parameter;
$this->value = $value;
}
/**
* @inheritDoc
*/
public function should_display()
{
return isset($_GET[$this->parameter]) && $_GET[$this->parameter] === $this->value;
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display never.
*/
class ShouldDisplayNever implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @inheritDoc
*/
public function should_display()
{
return \false;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display OR conditions.
*/
class ShouldDisplayOrConditions implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @var ShouldDisplay[]
*/
private $conditions = [];
/**
* @param ShouldDisplay $should_display
*
* @return void
*/
public function add_should_diaplay_condition(\DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay $should_display)
{
$this->conditions[] = $should_display;
}
/**
* @inheritDoc
*/
public function should_display()
{
foreach ($this->conditions as $condition) {
if ($condition->should_display()) {
return \true;
}
}
return \false;
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace DPDVendor\Octolize\Tracker\OptInNotice;
/**
* Should display shipping method settings page.
*/
class ShouldDisplayShippingMethodInstanceSettings implements \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay
{
/**
* @var string
*/
private $shipping_method_id;
/**
* @param string $shipping_method_id
*/
public function __construct(string $shipping_method_id)
{
$this->shipping_method_id = $shipping_method_id;
}
/**
* @inheritDoc
*/
public function should_display()
{
$shipping_method = \WC_Shipping_Zones::get_shipping_method($_GET['instance_id'] ?? 0);
return $shipping_method && $shipping_method instanceof \WC_Shipping_Method && $shipping_method->id === $this->shipping_method_id;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace DPDVendor;
/**
* @var string $username
* @var string $terms_url
* @var string $plugin_slug
*/
?>
<strong><?php
echo \esc_html(\__('Help us improve Octolize plugins\' experience', 'woocommerce-dpd'));
?></strong><br/>
<?php
echo \wp_kses_post(\sprintf(\__('Hi %1$s, with your helping hand we can build effective solutions, launch the new features and shape better plugins experience. By agreeing to anonymously share non-sensitive %2$susage data%3$s of our plugins, you will help us develop them in the right direction. No personal data is tracked or stored and you can opt-out any time. Will you give the thumbs up to our efforts?', 'woocommerce-dpd'), $username, '<a href="' . \esc_url($terms_url) . '" target="_blank">', '</a>'));
?><br/>
</p>
<p>
<button id="wpdesk_tracker_allow_button_notice-<?php
echo \esc_attr($plugin_slug);
?>" class="button button-primary"><?php
\esc_html_e('Allow', 'woocommerce-dpd');
?></button>
<script type="text/javascript">
jQuery(document).on('click', '#wpdesk_tracker_allow_button_notice-<?php
echo \esc_attr($plugin_slug);
?>',function(e){
e.preventDefault();
jQuery.ajax( '<?php
echo \admin_url('admin-ajax.php');
?>',
{
type: 'POST',
data: {
action: 'wpdesk_tracker_notice_handler',
type: 'allow',
}
}
);
jQuery('#wpdesk-notice-octolize_opt_in_<?php
echo \esc_attr($plugin_slug);
?>').toggle( false );
});
</script>
<?php

View File

@@ -0,0 +1,36 @@
<?php
namespace DPDVendor\Octolize\Tracker;
use DPDVendor\WPDesk\PluginBuilder\Plugin\Hookable;
/**
* Can create and register sender in filter.
*/
class SenderRegistrator implements \DPDVendor\WPDesk\PluginBuilder\Plugin\Hookable
{
/**
* @var string
*/
private $plugin_slug;
/**
* @param string $plugin_slug
*/
public function __construct(string $plugin_slug)
{
$this->plugin_slug = $plugin_slug;
}
/**
* @return void
*/
public function hooks()
{
\add_filter('wpdesk/tracker/sender/' . $this->plugin_slug, [$this, 'create_sender']);
}
/**
* @return SenderToOctolize
*/
public function create_sender()
{
return new \DPDVendor\Octolize\Tracker\SenderToOctolize();
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace DPDVendor\Octolize\Tracker;
/**
* Can send tracked data to Octolize.
*/
class SenderToOctolize implements \WPDesk_Tracker_Sender
{
/**
* URL to the WP Desk Tracker API endpoint.
* @var string
*/
private $api_url = 'https://data.octolize.org/?track=1';
private $test_api_url = 'https://testdata.octolize.org/?track=1';
/**
* Sends payload to predefined receiver.
*
* @param array $payload Payload to send.
*
* @return array If succeeded. Array containing 'headers', 'body', 'response', 'cookies', 'filename'.
* @throws \WPDesk_Tracker_Sender_Exception_WpError Error if send failed.
*
*/
public function send_payload(array $payload)
{
\DPDVendor\WPDesk_Logger_Factory::log_message("Target URL: " . $this->get_api_url(), 'octolize-sender', \DPDVendor\WPDesk_Logger::DEBUG);
$response = \wp_remote_post($this->get_api_url(), array('method' => 'POST', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => \false, 'headers' => array('user-agent' => 'OctolizeSender'), 'body' => \json_encode($payload), 'cookies' => array()));
if ($response instanceof \WP_Error) {
throw new \DPDVendor\WPDesk_Tracker_Sender_Exception_WpError('Payload send error', $response);
} else {
return $response;
}
}
/**
* @return string
*/
private function get_api_url()
{
$api_url = $this->api_url;
if (\apply_filters('wpdesk_tracker_use_testdata', \false)) {
$api_url = $this->test_api_url;
}
return $api_url;
}
}

View File

@@ -0,0 +1,126 @@
<?php
namespace DPDVendor\Octolize\Tracker;
use DPDVendor\Octolize\Tracker\OptInNotice\OptInNotice;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayAlways;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayAndConditions;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterPresent;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayOrConditions;
use DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayShippingMethodInstanceSettings;
use DPDVendor\WPDesk\PluginBuilder\Plugin\HookableCollection;
use DPDVendor\WPDesk\PluginBuilder\Plugin\HookableParent;
use DPDVendor\WPDesk\Tracker\Deactivation\TrackerFactory;
use DPDVendor\WPDesk\Tracker\OptInOptOut;
/**
* Can create complete tracker.
*/
class TrackerInitializer implements \DPDVendor\WPDesk\PluginBuilder\Plugin\HookableCollection
{
use HookableParent;
/**
* @var string
*/
private $plugin_file;
/**
* @var string
*/
private $plugin_slug;
/**
* @var string
*/
private $plugin_name;
/**
* @var string
*/
private $shop_url;
/**
* @var ShouldDisplay
*/
private $should_display;
/**
* @param string $plugin_file Plugin file.
* @param string $plugin_slug Plugin slug.
* @param string $plugin_name Plugin name.
* @param string $shop_url Shop URL.
*/
public function __construct(string $plugin_file, string $plugin_slug, string $plugin_name, string $shop_url, \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplay $should_display)
{
$this->plugin_file = $plugin_file;
$this->plugin_slug = $plugin_slug;
$this->plugin_name = $plugin_name;
$this->shop_url = $shop_url;
$this->should_display = $should_display;
}
/**
* Hooks.
*
* @return void
*/
public function hooks()
{
$this->add_hookable(new \DPDVendor\Octolize\Tracker\SenderRegistrator($this->plugin_slug));
$opt_in_opt_out = new \DPDVendor\WPDesk\Tracker\OptInOptOut($this->plugin_file, $this->plugin_slug, $this->shop_url, $this->plugin_name);
$opt_in_opt_out->create_objects();
$this->add_hookable($opt_in_opt_out);
$this->add_hookable(\DPDVendor\WPDesk\Tracker\Deactivation\TrackerFactory::createDefaultTracker($this->plugin_slug, $this->plugin_file, $this->plugin_name));
$tracker_consent = new \DPDVendor\WPDesk_Tracker_Persistence_Consent();
if (!$tracker_consent->is_active()) {
$this->add_hookable(new \DPDVendor\Octolize\Tracker\OptInNotice\OptInNotice($this->plugin_slug, $this->shop_url, $this->should_display));
}
$this->hooks_on_hookable_objects();
\add_action('plugins_loaded', [$this, 'init_tracker']);
}
/**
* Creates Tracker.
* All data will be sent to https://data.octolize.org
*
* @return void
*/
public function init_tracker()
{
$tracker = \apply_filters('wpdesk_tracker_instance', null);
}
/**
* Creates tracker initializer from plugin info.
*
* @param \WPDesk_Plugin_Info $plugin_info .
* @param ShouldDisplay $should_display .
*
* @return TrackerInitializer
*/
public static function create_from_plugin_info(\DPDVendor\WPDesk_Plugin_Info $plugin_info, $should_display)
{
$shops = $plugin_info->get_plugin_shops();
$shop_url = $shops[\get_locale()] ?? $shops['default'] ?? 'https://octolize.com';
return new self($plugin_info->get_plugin_file_name(), $plugin_info->get_plugin_slug(), $plugin_info->get_plugin_name(), $shop_url, $should_display ?? new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayAlways());
}
/**
* Creates tracker initializer from plugin info for shipping method.
*
* @param \WPDesk_Plugin_Info $plugin_info .
* @param string $shipping_method_id .
*
* @return TrackerInitializer
*/
public static function create_from_plugin_info_for_shipping_method(\DPDVendor\WPDesk_Plugin_Info $plugin_info, string $shipping_method_id)
{
$shops = $plugin_info->get_plugin_shops();
$shop_url = $shops[\get_locale()] ?? $shops['default'] ?? 'https://octolize.com';
$should_display = new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayOrConditions();
$should_display_and_conditions = new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayAndConditions();
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue('page', 'wc-settings'));
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue('tab', 'shipping'));
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue('section', $shipping_method_id));
$should_display->add_should_diaplay_condition($should_display_and_conditions);
$should_display_and_conditions = new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayAndConditions();
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue('page', 'wc-settings'));
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterValue('tab', 'shipping'));
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayGetParameterPresent('instance_id'));
$should_display_and_conditions->add_should_diaplay_condition(new \DPDVendor\Octolize\Tracker\OptInNotice\ShouldDisplayShippingMethodInstanceSettings($shipping_method_id));
$should_display->add_should_diaplay_condition($should_display_and_conditions);
return new self($plugin_info->get_plugin_file_name(), $plugin_info->get_plugin_slug(), $plugin_info->get_plugin_name(), $shop_url, $should_display);
}
}