WordPress automatic and permanent page

Yes, that is doable.

I don’t know about running scripts immediately after WP installation is complete, but you could implement your idea perhaps with a must-use plugin.

First you probably want some kind of way to get the contact page id. A helper function for that,

function get_my_contact_page_id() {
  return get_option( 'my_contact_page', 0 ); // custom option might be a logical place to store the id
}

Then pick your favorite hook that you’ll use to check, if the contact page needs to be created. For example run the check only when the theme is changed.

function create_contact_page(){
  if ( ! get_my_contact_page_id() ) {
    $args = array(
      'post_type'   => 'page',
      'post_status' => 'publish',
      'post_title'  => __( 'Contact', 'textdomain' ),
      //'post_name'   => 'contact', // add this, if you want to force the page slug
    );
    $id = wp_insert_post( $args );
    if ( $id ) {
      add_option('my_contact_page', $id); // custom option might be a logical place to store the id
    }
  }
}
add_action( 'after_switch_theme', 'create_contact_page' );

To exclude the page from the Pages admin view, use pre_get_posts.

function exclude_single_page_on_admin_page_list($query) {
  if ( is_admin() ) {
    global $pagenow;
    if ( 'edit.php' === $pagenow && 'page' === $query->query['post_type'] ) {
      if ($contact_page = get_my_contact_page_id()) {
        $query->set( 'post__not_in', array( $contact_page ) );
      }
    }
  }
}
add_action( 'pre_get_posts', 'exclude_single_page_on_admin_page_list' );

To prevent anyone accessing the contact page editing view directly, add a redirect protection.

function prevent_excluded_page_editing() {
  global $pagenow;
  if ( 'post.php' === $pagenow && isset( $_GET['post'] ) && $_GET['post'] == get_my_contact_page_id() ) {
    wp_redirect( admin_url( '/edit.php?post_type=page' ) );
    exit;
  }
}
add_action( 'admin_init', 'prevent_excluded_page_editing' );

Leave a Comment