Prevent users from deleting a page or post in WordPress

During my time developing plugins, theme and sites using WordPress I have often come across the need
to prevent certain pages from being deleted. I have tried many solutions that did not do the trick or
didn’t provide a full solution to the problem. Some left the delete links but would create errors
when they were clicked for instance.

The following function will allow you to prevent any user including admins from deleting a specific
page, post or custom post type item. Not only that but it also prevents the trash & delete links
from appearing anywhere for that post. It will also prevent trashing the item during mass deletions.

You can set the $post_id anyway you see fit. Use a site_option, an array of ids via in_array() etc.

I am a founder & CEO of Code Atlantic and I've been working with WordPress for over 15 years creating plugins to help WP site owners grow for more than 10 of those. We have developed and maintained popular plugins including the best wordpress popup plugin, Popup Maker with over 4k 5 star reviews, as well as Content Control, Ahoy & User Menus.

Follow on:

4 Comments

  1. Marx on May 17, 2020 at 1:53 pm

    Hey, great. This one gives me no errors and works but how can I have multiple page ids? Like nested array or something?

    • danieliser on May 18, 2020 at 9:58 pm

      You would simply need to loop over an array of post IDs and compare them instead of checking one specific one.

          $post_ids = [1,2,3];
      
          if ( isset( $args[0] ) && isset( $args[2] ) && in_array( $args[2], $post_ids ) && $args[0] == 'delete_post' ) {
              $allcaps[ $caps[0] ] = false;
          }
      • Marx on May 20, 2020 at 9:23 am

        Perfect, thank you so much ๐Ÿ™‚

  2. Jan Van Roy on November 16, 2020 at 1:19 pm

    Works well in page overview, but I still have the ‘move to trash’ option in document settings.

Leave a Comment





This site uses Akismet to reduce spam. Learn how your comment data is processed.