1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
<?php // phpcs:ignoreFile
namespace AutomateWoo;
if ( ! defined( 'ABSPATH' ) ) exit;
/** * @class Trigger_Review_Posted */ class Trigger_Review_Posted extends Trigger {
public $supplied_data_items = [ 'review', 'customer', 'product' ];
/** * Async events required by the trigger. * * @since 4.8.0 * @var string|array */ protected $required_async_events = 'review_approved';
function load_admin_details() { $this->title = __( 'New Review Posted', 'automatewoo' ); $this->group = __( 'Reviews', 'automatewoo' ); $this->description = __( 'This trigger does not fire until the review has been approved. If a customer leaves multiple reviews on the same product the workflow will only run once.', 'automatewoo' ); }
function register_hooks() { add_action( 'automatewoo/review/posted_async', [ $this, 'catch_hooks' ] ); }
/** * @param int $review_id */ function catch_hooks( int $review_id ) { $review = new Review( Clean::id( $review_id ) );
if ( ! $review->exists ) { return; }
$this->maybe_run([ 'customer' => Customer_Factory::get_by_review( $review ), 'product' => wc_get_product( $review->get_product_id() ), 'review' => $review ]); }
/** * @param $workflow Workflow * @return bool */ function validate_workflow( $workflow ) { $review = $workflow->data_layer()->get_review();
// Bail if review is not approved (e.g. spam or trash). if ( ! $review || ! $review->is_approved() ) { return false; }
// Run each workflow once for each review, the comment could be approved more than once if ( $workflow->has_run_for_data_item( 'review' ) ) { return false; }
// Run each workflow once per product per customer, the customer could add multiple reviews on the product // NOTE we must use separate has_run_for_data_item() calls for this logic. if ( $workflow->has_run_for_data_item( [ 'product', 'customer' ] ) ) { return false; }
return true; }
}
|