Here is an amazing solution to restrict the creation of new parent pages, and I would want to use it, but the newly created sub-pages are saved only as drafts and this was not solved (see last comments at mentioned link).
The problem is that this code always saves the page as Draft
and I have no idea how to solve this:
add_action( 'admin_head-post-new.php', 'wpse_59770_publish_admin_hook' );
add_action( 'admin_head-post.php', 'wpse_59770_publish_admin_hook' );
add_action( 'wp_ajax_wpse_59770_pre_submit_validation', 'wpse_59770_ajax_pre_submit_validation' );
function wpse_59770_publish_admin_hook()
{
global $current_screen;
if( 'page' != $current_screen->post_type )
return;
?>
<script language="javascript" type="text/javascript">
jQuery(document).ready(function() {
jQuery('#publish').click(function()
{
var form_data = jQuery('#parent_id').val();
form_data = ( '' != form_data ) ? '1' : '0';
var data = {
action: 'wpse_59770_pre_submit_validation',
security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
form_data: form_data
};
jQuery.post(ajaxurl, data, function(response)
{
// OK, save page
if (response=='true') {
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
jQuery('#post').submit();
}
// Not OK, display alert message
else
{
alert(response);
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
return false;
}
});
return false;
});
});
</script>
<?php
}
function wpse_59770_ajax_pre_submit_validation()
{
//simple Security check
check_ajax_referer( 'pre_publish_validation', 'security' );
// Parent is set, no further action
if( '1' == $_POST['form_data'] )
{
echo 'true';
die();
}
$args = array( 'post_type' => 'page', 'post_parent'=> 0, 'numberposts' => -1 );
$parents_total = get_posts( $args );
// Total parents is less than 9, no further action
if( count($parents_total) < 9 )
{
echo 'true';
die();
}
// No more parents allowed
else
{
$error = "No more Parent Pages allowed";
echo $error;
die();
}
}
you actually don’t need any ajax or server side action, simple see if the user has selected a parent page:
I use Lock Pages plugin. Lock Pages prevents specified pages (or all pages) from having their slug, parent, status or password edited, or from being deleted, by non-administrator. http://wordpress.org/extend/plugins/lock-pages/