Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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

[Publish]

...as opposed to what WordPress normally assumes:

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

[Publish]

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.

Thanks!

share|improve this question

3 Answers 3

up vote 0 down vote accepted

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.

Best,
Chris

share|improve this answer
1  
Solutions which require you to modify core files will always get steamrolled over when you do an update. Therefore they really aren't solutions. –  Drew Gourley 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. –  Matt Refghi 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">
    (function($){
        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);
</script>
<?php
}

add_action( 'post_submitbox_misc_actions' , 'default_post_visibility' );

?>
share|improve this answer
    
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($data['post_type'] == 'your_post_type_goes_here')
    {
        $data['post_status'] = 'private';
    }

    return $data;
}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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