Drupal 7: How to disable a content type
While developing a site with Drupal, at times I'd like to disable a content type without removing it. I just want to disable one.
The database table where content types are stored is node_type
. And there's a column disabled
in it. We can disabled a content type by changing the column value to 1.
There are APIs for that. We can use node_type_load()
and node_type_save()
to do it.
<?php
// Disable a content type named 'article'.
$name = 'article';
$type_info = node_type_load($name);
$type_info->disabled = 1;
node_type_save($type_info);
We can disable a content type easily but re-enabling them is a little tricky. We cannot use node_type_load()
for disabled content types and should use db_select()
directly.
Here's a sample module only to disable a content type.
<?php
/**
* @file
* A module which disable the default Article content.
*/
/**
* Implements hook_install().
*/
function default_disabler_install() {
// Disable the article content type.
_default_disabler_disable_node_type('article');
}
/**
* Implements hook_install().
*/
function default_disabler_uninstall() {
// Re-enable the article content type.
_default_disabler_enable_node_type('article');
}
/**
* Disable a content type.
*
* @param string $name
* Content type name (machine name).
*/
function _default_disabler_disable_node_type($name) {
$type_info = node_type_load($name);
if ($type_info) {
$type_info->disabled = 1;
node_type_save($type_info);
watchdog('default_disabler', 'Node type @name is disabled.', [
'@name' => $name,
], WATCHDOG_WARNING);
}
else {
watchdog('default_disabler', 'Node type @name is not found and couldn\'t be disabled.', [
'@name' => $name,
], WATCHDOG_WARNING);
}
}
/**
* Re-enable a disabled content type.
*
* @param string $name
* Content type name (machine name).
*/
function _default_disabler_enable_node_type($name) {
// Since node_type_load() cannot be used for disabled content types,
// a low-level function db_select() is used here.
// Re-enable a content type if it's disabled.
$query = db_select('node_type', 'nt')
->fields('nt', array('disabled'))
->condition('type', $name);
$disabled = $query->execute()->fetchAssoc();
if (!empty($disabled['disabled'])) {
$query = db_update('node_type')
->fields(array('disabled' => 0))
->condition('type', $name);
$result = $query->execute();
if ($result) {
watchdog('default_disabler', 'Node type @name is enabled.', [
'@name' => $name,
], WATCHDOG_WARNING);
}
}
else {
watchdog('default_disabler', 'Node type @name is not found and couldn\'t be enabled.', [
'@name' => $name,
], WATCHDOG_WARNING);
}
}