Only allow new subpages to be created

The question:

I’m looking for a way to only allow users to create new subpages once there are nine pages that are parents/root pages. Once there are nine parent pages when trying to create a new parent the users will get an error message.

Edit:

Moved from the comments to @brasofilo s answer below:

when I press submit it processes as it should but when the page refreshes I get the message: “Page updated” rather than “Page published. View page”. So it’s only saved as a draft, not actually published.

So the goal is to have the post status behave like it would for a default post type, when the new limit isn’t triggering.

Ideas?

Thanks

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Code based in Bainternet’s answer to this question: Make Categories and Tags required in admin

See code comments.

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


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

Leave a Comment