1

I unpublished all the nodes which are created between January 1, 2012 and January 1, 2015. Then, I published 800 nodes.

Now I want to delete all the nodes I first unpublished. I have almost 28,000 nodes. How do I bulk delete them?

I also want to delete the images uploaded along with the nodes.

0

2 Answers 2

1

I suggest to use the Rules module for that. Bulk deletion is explained in one of the first tutorial video's in this series: https://drupalize.me/videos/introduction-rules?p=1157

What you should do:

  1. enable Rules and Rules UI
  2. create a new Component of type "action set"
  3. actions to add: a loop thru the nodes and if the date matches, the node should be deleted

The Views Rules module might be usefull to use views to send the nid's of the nodes to delete to the rules component. I learned a lot about this via the accepted answer to "How to pass arguments to a view from Rules?".

An alternative could be the Views bulk operations (VBO) module, which has a "bulk deletion" out of the box. You add a VBO-field in your view and select the "delete" as the action. Maybe this is even better than the Rules (in the way that it will take less time to understand and implement).

2
  • I created a dummy text variable to send to the Component, then when I click the "execute-link" in the Components-list, some character has to be entered in this field, and the actions can get executed by clicking the button "execute".
    – sigridt
    Commented Aug 28, 2017 at 8:57
  • I am building some new functonality to my site using rules and views_rules, but the bulk delete is not yet ready. However I do use a Component of type Action Set with a dummy text variable to develop and test the view loop. I think it will be confusing if I add the export of my work in progress that does something else than deleting.
    – sigridt
    Commented Aug 28, 2017 at 9:12
0

Using the VBO module (together with the "bulk deletion" out of the box) as suggested in the prior answer is indeed the way to go, BUT ... if you add the Rules module to that also, then the possibilities for what you can do are virtually only limited by your own imagination. Read on for more details ...

Step 1: Create a Rules Component

Have a look at this example of a Rules Component (in Rules export format):

{ "rules_delete_nodes_containing_a_specific_value_in_a_text_field" : {
    "LABEL" : "Delete nodes containing a specific value in a text field",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "node" : { "label" : "Node", "type" : "node" },
      "text_field_value" : { "label" : "Text Field Value", "type" : "text" }
    },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_free_format_text" } },
      { "data_is" : {
          "data" : [ "node:field-free-format-text" ],
          "value" : "[text-field-value:value]"
        }
      }
    ],
    "DO" : [
      { "entity_delete" : { "data" : [ "node" ] } },
      { "drupal_message" : { "message" : "Deleted node with id \u0022[node:nid]\u0022 and title \u0022[node:title]\u0022 (which contained the string \u0022[text-field-value:value]\u0022 in field \u0022field_free_format_text\u0022)." } }
    ]
  }
}

Some more details to further explain the above above example:

  • This Rules Component will be used in the subsequent step.
  • In my case I have a text field with machine name field_free_format_text. Even though the question here does not mention anything about some extra requirements for the nodes to be deleted, you may want to consider adding some relevant additional requirements, as further explained in what follows.

Note that I also added the Rules Condition Entity has field to make that field available for further processing in this Rules Component. That's also what is mentioned in the Rules UI when you're adding a "data comparison" condition: somewhere it says "The data selector helps you drill down into the data available to Rules. To make entity fields appear in the data selector, you may have to use the condition 'entity has field' (or 'content is of type')". For a video tutorial that illustrates the importance of this Entity has field condition, refer to Data types and data selection, especially what is shown between about 13:30 and 17:30 in that video.

Note that I've not added a Rules condition here about selected content types, that's possibly an extra condition you might want to add also.

If you want, just copy the exported rule above, change all occurrences of the machine name of that field to match the machine name of your field, and then you can simply import this Rules Component in your own environment.

After you imported this Rules Component, you can navigate to admin/config/workflow/rules/components in your own site, and then use the hyperlink "execute" to qa-test it in your own site. After you use that link, use the button that says Switch to direct input mode. Then you'll be able to enter some Node identifier and hit the Execute mode. Depending on the node id you selected (if it has that field, and if the Rules Condition is satisfied), your node will be deleted.

After you're confident your rule works perfect for all variations of your nodes, move on to the next step below.

Here is an example of the (2) Drupal messages I got when executing this Rules component for a node with ID = 48, in which I used the string "GetRidOfThisNode":

  • Deleted node with id "48" and title "Demo field_free_format_text replacement" (which contained the string "GetRidOfThisNode" in field "field_free_format_text").
  • Component rule: Delete nodes containing a specific value in a text field has been executed.

Variation of the display of that message could be that you use Rules to create a (similar) log record ...

Attention: you always get the 2nd message. But the first one only shows up if you have an actual match ... and hence the delete gets performed also.

Step 2: Let VBO do the bulk of the work

This step is pretty easy ... Just create an appropriate view of all your nodes to be processed, and transform it into a Views Bulk Operations view. The clue to what you want VBO to do as an operation is ... you guessed it: Execute the Rules Component from Step 1.

If you're not familiar with how to do so, have a look at the video about Using Rules components with VBO". If you want even more, then also watch the subsequent "Using Rules components with more than one parameter" video.

Of course there are multiple variations of the above approach, like processing by component type, narrowing down your Views output to only "a" specific value, etc. But that should be straight forward, and up to your own imagination.

Attention: to process many nodes (such as "almost 28,000 nodes" ...) at once is quite a challenge (memory requirements, etc). Therefor you might want to also watch the video about "More details about VBO settings" ... Before you are tempted to use VBO for processing them all at once ...

Happy VBO-ing while Rules-ing!

Remark: Your additional question like "I also want to delete the images uploaded along with the nodes." is really a different question. A possible answer to that is what is suggested in the accepted answer to "Find orphaned unused files and images".

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.