Je souhaite désactiver les pages d'auteur pour certains utilisateurs, par exemple l'utilisateur admin ne publie rien mais a toujours une page d'auteur.
Est-ce possible? Peut-être un plugin qui ajoute une option à la page des utilisateurs dans le panneau d'administration pour activer/désactiver la page de l'auteur?
Je pense qu'une combinaison des réponses à ce jour avec un champ de la zone d'administration pour désactiver les archives de l'auteur est le meilleur choix.
Une classe pour tout emballer (avec quelques constantes et méthodes qui seront clarifiées plus tard):
<?php
class Author_Archive_Disabler
{
// meta key that will store the disabled status
const KEY = '_author_archive_disabled';
// nonce name
const NONCE = 'author_archive_nonce';
private static $ins = null;
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
public static function init()
{
add_action('plugins_loaded', array(self::instance(), '_setup'));
}
// helper to see if the archive is disabled.
public static function is_disabled($user_id)
{
return 'on' == get_user_meta($user_id, self::KEY, true);
}
// adds actions and such
public function _setup()
{
//
}
}
Pour ajouter des champs auxquels vous vous connectez edit_user_profile
(affiche les champs des profils autres que le vôtre) et show_user_profile
(affiche les champs de votre propre profil).
<?php
class Author_Archive_Disabler
{
// snip snip
// adds actions and such
public function _setup()
{
add_action('edit_user_profile', array($this, 'field'));
add_action('show_user_profile', array($this, 'field'));
}
public function field($user)
{
// only let admins do this.
if(!current_user_can('manage_options'))
return;
echo '<h4>', __('Disable Archive', 'author-archive-disabler'), '</h4>';
wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false);
printf(
'<label for="%1$s"><input type="checkbox" name="%1$s" id="%1$s" value="on" %2$s /> %3$s</label>',
esc_attr(self::KEY),
checked(get_user_meta($user->ID, self::KEY, true), 'on', false),
__('Disable Author Archive', 'author-archive-disabler')
);
}
}
Très simple: affichez le champ uniquement aux administrateurs, imprimez un en-tête, un champ nonce et la case à cocher "désactiver" elle-même.
Vous vous connectez à edit_user_profile_update
(profils des autres) et à personal_options_update
(votre propre profil) pour enregistrer des éléments.
<?php
class Author_Archive_Disabler
{
// snip snip
// adds actions and such
public function _setup()
{
add_action('edit_user_profile', array($this, 'field'));
add_action('show_user_profile', array($this, 'field'));
add_action('edit_user_profile_update', array($this, 'save'));
add_action('personal_options_update', array($this, 'save'));
}
// snip snip
public function save($user_id)
{
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id)
) return; // nonce is no good, bail
if(!current_user_can('edit_user', $user_id))
return; // current user can't edit this user, bail
update_user_meta($user_id, self::KEY,
!empty($_POST[self::KEY]) ? 'on' : 'off');
}
}
Vérifiez le nonce, assurez-vous que l'utilisateur actuel peut réellement le modifier, puis enregistrez des éléments. si la case est cochée, elle entrera comme "on".
Maintenant, connectez-vous à template_redirect
, recherchez la page auteur et 404 si elle est désactivée.
<?php
class Author_Archive_Disabler
{
// snip snip
// adds actions and such
public function _setup()
{
add_action('edit_user_profile', array($this, 'field'));
add_action('show_user_profile', array($this, 'field'));
add_action('edit_user_profile_update', array($this, 'save'));
add_action('personal_options_update', array($this, 'save'));
add_action('template_redirect', array($this, 'maybe_disable'));
}
// snip snip
public function maybe_disable()
{
global $wp_query;
// not an author archive? bail.
if(!is_author())
return;
if(self::is_disabled(get_queried_object_id()))
{
$wp_query->set_404();
}
}
}
Vous pouvez également filtrer le lien de l'auteur afin qu'un utilisateur désactivé ne soit jamais lié.
<?php
class Author_Archive_Disabler
{
// snip snip
// adds actions and such
public function _setup()
{
add_action('edit_user_profile', array($this, 'field'));
add_action('show_user_profile', array($this, 'field'));
add_action('edit_user_profile_update', array($this, 'save'));
add_action('personal_options_update', array($this, 'save'));
add_action('template_redirect', array($this, 'maybe_disable'));
add_filter('author_link', array($this, 'change_link'), 10, 2);
}
// snip snip
public function change_link($link, $author_id)
{
if(self::is_disabled($author_id))
return apply_filters('author_archive_disabler_default_url', home_url(), $author_id);
return $link;
}
}
Toutes ces réponses sous forme de plugin
Je recommanderais le filtrage author_link
, qui filtre la sortie renvoyée de get_author_posts_url()
:
$link = apply_filters('author_link', $link, $author_id, $author_nicename);
Filtrer comme ceci:
function wpse74924_filter_author_link( $link, $author_id, $author_nicename ) {
if ( user_can( $author_id, 'administrator' ) ) {
// This is an administrator
return '';
// You could also return home_url() to link to the site front page
}
// Otherwise, return $link unmodified
return $link;
}
add_filter( 'author_link', 'wpse74924_filter_author_link' );
Ou peut-être même plus propre, filtre the_author_posts_link
, qui filtre la sortie renvoyée de the_author_posts_link () ` :
echo apply_filters( 'the_author_posts_link', $link );
Supposons, par exemple, que vous ne vouliez pas afficher d'index d'archive d'auteur pour les utilisateurs de administrator
, vous pouvez faire quelque chose comme ceci:
function wpse74924_filter_the_author_posts_link( $link ) {
// Since $author_id doesn't get passed to this filter,
// we need to query it ourselves
$author_id = get_the_author_meta( 'ID' );
if ( user_can( $author_id, 'administrator' ) ) {
// This is an administrator
__return_false();
}
// Otherwise, return $link unmodified
return $link;
}
add_filter( 'the_author_posts_link', 'wpse74924_filter_the_author_posts_link' );
Modifier les liens de l'auteur comme suggéré dans d'autres réponses fait certainement partie de la solution. Vous ne voulez pas imprimer ces liens si vous ne les utilisez pas. Si vous voulez être sûr de tuer les pages auteur cependant ...
function tst() {
global $wp_query;
if (is_author() && !empty($wp_query->query['author_name'])) {
$author = get_user_by('login',$wp_query->query['author_name']);
if ( 1 === $author->ID) {
wp_safe_redirect(get_bloginfo('url'),'301'); // or whatever you want
}
}
}
add_action('template_redirect','tst');
vous pouvez détecter le nom de l'auteur sur le hook template_redirect et le rediriger vers la page d'accueil
http://codex.wordpress.org/Author_Templates#Setting_Up_for_Author_Information