Par défaut, WordPress affiche TOUTES les publications destinées aux utilisateurs auteurs. Je voulais que les auteurs ne puissent voir que leurs propres messages. Je suis donc venu avec le code suivant qui fonctionne bien.
Des suggestions pour condenser/optimiser?
// Only show posts related to current author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
if ( is_admin() && !current_user_can('edit_others_posts') ) {
$wp_query->set( 'author', $current_user->ID );
}
}
// Check that user is not an Administrator
if (!current_user_can('promote_users')) {
add_filter('views_edit-post', 'remove_mine');
add_filter('views_edit-post', 'posts_all');
add_filter('views_edit-post', 'posts_published');
add_filter('views_edit-post', 'posts_draft');
add_filter('views_edit-post', 'posts_pending');
add_filter('views_edit-post', 'posts_trash');
}
// Remove "Mine" from filter bar
function remove_mine( $views ) {
unset($views['mine']);
return $views;
}
// Fix "All" post count to only include posts related to current author
function posts_all($views) {
global $current_user;
$query = array(
'author' => $current_user->ID,
'post_type' => 'post'
);
$result = new WP_Query($query);
if ( get_query_var('post_status') == NULL ) $class = ' class="current"';
$link = sprintf(__('<a href="%s"'.$class.'>All <span class="count">(%d)</span></a>', 'all'),
admin_url('edit.php?post_type=post'),
$result->found_posts);
$views['all'] = $link;
return $views;
}
// Fix "Published" post count to only include posts related to current author
function posts_published($views) {
global $current_user;
$query = array(
'author' => $current_user->ID,
'post_status' => 'publish',
'post_type' => 'post'
);
$result = new WP_Query($query);
if ( get_query_var('post_status') == 'publish' ) $class = ' class="current"';
$link = sprintf(__('<a href="%s"'.$class.'>Published <span class="count">(%d)</span></a>', 'publish'),
admin_url('edit.php?post_status=publish&post_type=post'),
$result->found_posts);
$views['publish'] = $link;
return $views;
}
// Fix "Drafts" post count to only include posts related to current author
function posts_draft($views) {
global $current_user;
$query = array(
'author' => $current_user->ID,
'post_status' => 'draft',
'post_type' => 'post'
);
$result = new WP_Query($query);
if ( get_query_var('post_status') == 'draft' ) $class = ' class="current"';
$link = sprintf(__('<a href="%s"'.$class.'>Draft'.((sizeof($result->posts)>1)?"s":"").' <span class="count">(%d)</span></a>', 'draft'),
admin_url('edit.php?post_status=draft&post_type=post'),
$result->found_posts);
$views['draft'] = $link;
return $views;
}
// Fix "Pending" post count to only include posts related to current author
function posts_pending($views) {
global $current_user;
$query = array(
'author' => $current_user->ID,
'post_status' => 'pending',
'post_type' => 'post'
);
$result = new WP_Query($query);
if ( get_query_var('post_status') == 'pending' ) $class = ' class="current"';
$link = sprintf(__('<a href="%s"'.$class.'>Pending <span class="count">(%d)</span></a>', 'pending'),
admin_url('edit.php?post_status=pending&post_type=post'),
$result->found_posts);
$views['pending'] = $link;
return $views;
}
// Fix "Trash" post count to only include posts related to current author
function posts_trash($views) {
global $current_user;
$query = array(
'author' => $current_user->ID,
'post_status' => 'trash',
'post_type' => 'post'
);
$result = new WP_Query($query);
if ( get_query_var('post_status') == 'trash' ) $class = ' class="current"';
$link = sprintf(__('<a href="%s"'.$class.'>Trash <span class="count">(%d)</span></a>', 'trash'),
admin_url('edit.php?post_status=trash&post_type=post'),
$result->found_posts);
$views['trash'] = $link;
return $views;
}
Ok je l'ai compris. Voici le code optimisé:
// Show only posts related to current user
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
if( is_admin() && !current_user_can('edit_others_posts') ) {
$wp_query->set( 'author', $current_user->ID );
add_filter('views_edit-post', 'fix_post_counts');
}
}
// Fix post counts
function fix_post_counts($views) {
global $current_user, $wp_query;
unset($views['mine']);
$types = array(
array( 'status' => NULL ),
array( 'status' => 'publish' ),
array( 'status' => 'draft' ),
array( 'status' => 'pending' ),
array( 'status' => 'trash' )
);
foreach( $types as $type ) {
$query = array(
'author' => $current_user->ID,
'post_type' => 'post',
'post_status' => $type['status']
);
$result = new WP_Query($query);
if( $type['status'] == NULL ):
$class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
$views['all'] = sprintf(__('<a href="%s"'. $class .'>All <span class="count">(%d)</span></a>', 'all'),
admin_url('edit.php?post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'publish' ):
$class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
$views['publish'] = sprintf(__('<a href="%s"'. $class .'>Published <span class="count">(%d)</span></a>', 'publish'),
admin_url('edit.php?post_status=publish&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'draft' ):
$class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
$views['draft'] = sprintf(__('<a href="%s"'. $class .'>Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' <span class="count">(%d)</span></a>', 'draft'),
admin_url('edit.php?post_status=draft&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'pending' ):
$class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
$views['pending'] = sprintf(__('<a href="%s"'. $class .'>Pending <span class="count">(%d)</span></a>', 'pending'),
admin_url('edit.php?post_status=pending&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'trash' ):
$class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
$views['trash'] = sprintf(__('<a href="%s"'. $class .'>Trash <span class="count">(%d)</span></a>', 'trash'),
admin_url('edit.php?post_status=trash&post_type=post'),
$result->found_posts);
endif;
}
return $views;
}