PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/Classes/CampaignClass.php +47 -9 11.0.0 → 11.1.0 View file →
@@ -153,11 +153,12 @@
153 153 }
154 154
155 155 $query .= ' GROUP BY campaign.id';
156 156
157 - if (!empty($settings['ordering']) && !empty($settings['ordering_sort_order'])) {
157 + if (!empty($settings['ordering'])) {
158 158 $table = in_array($settings['ordering'], ['name', 'creation_date']) ? 'mail' : 'campaign';
159 - $query .= ' ORDER BY '.$table.'.'.acym_secureDBColumn($settings['ordering']).' '.acym_secureDBColumn(strtoupper($settings['ordering_sort_order']));
159 + $order = isset($settings['ordering_sort_order']) && strtolower($settings['ordering_sort_order']) === 'asc' ? 'ASC' : 'DESC';
160 + $query .= ' ORDER BY '.$table.'.'.acym_secureDBColumn($settings['ordering']).' '.acym_secureDBColumn($order);
160 161 }
161 162
162 163 if (empty($settings['offset']) || $settings['offset'] < 0) {
163 164 $settings['offset'] = 0;
@@ -254,12 +255,19 @@
254 255 $element->open = 0;
255 256 $element->click = 0;
256 257
257 258 if (!empty($element->subscribers)) {
258 - $element->open = number_format($element->open_unique / $element->subscribers * 100, 2);
259 + // In anonymous mode opens/clicks are counted globally (totals, not unique subscribers), so a percentage of recipients is meaningless: expose the average number of opens/clicks per email sent instead (e.g. 3.25), rendered as "3.25×" in the view
260 + $anonymousStats = !empty($this->config->get('anonymous_stats', 0));
261 + $clicksNb = $urlClickClass->getNumberUsersClicked([$element->mail_id], $isAbTest);
259 262
260 - $clicksNb = $urlClickClass->getNumberUsersClicked([$element->mail_id], $isAbTest);
261 - $element->click = number_format($clicksNb / $element->subscribers * 100, 2);
263 + if ($anonymousStats) {
264 + $element->open = number_format($element->open_unique / $element->subscribers, 2);
265 + $element->click = number_format($clicksNb / $element->subscribers, 2);
266 + } else {
267 + $element->open = number_format($element->open_unique / $element->subscribers * 100, 2);
268 + $element->click = number_format($clicksNb / $element->subscribers * 100, 2);
269 + }
262 270 }
263 271 }
264 272
265 273 public function getTrackingSales(object $element): void
@@ -304,10 +312,18 @@
304 312 $element->subscribers += $mailsStat->sent;
305 313 }
306 314
307 315 if (!empty($element->subscribers)) {
308 - $element->open = number_format($element->open / $element->subscribers * 100, 2);
309 - $element->click = number_format($element->click / $element->subscribers * 100, 2);
316 + // In anonymous mode opens/clicks are counted globally (totals, not unique subscribers), so expose the average number of opens/clicks per email sent (e.g. 3.25) instead of a percentage, rendered as "3.25×" in the view
317 + $anonymousStats = !empty($this->config->get('anonymous_stats', 0));
318 +
319 + if ($anonymousStats) {
320 + $element->open = number_format($element->open / $element->subscribers, 2);
321 + $element->click = number_format($element->click / $element->subscribers, 2);
322 + } else {
323 + $element->open = number_format($element->open / $element->subscribers * 100, 2);
324 + $element->click = number_format($element->click / $element->subscribers * 100, 2);
325 + }
310 326 }
311 327
312 328 //Tracking sales
313 329 if (!acym_isTrackingSalesActive()) {
@@ -335,8 +351,19 @@
335 351
336 352 return empty($campaign) ? null : $this->decode($campaign);
337 353 }
338 354
355 + public function getOneByMailId(int $mailId): ?object
356 + {
357 + $campaign = acym_loadObject(
358 + 'SELECT *
359 + FROM #__acym_campaign
360 + WHERE `mail_id` = '.intval($mailId)
361 + );
362 +
363 + return empty($campaign) ? null : $campaign;
364 + }
365 +
339 366 public function getOneByIdWithMail(int $id): ?object
340 367 {
341 368 $campaign = acym_loadObject(
342 369 'SELECT campaign.*, mail.name, mail.subject, mail.body, mail.from_name, mail.from_email, mail.reply_to_name, mail.reply_to_email, mail.bcc, mail.links_language, mail.tracking, mail.translation, mail.bounce_email
@@ -369,11 +396,22 @@
369 396
370 397 acym_arrayToInteger($listsIds);
371 398 if (empty($listsIds)) return false;
372 399
400 + $listsIds = array_unique($listsIds);
401 +
402 + $existingListsIds = acym_loadResultArray('SELECT `id` FROM #__acym_list WHERE `id` IN ('.implode(',', $listsIds).')');
403 + acym_arrayToInteger($existingListsIds);
404 +
405 + $unknownListsIds = array_diff($listsIds, $existingListsIds);
406 + if (!empty($unknownListsIds)) {
407 + $this->errors[] = acym_translationSprintf('ACYM_LIST_NOT_FOUND', implode(', ', $unknownListsIds));
408 + }
409 +
410 + if (empty($existingListsIds)) return false;
411 +
373 412 $values = [];
374 - $listsIds = array_unique($listsIds);
375 - foreach ($listsIds as $listId) {
413 + foreach ($existingListsIds as $listId) {
376 414 $values[] = '('.intval($mailId).', '.intval($listId).')';
377 415 }
378 416
379 417 if (!empty($values)) {