I disabled the parent boxes to avoid shifting parents to the left.
add_action( 'admin_footer-post.php', 'wpse_98274_disable_top_categories_checkboxes' );
add_action( 'admin_footer-post-new.php', 'wpse_98274_disable_top_categories_checkboxes' );
/**
* Disable parent checkboxes in Post Editor.
*/
function wpse_98274_disable_top_categories_checkboxes() {
global $post_type;
if ( 'post' != $post_type )
return;
?>
<script type="text/javascript">
jQuery( "#category-all ul.children" ).each( function() {
jQuery(this).closest( "ul" ).parent().children().children( "input" ).attr( 'disabled', 'disabled' )
});
</script>
<?php
}
However, once the categories are pulled out of order for that horrid “feature” that moves them to the top of the box, the jQuery fails. I borrowed this code from a plugin.
add_filter( 'wp_terms_checklist_args', 'wpse_98274_checklist_args' );
/**
* Remove horrid feature that places checked categories on top.
*/
function wpse_98274_checklist_args( $args ) {
$args['checked_ontop'] = false;
return $args;
}