diff --git a/scheduler.cron.inc b/scheduler.cron.inc
index b7a61d5..6766ead 100644
--- a/scheduler.cron.inc
+++ b/scheduler.cron.inc
@@ -36,6 +36,12 @@ function _scheduler_publish() {
 
   $nodes = Node::loadMultiple($nids);
   foreach ($nodes as $nid => $node) {
+    // The above query and api calls can return nodes of types which are not
+    // enabled for this scheduler action. Do not process these.
+    if (!$node->type->entity->getThirdPartySetting('scheduler', $action . '_enable', FALSE)) {
+      continue;
+    }
+
     // Check that other modules allow the action on this node.
     if (!_scheduler_allow($node, $action)) {
       continue;
@@ -45,8 +51,10 @@ function _scheduler_publish() {
     // @todo For D8 move the 'pre' call to here.
     // See https://www.drupal.org/node/2311273
 
+    // Ensure we have a valid date to avoid cron crash if third-party modules
+    // have altered the node list or node data via the API calls above.
+    $publish_on = !empty($node->publish_on->value) ? $node->publish_on->value : REQUEST_TIME; ### @TODO: Alternatively we could skip this node and continue to next.
     // Update timestamps.
-    $publish_on = $node->publish_on->value;
     $node->set('changed', $publish_on);
     $old_creation_date = $node->getCreatedTime();
     if ($node->type->entity->getThirdPartySetting('scheduler', 'publish_touch', FALSE)) {
@@ -117,6 +125,12 @@ function _scheduler_unpublish() {
 
   $nodes = Node::loadMultiple($nids);
   foreach ($nodes as $nid => $node) {
+    // The above query and api calls can return nodes of types which are not
+    // enabled for this scheduler action. Do not process these.
+    if (!$node->type->entity->getThirdPartySetting('scheduler', $action . '_enable', FALSE)) {
+      continue;
+    }
+
     // Check that other modules allow the action on this node.
     if (!_scheduler_allow($node, $action)) {
       continue;
@@ -136,7 +150,9 @@ function _scheduler_unpublish() {
 
     // Update timestamps.
     $old_change_date = $node->getChangedTime();
-    $unpublish_on = $node->unpublish_on->value;
+    // Ensure we have a valid date to avoid cron crash if third-party modules
+    // have altered the node list or node data via the API calls above.
+    $unpublish_on = !empty($node->unpublish_on->value) ? $node->unpublish_on->value : REQUEST_TIME; ### @TODO: Alternatively we could skip this node and continue to next.
     $node->set('changed', $unpublish_on);
 
     $create_unpublishing_revision = $node->type->entity->getThirdPartySetting('scheduler', 'unpublish_revision', FALSE);
