web-dev-qa-db-fra.com

Modèle d'auteur, filtrez les widgets de la barre latérale par auteur?

J'aimerais pouvoir filtrer mes widgets de la barre latérale (nuage de tags, catégorie, archive) pour afficher uniquement les tags/catégories/mois qui s'appliquent à un auteur donné sur le modèle d'auteur.

Quelle est la bonne façon de filtrer ou de modifier ces widgets? J'ai trouvé cette page dans le codex, mais il ne semble pas que les fonctions natives de l'un des widgets puissent accepter un identifiant d'auteur en tant que paramètre.

6
javy

Il est un peu difficile de saisir tous les messages d'un auteur et de les filtrer pour ne renvoyer qu'une liste de catégories. Si vous souhaitez utiliser les widgets par défaut dans la barre latérale et les faire filtrer par l'auteur uniquement sur le modèle d'auteur, nous vous suggérons d'utiliser l'approche suivante.

Commencez par filtrer les requêtes d'étiquette et de widget de catégorie pour les catégories et les étiquettes.

add_filter( 'widget_tag_cloud_args', 'filter_categories_by_author' );
add_filter( 'widget_categories_dropdown_args', 'filter_categories_by_author' );
add_filter( 'widget_categories_args', 'filter_categories_by_author' );
function filter_categories_by_author( $args ){
    // only process if on the author template
    if( is_author() ){
        $author_id = get_the_author_meta( 'ID' );
        $taxonomy = !empty( $args['taxonomy'] ) ? $args['taxonomy'] : 'category';
        // filter by including only IDs associated to the author
        $args['include'] = get_taxonomy_ids_by_author( $author_id, $taxonomy );
    }
    return $args;
}

Utilisez ensuite la méthode dépendante pour extraire les identifiants de taxonomie filtrés par l’ID utilisateur.

function get_taxonomy_ids_by_author( $user_id, $taxonomy = 'category' ){
    global $wpdb;
    return $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT(terms.term_id) as ID
        FROM $wpdb->posts as posts
        LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
        LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
        LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
        WHERE 1=1 AND (
            posts.post_status = 'publish' AND
            posts.post_author = %d AND
            tax.taxonomy = '%s' )
        ORDER BY terms.name ASC
    ", $user_id, $taxonomy ) );
}

source: https://Gist.github.com/codearachnid/9655690

3
codearachnid

Il n’existe pas de méthode intégrée pour le faire et je ne sais pas si cela a déjà été essayé. Cela étant dit, les outils sont tous là, vous devez les mettre ensemble.

Vous pouvez obtenir l'ID utilisateur actuel avec $userid = wp_get_current_user()

Vous pouvez ensuite obtenir tous les messages d'un utilisateur avec $posts = WP_Query('author='.$userid)

Parcourez ensuite toutes les publications de l'auteur et ajoutez les catégories de chaque publication dans un tableau. Par exemple,

$allCategories = Array();
foreach($posts as $post){
    array_merge($allCategories, wp_get_post_categories($post->ID))
}

Utilisez ensuite la fonction array_unique() pour supprimer les doublons.

Enfin, parcourez chaque catégorie et obtenez un lien vers la catégorie avec get_category_link()

1
evandentremont

Je n'ai pas testé cela mais vous pouvez essayer

add_action('pre_get_posts', callback);
function callback( &$query )
{
    if ( is_author() ) {
        $query->set('author', get_the_author_meta('ID') );
    }
}
0
Max