I’m currently working on two applications that I’m building on top of WordPress (of which I hope to share once they’re complete).
Both projects have views – basically pages with templates – that need to be created when the application is installed and the pages aren’t meant to be deleted.
Though I’ve covered how to programmatically create a post in WordPress, I thought I’d share a quick example of how you can programmatically prevent a page from being deleted in WordPress, too.
Post Statuses
In WordPress, a page is nothing more than a post type and, like all other post types, pages can have a certain status:
- Publish
- Pending
- Draft
- Auto-Draft
- Future
- Private
- Inherit
- Trash
In project, I’m programmatically creating pages so I’m setting their status to publish, by default.
In my particular case, the rest of the statuses don’t really matter; however, your mileage may vary if you’re working with pre-existing pages or pages that users are able to edit.
Prevent a Page From Being Deleted
When pages are deleted within the WordPress Dashboard, they are actually moved to the Trash. Technically speaking, their post_status is changed to trash.
In order to prevent a page from being deleted, it’s a matter of updating the post_status whenever it’s been changed.
Here are the requirements for the function listed below:
- Try to find the page.
- If it’s in the trash, change it’s status;
- Otherwise, programmatically create it.
 
And here we go:
/**
 * Programmatically creates a page with the specified title, slug, and
 * an optional template. Make sure that the page cannot be deleted.
 */
function example_create_page() {
	// Initialize the page ID. This indicates no action has been taken.
	$page_id = -1;
	// Example titles and slugs
	$title = 'My Example Page';
	$slug = 'example-page';
	// First, try to get the page
	$page = get_page_by_title( $title, OBJECT, 'page' );
	// If the page doesn't exist, create it
	if( null == $page ) {
		// Create the page saving the ID
		$page_id = wp_insert_post(
			array(
				'comment_status'	=>	'closed',
				'ping_status'		=>	'closed',
				'post_author'		=>	1,
				'post_title'		=>	$title,
				'post_name'		=>	$slug,
				'post_status'		=>	'publish',
				'post_type'		=>	'page'
			)
		);
	// Otherwise, if the page is in the trash, update its status
	} elseif( 'trash' == strtolower( $page->post_status ) ) {
		$page->post_status = 'publish';
		wp_update_post( $page );
	} // end if/else
} // end example_create_page
add_action( 'after_setup_theme', 'example_create_page' );
The comments in the code should be clear as to what it’s doing. The only other thing worth mentioning is that this function is after_setup_theme action. I’ve added it here because it’s part of the theme’s requirements.
Straight from the Codex:
This hook is called during a themes initialization. Is generally used to perform basic setup, registration, and init actions for a theme.
Again, this is a simple example and your particular use case may be a bit different, but the general principles should still apply.


Leave a Reply
You must be logged in to post a comment.