PluginProbe ʕ •ᴥ•ʔ
Post Affiliate Pro / trunk
Post Affiliate Pro vtrunk
1.29.5 1.29.4 1.29.3 1.29.0 1.29.1 1.29.2 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.5.0 1.5.1 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.6.0 1.6.1 1.6.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 trunk 1.0.1 1.0.10 1.0.11 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.10.1 1.10.2 1.10.3 1.10.4 1.11.1 1.11.2 1.12.1 1.12.2 1.12.3 1.12.4 1.12.5 1.13.0 1.13.1 1.13.2 1.13.3 1.13.4 1.13.5 1.13.6 1.14.0 1.14.1 1.14.2 1.15.0 1.15.1 1.15.2 1.15.3 1.15.4 1.15.5 1.16.0 1.16.1 1.16.2 1.16.3 1.16.4 1.16.5 1.17.0 1.18.0 1.18.1 1.18.2 1.18.3 1.18.4 1.19.0 1.19.1 1.19.10 1.19.11 1.19.12 1.19.13 1.19.14 1.19.15 1.19.16 1.19.17 1.19.2 1.19.3 1.19.4 1.19.5 1.19.6 1.19.7 1.19.8 1.19.9 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.28 1.2.3 1.2.31 1.2.32 1.2.33 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.20.0 1.20.1 1.21.0 1.21.1 1.21.2 1.21.3 1.21.4 1.21.5 1.21.6 1.21.7 1.22.0 1.22.1 1.22.2 1.23.0 1.23.1 1.23.2 1.23.3 1.23.4 1.23.5 1.23.6 1.23.7 1.23.8 1.24.1 1.24.2 1.24.3 1.24.4 1.24.5 1.24.6 1.24.7 1.24.8 1.24.9 1.25.0 1.26.0 1.26.1 1.26.10 1.26.11 1.26.2 1.26.3 1.26.4 1.26.5 1.26.6 1.26.7 1.26.8 1.26.9 1.27.0 1.27.1 1.27.10 1.27.11 1.27.12 1.27.13 1.27.14 1.27.15 1.27.2 1.27.3 1.27.5 1.27.6 1.27.7 1.27.8 1.27.9 1.28.0 1.28.1 1.28.2 1.28.3
postaffiliatepro / Widget / src / render.php
postaffiliatepro / Widget / src Last commit date
editor.css 1 month ago index.js 1 month ago render.php 1 month ago style.css 1 month ago
render.php
95 lines
1 <?php
2 defined('ABSPATH') || exit;
3
4 class postaffiliatepro_Widget_TopAffiliates extends postaffiliatepro_Base {
5 private $title = '';
6 private $refresh_minutes = 10;
7 private $order_by = '';
8 private $order_asc = false;
9 private $limit = 5;
10 private $row_template = '{$firstname} {$lastname} ({$userid}): clicks: {$clicksRaw}; sales: {$salesCount}; commissions: {$commissions} [parent: {$parentuserid}]';
11
12 public function __construct($attributes) {
13 $this->title = isset($attributes['title']) ? sanitize_text_field($attributes['title']) : __('Top Affiliates', 'postaffiliatepro');
14 $this->refresh_minutes = isset($attributes['refreshInterval']) ? absint($attributes['refreshInterval']) : $this->refresh_minutes;
15 $this->order_by = isset($attributes['orderBy']) ? sanitize_key($attributes['orderBy']) : postaffiliatepro_Util_TopAffiliatesHelper::COL_SALES_COUNT;
16 $this->order_asc = isset($attributes['orderAsc']) ? (bool) $attributes['orderAsc'] : $this->order_asc;
17 $this->limit = isset($attributes['limit']) ? absint($attributes['limit']) : $this->limit;
18 $this->row_template = isset($attributes['rowTemplate']) ? wp_kses_post($attributes['rowTemplate']): $this->row_template;
19 }
20
21 private function getCacheKey() {
22 return 'pap_top_affiliates_' . md5($this->order_by . $this->order_asc . $this->limit);
23 }
24
25 public function doRender() {
26 $cacheKey = $this->getCacheKey();
27 $affiliates = get_transient($cacheKey);
28
29 if ($affiliates === false) {
30 postaffiliatepro_Base::_log('No affiliates cached for widget, loading');
31 if (!class_exists('postaffiliatepro_Util_TopAffiliatesHelper')) {
32 return;
33 }
34 $helper = new postaffiliatepro_Util_TopAffiliatesHelper();
35 $affiliates = $helper->getTopAffiliatesList($this->order_by, $this->order_asc, $this->limit);
36
37 if (empty($affiliates)) {
38 return;
39 }
40
41 set_transient($cacheKey, $affiliates, $this->refresh_minutes * MINUTE_IN_SECONDS);
42 }
43
44 $variables = array(
45 'firstname',
46 'lastname',
47 'userid',
48 'parentuserid',
49 postaffiliatepro_Util_TopAffiliatesHelper::COL_RAW_CLICKS,
50 postaffiliatepro_Util_TopAffiliatesHelper::COL_SALES_COUNT,
51 postaffiliatepro_Util_TopAffiliatesHelper::COL_COMMISSIONS
52 );
53 for ($i = 1; $i <= 25; $i++) {
54 $variables[] = "data$i";
55 }
56
57 $wrapperAttributes = get_block_wrapper_attributes(array('class' => 'wp-block-postaffiliatepro-top-affiliates'));
58 $result = "<div $wrapperAttributes>\n";
59 $result .= '<h2 class="wp-block-postaffiliatepro-top-affiliates__title">'.esc_html($this->title)."</h2>\n";
60 $result .= '<ol class="wp-block-postaffiliatepro-top-affiliates__list">';
61 foreach ($affiliates as $row) {
62 $result .= '<li class="wp-block-postaffiliatepro-top-affiliates__item">'
63 .$this->fillRowTemplate($row, $this->row_template, $variables)."</li>\n";
64 }
65 $result .= '</ol></div>';
66 echo $result;
67 }
68
69 /**
70 * Fill template variables for a single affiliate row.
71 *
72 * @param object $row Row object exposing a ->get( $key ) method.
73 */
74 private function fillRowTemplate($row, string $template, array $variables): string {
75 foreach ($variables as $variable) {
76 $value = htmlspecialchars((string) $row->get($variable), ENT_QUOTES, 'UTF-8');
77 if ($variable === postaffiliatepro_Util_TopAffiliatesHelper::COL_COMMISSIONS) {
78 $value = number_format((float) $value, 2);
79 }
80 $template = preg_replace('/\{\$' . preg_quote($variable, '/') . '\}/i', $value, $template);
81 }
82 // Backward-compatibility alias: {$clicksAll} → COL_RAW_CLICKS value.
83 $template = str_replace(
84 '{$clicksAll}',
85 htmlspecialchars((string) $row->get(postaffiliatepro_Util_TopAffiliatesHelper::COL_RAW_CLICKS), ENT_QUOTES, 'UTF-8'),
86 $template
87 );
88 return $template;
89 }
90 }
91
92 if (isset($attributes)) {
93 $papWidgetTopAffiliates = new postaffiliatepro_Widget_TopAffiliates($attributes);
94 $papWidgetTopAffiliates->doRender();
95 }