Here est une solution étonnante pour restreindre la création de nouvelles pages parent. Je souhaiterais l'utiliser, mais les sous-pages nouvellement créées ne sont enregistrées que comme des brouillons et cela n'a pas été résolu (voir les derniers commentaires au lien mentionné).
Le problème est que ce code enregistre toujours la page sous la forme Draft
et je ne sais pas comment résoudre ce problème:
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();
}
}
vous n'avez en fait besoin d'aucune action ajax ou côté serveur, il suffit de voir si l'utilisateur a sélectionné une page parent:
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
}
J'utilise le plugin Lock Pages. Verrouiller les pages empêche les pages spécifiées (ou toutes les pages) de modifier leur slug, parent, statut ou mot de passe, ou de les supprimer, par un non-administrateur. http://wordpress.org/extend/plugins/lock-pages/