web-dev-qa-db-fra.com

the_author_posts_link () pour les auteurs de types d'articles personnalisés

J'ai des articles de blog réguliers et un type de message personnalisé dans un blog. Le modèle de page montre le lien des publications de l'auteur. Si vous cliquez sur ce lien pour un auteur ayant écrit des articles, cette page (blog/auteurs/mr-auteur) affiche la bio information attendue et une liste des articles de l'auteur.

Toutefois, si vous créez un utilisateur qui est l'auteur, mais qui n'a créé que le type d'article personnalisé et aucun article normal, le lien généré par the_author_posts_link () (qui est toujours le lien correct: blog/authors/mr-author) affiche une page non remplie (c.-à-d. que tous les champs sont vides et que la liste des publications est la liste complète de toutes les publications pour tous les auteurs).

Clairement, nous n'obtenons pas les bonnes données dans le répertoire $ authordata global. Mais pourquoi? author.php utilise des balises de modèle standard telles que get_the_author_meta('display_name') pour afficher les informations sur l'auteur, mais toutes affichent des résultats vierges pour un auteur qui n'a pas publié.

Je suis en train de fouiller dans le noyau pour savoir où et quand $ authordata est rempli pour voir s'il est lié à un type de message spécifique, mais n'a jusqu'à présent rien produit d'utile. Quelqu'un a déjà rencontré ça?

EDIT: SOLUTION BASÉE SUR LA RÉPONSE DE CHIP

add_action('pre_get_posts', 'hdb_add_custom_type_to_query');

function hdb_add_custom_type_to_query( $notused ){
     if (! is_admin() ){
        global $wp_query;
        if ( is_author() || is_home() ){
            $wp_query->set( 'post_type',  array( 'post', CUSTOM_TYPE ) );
        }
     }
}

Supposons que vous ayez défini la constante CUSTOM_TYPE à un moment donné, probablement lorsque vous déclarez le type de publication personnalisé.

5
Tom Auger

Je crois que le problème est que la requête par défaut ne demande que post après-type. ( Voir la question WPSE liée ici. )

Vous devez donc probablement modifier la requête dans votre fichier de modèle author.php, de sorte que tous les types pertinents soient inclus dans la requête.

4
Chip Bennett

Une façon plus simple de faire cela consiste simplement à ajouter la prise en charge de l'auteur à votre type de message personnalisé lors de l'enregistrement du nouveau message.

'supports' => array(
                        'title',
                        'editor',
                        'thumbnail',
                        'post-formats',
                        'author', 
                        ),
1
c24b

Cette solution de contournement a résolu le problème pour moi, mais je me sens un peu sale. Je pense que Chip a raison sur le fait que lorsque nous peuplons les posts globals avec the_post (), il ne prend en compte que les 'posts' réels, de sorte que le $ authordata global ne soit pas peuplé (diable, RIEN ne le devient).

Bizarrement (ou pas, je suppose que si vous maîtrisez vraiment les processus internes profonds, ce que je ne connais pas encore), get_queried_object () renvoie exactement la même structure que $ authordata. Donc, l'extrait suivant, inséré dans authors.php, réalise ce que j'espérais. Évidemment, cela ne fonctionne comme prévu sur une page de modèle d'archive d'auteurs, sinon get_queried_object () retournera une autre structure.

<?php 
  the_post(); // Attempt to populate post globals (works if this author has regular posts)

  global $authordata;
  if ( !is_object( $authordata ) ) $authordata = get_queried_object(); 
?>

À mesure que j'y réfléchis davantage, il semble que la méthode par défaut permettant de renseigner les données de l'auteur présente des lacunes. Il obtient une liste des publications des auteurs et, basé sur la première publication de la liste, (re) remplit les données de l'auteur. Je ne vais pas dire que mon approche est meilleure, ni même bonne, mais j'aime bien l'idée de traiter l'objet auteur en tant qu'objet principal interrogé sur cette page, plutôt que simplement en tant que complément d'un message qui apparaît en surface. page en raison d’une relation circulaire avec le terme recherché.

1
Tom Auger

Si n'importe quel utilisateur n'a pas de message, il affiche 404 par défaut. Vous pouvez obtenir le user_id de cet utilisateur à partir de la variable $author. Ensuite, vous pouvez renseigner les messages des utilisateurs et d’autres types de contenu à votre guise.

0
Tareq

Je devais le faire récemment sur un site sans "posts", qui nécessitait encore des pages d'auteur.

En gros, vous attrapez les pages auteur au crochet template_redirect, veillez à désactiver l'indicateur 404 et à inclure le modèle d'auteur. Vous pouvez étendre la logique dans le test de redirection de modèle si nécessaire. Ce que vous faites ensuite dans le modèle author.php est à vous.

/* Force author views to use author.php, rather than default to 404 pages 
    if there are no posts to show. */
add_action( 'template_redirect', 'author_page_template' );

function author_page_template() {

    // Note: you probably also want to check if the author exists...
    if ( is_author() ) {
        global $wp_query;
        $wp_query->set( 'is_404', false );
        include( get_stylesheet_directory().'/author.php' );
        exit;
    }

}
0
goldenapples