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!
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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
Method 2
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' );
?>
Method 3
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;
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0