过期角色的规则调度程序和发送提醒电子邮件同时触发
Rules scheduler for expire role and sending reminder email fire all at the same time
我有 3 条规则构成了我的 "membership"。
- 购买产品 X 时分配角色(这个有效!)
- 2 分钟后发送提醒邮件。
- 4 分钟后删除角色。
请注意,2 分钟和 4 分钟仅用于测试目的,它们将变成 350 天和 365 天。
虽然 2. 或 3. 都有效,但我有两个问题:
规则 n2 和 n3 同时触发,因此在 2 分钟标记处不仅发送了电子邮件,而且删除了角色。
假设用户 MARK 购买了产品 X,一分钟后,JOE 也购买了产品 X。 MARK 购买了产品 X 2 分钟后,MARK 收到提醒邮件,他的角色被移除 但也 JOE 收到提醒邮件,他的角色被删除。
好像什么事情一触发,都触发。
正如您从导出中看到的那样,我在完成商业订单的 x 分钟后制定了一个规则触发器,另一个从分配的角色中触发,我认为与 2 个不同的事件有关,我会解决这个问题。没用。
这是我的规则的导出:
规则"Send a reminder"组件:
{ "rules_sends_email_to_pipps_reminder_1_week_prior_expiry" : {
"LABEL" : "Sends Email to PIPPS Reminder 1 week prior expiry",
"PLUGIN" : "rule set",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "user_argument" : { "label" : "User {argument}", "type" : "user" } },
"RULES" : [
{ "RULE" : {
"DO" : [
{ "mail" : {
"to" : "[commerce-order:mail]",
"subject" : "Heads up!",
"message" : "Yo! Heads up!",
"from" : "pipps@siteemail.com",
"language" : [ "site:current-cart-order:state" ]
}
}
],
"LABEL" : "Send email reminder to PIPPS"
}
}
]
}
}
规则"Send a reminder"触发器:
{ "rules_send_reminder_email_to_pipps_role_trigger_rule_" : {
"LABEL" : "Send reminder email to PIPPS Role {trigger rule}",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "commerce_order", "rules", "rules_scheduler", "commerce_checkout" ],
"ON" : { "commerce_checkout_complete" : [] },
"IF" : [
{ "commerce_order_contains_product" : {
"commerce_order" : [ "commerce_order" ],
"product_id" : "PIPPS",
"operator" : "=",
"value" : "1"
}
}
],
"DO" : [
{ "schedule" : {
"component" : "rules_sends_email_to_pipps_reminder_1_week_prior_expiry",
"date" : {
"select" : "site:current-cart-order:created",
"date_offset" : { "value" : 120 }
},
"identifier" : "Reminder email to [account:uid]",
"param_user_argument" : [ "commerce-order:owner" ]
}
}
]
}
}
规则"Role Expire"组件:
{ "rules_expire_pipps_role_rule_set_" : {
"LABEL" : "Expire PIPPS Role {rule_set}",
"PLUGIN" : "rule set",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "user_argument" : { "label" : "User {argument}", "type" : "user" } },
"RULES" : [
{ "RULE" : {
"DO" : [
{ "user_remove_role" : {
"account" : [ "user_argument" ],
"roles" : { "value" : { "13" : "13" } }
}
}
],
"LABEL" : "Expire action {rule}"
}
}
]
}
}
规则"Expire Role"触发器:
{ "rules_remove_pipps_role_trigger_rule_" : {
"LABEL" : "Remove PIPPS Role {trigger rule}",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules", "rules_scheduler" ],
"ON" : { "user_update" : [] },
"IF" : [
{ "user_has_role" : { "account" : [ "account" ], "roles" : { "value" : { "13" : "13" } } } }
],
"DO" : [
{ "schedule" : {
"component" : "rules_expire_pipps_role_rule_set_",
"date" : {
"select" : "site:current-cart-order:created",
"date_offset" : { "value" : 240 }
},
"identifier" : "Remove User role [account:uid]",
"param_user_argument" : [ "account" ]
}
}
]
}
}
非常感谢任何建议!谢谢
您的规则(和规则组件)似乎 "work as implemented" ...您 'issue' 似乎是您在测试期间应该更加耐心...继续阅读以了解更多详细信息。 ..
了解正在发生的事情
规则被调度后(使用 Rules Scheduler 子模块),它实际上只会执行 下次 cron 运行.
示例:
- 安排第一个规则组件在
timestamp X1
执行。
- 如果下一次 cron 运行时间是
Y mins after timestamp X1
,那么第一个规则组件的执行只会在那时(= Y mins after timestamp X1
)执行。
- 安排第二个规则组件在
timestamp X2
执行。
- 如果下一次 cron 运行时间是
Y mins after timestamp X2
,那么第二个规则组件的执行只会在那时(= Y mins after timestamp X2
)发生。
根据您的问题场景中的描述,timestamp X2
似乎在 Y mins after timestamp X1
之前发生。这也可以解释为什么两个规则组件实际上同时执行(或多或少)。
补救措施使其如您所愿
假设您的 cron 作业是每小时 运行,那么在 4 分钟 之后对您的规则组件进行直接(次要)修复将是将它们安排在(例如)2 小时 之后。这样您就可以确定两个规则组件实际上并没有在同一个 cron 作业中执行。
我有 3 条规则构成了我的 "membership"。
- 购买产品 X 时分配角色(这个有效!)
- 2 分钟后发送提醒邮件。
- 4 分钟后删除角色。
请注意,2 分钟和 4 分钟仅用于测试目的,它们将变成 350 天和 365 天。
虽然 2. 或 3. 都有效,但我有两个问题:
规则 n2 和 n3 同时触发,因此在 2 分钟标记处不仅发送了电子邮件,而且删除了角色。
假设用户 MARK 购买了产品 X,一分钟后,JOE 也购买了产品 X。 MARK 购买了产品 X 2 分钟后,MARK 收到提醒邮件,他的角色被移除 但也 JOE 收到提醒邮件,他的角色被删除。
好像什么事情一触发,都触发。
正如您从导出中看到的那样,我在完成商业订单的 x 分钟后制定了一个规则触发器,另一个从分配的角色中触发,我认为与 2 个不同的事件有关,我会解决这个问题。没用。
这是我的规则的导出:
规则"Send a reminder"组件:
{ "rules_sends_email_to_pipps_reminder_1_week_prior_expiry" : {
"LABEL" : "Sends Email to PIPPS Reminder 1 week prior expiry",
"PLUGIN" : "rule set",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "user_argument" : { "label" : "User {argument}", "type" : "user" } },
"RULES" : [
{ "RULE" : {
"DO" : [
{ "mail" : {
"to" : "[commerce-order:mail]",
"subject" : "Heads up!",
"message" : "Yo! Heads up!",
"from" : "pipps@siteemail.com",
"language" : [ "site:current-cart-order:state" ]
}
}
],
"LABEL" : "Send email reminder to PIPPS"
}
}
]
} }
规则"Send a reminder"触发器:
{ "rules_send_reminder_email_to_pipps_role_trigger_rule_" : {
"LABEL" : "Send reminder email to PIPPS Role {trigger rule}",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "commerce_order", "rules", "rules_scheduler", "commerce_checkout" ],
"ON" : { "commerce_checkout_complete" : [] },
"IF" : [
{ "commerce_order_contains_product" : {
"commerce_order" : [ "commerce_order" ],
"product_id" : "PIPPS",
"operator" : "=",
"value" : "1"
}
}
],
"DO" : [
{ "schedule" : {
"component" : "rules_sends_email_to_pipps_reminder_1_week_prior_expiry",
"date" : {
"select" : "site:current-cart-order:created",
"date_offset" : { "value" : 120 }
},
"identifier" : "Reminder email to [account:uid]",
"param_user_argument" : [ "commerce-order:owner" ]
}
}
]
} }
规则"Role Expire"组件:
{ "rules_expire_pipps_role_rule_set_" : {
"LABEL" : "Expire PIPPS Role {rule_set}",
"PLUGIN" : "rule set",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "user_argument" : { "label" : "User {argument}", "type" : "user" } },
"RULES" : [
{ "RULE" : {
"DO" : [
{ "user_remove_role" : {
"account" : [ "user_argument" ],
"roles" : { "value" : { "13" : "13" } }
}
}
],
"LABEL" : "Expire action {rule}"
}
}
]
} }
规则"Expire Role"触发器:
{ "rules_remove_pipps_role_trigger_rule_" : {
"LABEL" : "Remove PIPPS Role {trigger rule}",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules", "rules_scheduler" ],
"ON" : { "user_update" : [] },
"IF" : [
{ "user_has_role" : { "account" : [ "account" ], "roles" : { "value" : { "13" : "13" } } } }
],
"DO" : [
{ "schedule" : {
"component" : "rules_expire_pipps_role_rule_set_",
"date" : {
"select" : "site:current-cart-order:created",
"date_offset" : { "value" : 240 }
},
"identifier" : "Remove User role [account:uid]",
"param_user_argument" : [ "account" ]
}
}
]
} }
非常感谢任何建议!谢谢
您的规则(和规则组件)似乎 "work as implemented" ...您 'issue' 似乎是您在测试期间应该更加耐心...继续阅读以了解更多详细信息。 ..
了解正在发生的事情
规则被调度后(使用 Rules Scheduler 子模块),它实际上只会执行 下次 cron 运行.
示例:
- 安排第一个规则组件在
timestamp X1
执行。 - 如果下一次 cron 运行时间是
Y mins after timestamp X1
,那么第一个规则组件的执行只会在那时(=Y mins after timestamp X1
)执行。 - 安排第二个规则组件在
timestamp X2
执行。 - 如果下一次 cron 运行时间是
Y mins after timestamp X2
,那么第二个规则组件的执行只会在那时(=Y mins after timestamp X2
)发生。
根据您的问题场景中的描述,timestamp X2
似乎在 Y mins after timestamp X1
之前发生。这也可以解释为什么两个规则组件实际上同时执行(或多或少)。
补救措施使其如您所愿
假设您的 cron 作业是每小时 运行,那么在 4 分钟 之后对您的规则组件进行直接(次要)修复将是将它们安排在(例如)2 小时 之后。这样您就可以确定两个规则组件实际上并没有在同一个 cron 作业中执行。