Allow only new sub-pages to be created

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();
    }
}

Related posts

Leave a Reply

2 comments

  1. you actually don’t need any ajax or server side action, simple see if the user has selected a parent page:

    add_action( 'admin_head-post-new.php', 'publish_admin_hook_wpse_78690' );
    add_action( 'admin_head-post.php', 'publish_admin_hook_wpse_78690' );
    
    function publish_admin_hook_wpse_78690()
    {
        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 parent_id = jQuery('#parent_id').val();
                    if (parseInt(parent_id) > 0){
                        jQuery('#ajax-loading').hide();
                        jQuery('#publish').removeClass('button-primary-disabled');
                        return true;
                    }else{
                        alert("please selet your parent page");
                        jQuery('#ajax-loading').hide();
                        jQuery('#publish').removeClass('button-primary-disabled');
                        return false;
                    }
                    return false;
                });
            });
        </script>
        <?php
    }