Drupal 7 - Node Limit Publish Module

This module adds a configurable limit to how many nodes of any content type can be published at any one time. This is useful in circumstances such as when a website has created content types of polls or competitions or quizzes but only one of each type can be live and published at any one time. Of course the module allows limits other than 1 in case there is such a circumstance. The default is 0 which means unlimited. A web author may create content and exceed the limits providing the content remains unpublished. This allows for content to be created in advance of publication.

If a web author attempts to publish some content which would exceed the limit, the content is saved as unpublished.

The admin should go to admin/config/content/node_limit_publish to set the limits for each content type known to the system.


name = Node Limit Publish
description = Limit the number of published nodes per type
core = 7.x
configure = admin/config/content/node_limit_publish


* File         : node_limit_publish.module
* Title        : Limits the number of concurrently published node types dependent upon admin configurable limits
* Sponsor      : Hangar Seven Digital
* Author       : Badzilla <a href="http://www.badzilla.co.uk" title="www.badzilla.co.uk">www.badzilla.co.uk</a> @badzillacouk
* This work is copyright Badzilla under the GPL licence terms and conditions

* Implementation of hook_menu().
function node_limit_publish_menu() {
$items = array();

$items['admin/config/content/node_limit_publish'] = array(
'title' => 'Limit Number of Published Nodes per Node Type',
'description' => t('Zero represents an unlimited amount of published nodes'),
'page callback' => 'drupal_get_form',
'page arguments' => array('node_limit_publish_admin_settings'),
'access arguments' => array('administer node_limit_publish'),

node_limit_publish_admin_settings() {
$form = array();

    if (
is_array($types = node_type_get_types())) {

$form['title'] = array(
'#markup' => t('Zero represents an unlimited amount of published nodes'),

$types as $key => $value)
$form['node_limit_publish_'.$key] = array(
'#type' => 'textfield',
'#description' => $key,
'#size' => 4,
'#maxlength' => 10,
'#element_validate' => array('node_limit_publish_is_numeric'),
'#default_value' => variable_get('node_limit_publish_'.$key, 0),               


node_limit_publish_is_numeric($element, &$form_state, $form) {
    if (!
form_error($element, t('This field must be numeric'));

* Implementation of hook_presave().
function node_limit_publish_node_presave($node) {
// Get the limit on this type
if (($limit = variable_get('node_limit_publish_'.$node->type, 0)) and $node->status == 1) {
// now check whether we have reached our maximum
$query = db_select('node')
condition('type', $node->type)
condition('status', 1);
        if (isset(
$query->condition('nid', $node->nid, '!=');
$count = $query->countQuery()

        if (
$count >= $limit) {
$node->status = 0;
drupal_set_message(t('Sorry, the maximum amount of published content for %type has already been reached.', array('%type' => $node->type)), 'warning');

node_limit_publish_02.tar.gz1.41 KB

badzilla's picture

New Version

The count to see if the number of published nodes of a type had been exceeded needed an extra condition - to exclude itself if it was an update. I have fixed this condition in the latest version.