I'm trying to create a plugin that alters the Add New Post page so the Visibility field says "Private" by default:

Status: Draft
Visibility: **Private**
Publish immediately


...as opposed to what WordPress normally assumes:

Status: Draft
Visibility: **Public**
Publish immediately


At the moment, I'm using the "wp_insert_post_data" filter, and that is allowing me to change any posts with a post_status of "auto-draft" to "private". While this works, there is an unintended side-effect: Changing the post_status to "private" seems to publish the post automatically, changing the button in the editor to "Update". Furthermore, if the user saves before specifying a title, the post will be published with the title "Auto-Draft".

Is there any way I can simply change Visibility to Private by the default, in a manner that doesn't auto-publish the post, and change the button to "Update"? In vanilla WordPress, users can manually change the visibility to Private, and the button remains as Publish... I just need to achieve that via a plugin. I also want to ensure that "public" can still be selected by the user, should they desire to.



since you're developing a plug-in, I assume you don't want to touch any files outside of wp-content/plugins or ../themes for that matter.

However, if that's not the case, follow along:
Go to wp-admin/includes/meta-boxes.php and find:

$visibility = 'public';
$visibility_trans = __('Public');

Now change it to the obvious:

$visibility = 'private';
$visibility_trans = __('Private');

Again, this affects the meta-boxes.php file which is outside of the plugins folder. Nonetheless, I think the approach you should be taking is creating a new meta box, adding your custom visibility setting (i.e. private) and make the latter override the default WP visibility setting.


  • 2
    Solutions which require you to modify core files will always get steamrolled over when you do an update. Therefore they really aren't solutions. Apr 18 '11 at 19:21
  • Agreed, but unless I'm mistaken, I believe the part in bold is achievable via a regular plugin. If that's the case, then that's a decent solution, just slightly more work than what I wanted to do. Apr 19 '11 at 0:05

from the plugin; uses action 'post_submitbox_misc_actions' and some query to catch the user Publish form: http://wordpress.org/extend/plugins/private-post-by-default/

function default_post_visibility(){
global $post;

if ( 'publish' == $post->post_status ) {
    $visibility = 'public';
    $visibility_trans = __('Public');
} elseif ( !empty( $post->post_password ) ) {
    $visibility = 'password';
    $visibility_trans = __('Password protected');
} elseif ( $post_type == 'post' && is_sticky( $post->ID ) ) {
    $visibility = 'public';
    $visibility_trans = __('Public, Sticky');
} else {
    $post->post_password = '';
    $visibility = 'private';
    $visibility_trans = __('Private');
} ?>

<script type="text/javascript">
        try {
            $('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
            $('#hidden-post-visibility').val('<?php echo $visibility; ?>');
            $('#visibility-radio-<?php echo $visibility; ?>').attr('checked', true);
        } catch(err){}
    }) (jQuery);

add_action( 'post_submitbox_misc_actions' , 'default_post_visibility' );

  • This breaks drafts and auto-publishes posts when you do "Save Draft". Any other solutions?
    – user25977
    Jan 13 '13 at 23:38

The correct way to automatically mark a post as private is to do it with the wp_insert_post_data filter. It's very straightforward:

add_filter( 'wp_insert_post_data', 'mark_post_private' );
function mark_post_private( $data ) {
    if ( 'your_post_type_goes_here' == $data['post_type'] ) {
        $data['post_status'] = 'private';

    return $data;
  • This is correct, but if you want the post to be able to be put into trash, you should check first if ( 'trash' != $post['post_status'] ).
    – alexg
    Dec 13 '19 at 11:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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