web-dev-qa-db-fra.com

Fonction de lecture seule pour une publication personnalisée dans la zone d'administration

En fait, je construis un type personnalisé sur WP et je dois pouvoir limiter l'accès ultérieur à un rôle d'utilisateur, par exemple. dans la zone d'administration, les collaborateurs peuvent voir les publications mais ne peuvent pas les modifier, il suffit de les ouvrir en lecture seule. J'ai utilisé des plugins (Adminimize et User Role Editor) mais, autant que je sache, ils ne répondent pas à mes besoins.

Quelqu'un me donne-t-il des instructions pour résoudre ce problème?

3
Jackson Gomes

la suggestion de brasolfilo de supprimer la méta-boîte d'envoi n'est qu'un élément de ce que je considérerais comme une solution complète. Je peux pirater un bouton "soumettre" dans cette page à l'aide de FireBug ou de quelques autres outils, en quelques minutes.

Je voudrais...

  1. Supprimez la boîte méta. C'est la solution de brasofilo, et je ne vais pas en dire plus car ce code a l'air d'aller.
  2. Supprimez tous les accès à post-new.php pour ce type de publication pour les utilisateurs qui ne devraient avoir qu'un accès en lecture seule.
  3. Modifier le lien "Ajouter un nouveau" sur la page d'édition.
  4. Tuez la publication du message dans PHP pour que les personnes qui pensent comme elles (pensant comme moi :)) ne se faufilent pas.

Le code suivant utilise le type de message "Livre" qui se trouve dans Codex . Vous pouvez le modifier pour correspondre à votre CPT.

Supprimer l'accès à post-new.php

function conditional_redirect_post_new_wpse_94776() {
  global $_REQUEST,$pagenow;
  if (!empty($_REQUEST['post_type'])
    && 'book' == $_REQUEST['post_type']
    && !empty($pagenow)
    && 'post-new.php' == $pagenow
    && !current_user_can('administrator'))
  {
    wp_safe_redirect(admin_url('edit.php?post_type=book'));
  }
}
add_filter('admin_menu','conditional_redirect_post_new_wpse_94776');

Supprimer le menu "Ajouter un nouveau"

function remove_add_new_menu_wpse_94776() {
  if (!current_user_can('administrator')) {
    remove_submenu_page('edit.php?post_type=book','post-new.php?post_type=book');
  }
}
add_action('admin_menu','remove_add_new_menu_wpse_94776');

Modifier le lien "Ajouter un nouveau" sur la page d'édition

function reset_post_new_link_wpse_94776() {
  global $post_new_file,$post_type_object;
  if (!isset($post_type_object) || 'book' != $post_type_object->name) return false;

  if (!current_user_can('administrator')) {
    $post_type_object->labels->add_new = 'Return to Index';
    $post_new_file = admin_url('edit.php?post_type=book');
  }
}
add_action('admin_head','reset_post_new_link_wpse_94776');

Empêcher les soumissions sournoises

function stop_submit_wpse_94776() {
  if (!empty($_POST) && $_POST['post_type'] == 'book' && !current_user_can('administrator')) {
    if (true === DOING_AJAX) {
      exit;
    }
    if (!empty($_POST['post_ID'])) {
      wp_safe_redirect(admin_url('post.php?post='.$_POST['post_ID'].'&action=edit'));
      exit;
    } else {
      wp_safe_redirect(admin_url('edit.php?post_type=book'));
      exit;
    }
  }
}
add_action('admin_init','stop_submit_wpse_94776');

Je pense l'a eu. Cela semble fonctionner comme je l'ai testé, mais je ne serais pas surpris qu'il y ait des bogues, en particulier dans ce dernier bloc de code, ni s'il y avait des façons plus élégantes de faire les mêmes choses. Caveat Emptor . Pas de remboursement.

5
s_ha_dum

Si vous supprimez simplement la méta-boîte, il n'y a aucun moyen de sauvegarder/mettre à jour le message. Testé ici avec le type de poste régulier:

add_action( 'do_meta_boxes', 'remove_publish_mbox_wpse_94776', 10, 3 );

function remove_publish_mbox_wpse_94776( $post_type, $position, $post )
{
    remove_meta_box( 'submitdiv', 'post', 'side' );
}

Il pourrait y avoir problèmes avec sauvegarde automatique et révisions.

Une autre solution serait de rendre les champs en lecture seule avec jQuery, mais ce n’est peut-être pas très solide.

Enfin, une autre option serait supprimer les champs Titre et contenu et imprimer texte simple en remplacement.

2
brasofilo