You need custom code to achieve this. There's 2 things to know here:
Updated Status Logic
The logic for driving the New & Updated labels is based on the history
table (which stores the last time a user viewed a node) & the node.changed
column:
$changed = $this->get_value($values, 'changed');
$last_comment = module_exists('comment') && !empty($this->options['comments']) ? $this->get_value($values, 'last_comment') : 0;
if (!$last_read && $changed > NODE_NEW_LIMIT) {
$mark = MARK_NEW;
}
elseif ($changed > $last_read && $changed > NODE_NEW_LIMIT) {
$mark = MARK_UPDATED;
}
elseif ($last_comment > $last_read && $last_comment > NODE_NEW_LIMIT) {
$mark = MARK_UPDATED;
}
return $this->render_link(theme('mark', array('type' => $mark)), $values);
Essentially, it's comparing when a user last viewed a node vs. when a node was last changed.
What isn't known, is what was changed (e.g. the publish status) so to implement some sort of exclusionary logic you're going to have to track the history of publishing/unpublishing to check if the last update was just a change in publish status (node.status
).
Updated Status Display
Assuming you have that logic in place, it's possible to override the output a views field. Here you can extend the views_handler_field_history_user_timestamp
class with your own custom class implementing a render()
method that adds the logic to check whether the last change was only a publish status change. In the final step, you can use hook_views_data_alter
to override the handler for the Has new content field.