过期角色的规则调度程序和发送提醒电子邮件同时触发

Rules scheduler for expire role and sending reminder email fire all at the same time

我有 3 条规则构成了我的 "membership"。

  1. 购买产品 X 时分配角色(这个有效!)
  2. 2 分钟后发送提醒邮件。
  3. 4 分钟后删除角色。

请注意,2 分钟和 4 分钟仅用于测试目的,它们将变成 350 天和 365 天。

虽然 2. 或 3. 都有效,但我有两个问题:

好像什么事情一触发,都触发。

正如您从导出中看到的那样,我在完成商业订单的 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 作业中执行。