Drupal - How to rerun hook_post_update_NAME()
"post_update" hooks that have been run are stored in the database, in the key_value
table, post_update
collection, but the data is serialized and awkward to update directly.
I used some of the details from @kiamlaluno's answer to create a drush script which you can use to reset a single hook. Here's a basic version (longer version is here):
#!/usr/bin/env drush
$key_value = \Drupal::keyValue('post_update');
$update_list = $key_value->get('existing_updates');
$choice = drush_choice($update_list, dt('Which post_update hook do you want to reset?'));
if ($choice) {
$removed_el = $update_list[$choice];
unset($update_list[$choice]);
$key_value->set('existing_updates', $update_list);
drush_print("$removed_el was reset");
} else {
drush_print("Reset was cancelled");
}
And here's an example of what it looks like when you run it from the command line:
./scripts/reset_hook_post_update_NAME.drush
Which post_update hook do you want to reset?
[0] : Cancel
[1] : system_post_update_add_region_to_entity_displays
[2] : system_post_update_hashes_clear_cache
[3] : system_post_update_recalculate_configuration_entity_dependencies
[4] : system_post_update_timestamp_plugins
[5] : my_module_post_update_example_hook
# The script pauses for user input.
5
my_module_post_update_example_hook was reset
Here is an example you can use from the command line with drush php-eval:
drush php-eval -e '$update_hook_name = "<my_hook_post_update_name>";
$key_value = \Drupal::keyValue('post_update');
$existing_updates = $key_value->get('existing_updates');
$index = array_search($update_hook_name,$existing_updates);
unset($existing_updates[$index]);
$key_value->set('existing_updates', $existing_updates);'
When you re-run drush updatedb you will see your post_update_hook waiting to be run.