Je cherchais un moyen de supprimer complètement les pages Web All, Published et Trash pour USERSautre que le moi, l'administrateur.
Le scénario pour moi est donc le suivant: j'ai des utilisateurs enregistrés (que j'aimerais attribuer aux rôles d'auteurs, de contributeurs, etc.). Maintenant, lorsqu'ils se connectent à mon site Web et accèdent à la zone des messages, je souhaite qu'ils ne voient pas ces trois liens (Tous, Publié, Corbeille).
J'ai essayé d'utiliser la fonction jquery, qui est fondamentalement la même chose que display: aucune, mais je ne pense pas que ce soit le choix optimal. Je sais qu'il y a de meilleures façons pour moi de le faire.
J'ai essayé d'utiliser des plugins, tels que Member et Adminimize, entre autres choses, mais je ne trouve pas le bon.
J'espère qu'il y a quelqu'un qui peut m'aider. Merci d'avance.
La classe WP_Posts_List_Table
étend WP_List_Table
et dans la méthode WP_List_Table::views()
, nous avons le filtre dynamique vues suivant:
/**
* Filter the list of available list table views.
*
* The dynamic portion of the hook name, `$this->screen->id`, refers
* to the ID of the current screen, usually a string.
*
* @since 3.5.0
*
* @param array $views An array of available list table views.
*/
$views = apply_filters( "views_{$this->screen->id}", $views );
Nous pouvons donc utiliser le filtre views_edit-post
généré pour ajuster les vues de la table {liste de postes).
Supprimons les tous, publier, futurs, collants, brouillon, en attente et corbeille pour les non-administrateurs (PHP 5.4+):
/**
* Remove the 'all', 'publish', 'future', 'sticky', 'draft', 'pending', 'trash'
* views for non-admins
*/
add_filter( 'views_edit-post', function( $views )
{
if( current_user_can( 'manage_options' ) )
return $views;
$remove_views = [ 'all','publish','future','sticky','draft','pending','trash' ];
foreach( (array) $remove_views as $view )
{
if( isset( $views[$view] ) )
unset( $views[$view] );
}
return $views;
} );
où vous pouvez modifier le $remove_views
selon vos besoins. Une autre approche consisterait à ne prendre que le mien et à ne renvoyer que la vue.
Ensuite, nous pourrions essayer de forcer la vue la mienne plus loin avec:
/**
* Force the 'mine' view on the 'edit-post' screen
*/
add_action( 'pre_get_posts', function( \WP_Query $q )
{
if(
is_admin()
&& $q->is_main_query()
&& 'edit-post' === get_current_screen()->id
&& ! current_user_can( 'manage_options' )
)
$q->set( 'author', get_current_user_id() );
} );
Avant:
Après:
Ces états sont passés de get_available_post_statuses()
, qui tire alors ses valeurs de wp_count_posts()
.
wp_count_posts()
transmet ses valeurs via le filtre wp_count_posts
. Donc, vous pouvez puiser dans cela et Hijack ce qui est retourné.
Essaye ça:
function _dbdb_wp_count_posts( $counts, $type, $perm ) {
global $pagenow;
if( 'edit.php' !== $pagenow ){
return $counts;
}
if( current_user_can( 'manage_options' ) ){
return $counts;
}
$_counts = new stdClass();
foreach ( $counts as $status => $count ){
$_counts->$status = '';
}
return $_counts;
}
add_filter('wp_count_posts', '_dbdb_wp_count_posts', 99, 3 );
Cela vérifie si nous sommes sur la page edit.php
dans l’administrateur, et si ce n’est pas le cas, renvoie simplement les comptes.
Ensuite, il vérifie si l'utilisateur actuel peut gérer les options du site, ce que seul un administrateur peut faire. Si l'utilisateur actuel le peut, tous les comptes sont renvoyés.
Si vous dépassez cette vérification, cela suppose que vous n'êtes pas un administrateur. Par conséquent, tous les comptes sont réinitialisés sur 0
, ce qui supprime efficacement les liens d'état.
Remarque: les liens d'état "tous" et "mines" sont codés en dur dans la méthode get_views()
de la classe WP_Posts_List_Table
et ne peuvent pas être filtrés.
J'ai rapidement testé cela sur mon serveur de développeur, en me connectant d'abord en tant qu'administrateur, puis en tant qu'auteur. Cela a fonctionné comme prévu, mais assurez-vous de tester à fond.