web-dev-qa-db-fra.com

Capacités de type post personnalisé

J'ai un scénario assez unique pour lequel j'apprécierais de l'aide.

J'ai un type de message personnalisé, coin, pour le contenu créé automatiquement par un processus d'importation personnalisé. Je voudrais empêcher tous les utilisateurs d'effectuer certaines actions sur les postes de pièces. Plus précisément, je souhaite empêcher tout utilisateur de supprimer une pièce de monnaie, de modifier le statut publié ou de modifier la visibilité.

J'ai enregistré un type de message:

function my_post_type() {
    register_post_type('coin',
            array(
                'labels' => array(
                    'name' => __( 'Coins' ),
                    'singular_name' => __( 'Coin' ),
                    'view_item' => __( 'View Coin' ),
                    'edit_item' => __( 'Edit Coin' ),
                    ),
                'public' => true,
                'menu_position' => 5,
                'capability_type' => 'coin',
                )
            );
}
add_action('init', 'my_post_type');

J'ai précisé comment gérer les capacités:

function my_map_meta_cap( $caps, $cap, $user_id, $args ) {
    if (preg_match('/_coins?$/', $cap) == 1){
        $post = get_post( $args[0] );
        $post_type = get_post_type_object( $post->post_type );
        $caps = array();
        $disallowed = array(
                'delete_coin',
                'publish_coins',
                );
        if (in_array($cap, $disallowed)){
            $caps[] = 'do_not_allow';
        }
    } 
    return $caps;
}
add_filter( 'map_meta_cap', 'my_map_meta_cap', 10, 4 );

Cela empêche la suppression des postes de monnaie. Cela empêche l'ajustement de la visibilité d'une pièce de monnaie. Cela empêche les utilisateurs de publier une pièce de monnaie. Toutefois, cela n'empêche pas les utilisateurs de modifier le statut d'une pièce de monnaie en projet ou en attente de révision.

De plus, je voudrais empêcher les utilisateurs d’ajouter de nouveaux postes de pièces, car ceux-ci ne devraient être créés que par la routine d’importation. Je n'ai trouvé aucune information sur la façon dont je pouvais le faire.

Quelqu'un peut-il m'aider ou est-ce que je demande trop de wordpress?

4
Doug Miller

Il n’ya pas de bonne façon de procéder car le code de cette section est assez rigide. Vous pouvez simplement supprimer les éléments via JavaScript. En supprimant (et non en masquant) les éléments, vous désactivez la fonctionnalité. Vous pouvez personnaliser les éléments suivants selon vos besoins, j'en suis sûr.

  1. Utilisez CSS pour masquer la boîte de dialogue post actions afin que les boutons interdits ne s'affichent jamais à l'écran. Sans cela, vous verrez les boutons un instant, puis ils disparaissent.
  2. Déménagements des éléments
  3. Affiche à nouveau la boîte intérieure des actions de publication.

Exemple:

add_action('admin_head-post.php', 'remove_publishing_actions');
add_action('admin_head-post-new.php', 'remove_publishing_actions');
function remove_publishing_actions(){
    global $post;
    if($post->post_type == 'post'){
        //check user capabilities here
        echo "<style type='text/css'>
                /* hide the publishing box until we remove the elements */
                #submitpost{display:none;}
            </style>";

        echo "
            <script type='text/javascript'>
                jQuery(document).ready(function($){
                    //Remove whatever elements you don't want
                    $('#misc-publishing-actions, #save-action, #delete-action').remove();
                    //Show the publish actions
                    $('#submitpost').show();
                });
            </script>

        ";
    }
}

Vous devriez probablement vérifier votre limite utilisateur personnalisée avant de faire écho aux balises de style et de script. J'espère que cela t'aides!

3
Brian Fegter