web-dev-qa-db-fra.com

Autoriser uniquement la création de nouvelles sous-pages

Je cherche un moyen de ne permettre aux utilisateurs de créer de nouvelles sous-pages qu'une fois qu'il y a neuf pages qui sont des pages parents/racine. Une fois qu'il y a neuf pages parent lors de la tentative de création d'un nouveau parent, les utilisateurs recevront un message d'erreur.

Modifier:

Déplacé des commentaires à la réponse de @brasofilo ci-dessous:

lorsque je clique sur Soumettre, il traite comme il se doit, mais lorsque la page est actualisée, le message suivant s'affiche: "Page mise à jour" plutôt que "Page publiée. Afficher la page". Donc, cela n’est sauvegardé qu’en tant que brouillon et non publié.

L'objectif est donc de faire en sorte que le statut de la publication se comporte comme pour un type de publication par défaut, lorsque la nouvelle limite ne se déclenche pas.

Des idées?

Merci

2
INT

Code basé sur la réponse de Bainternet à cette question: Définir les catégories et les balises requises dans admin

Voir les commentaires de code.

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