web-dev-qa-db-fra.com

Filtrer les publications par termes de taxonomie personnalisés

J'essaie de filtrer les publications par auteur. Le 'post_author' est une taxonomie personnalisée et je l'ai incluse dans mes arguments et les messages s'affichent avec les noms d'auteur liés, mais lorsque je clique sur le lien du nom de l'auteur, tous les auteurs sont affichés. Comment puis-je afficher uniquement l'auteur sur lequel vous avez cliqué? J'ai inclus les morceaux de code pertinents:

//ADD THE TAXONOMY 'post_authors' TO MY CUSTOM POST TYPE
function add_custom_taxonomies() {
   register_taxonomy('post_authors', 'my-post-type', array(
   'hierarchical' => true,
   'labels' => array(
   'name' => _x( 'Authors', 'taxonomy general name' ),
   'singular_name' => _x( 'Author', 'taxonomy singular name' ),
   'search_items' =>  __( 'Search Authors' ),
   'all_items' => __( 'All Authors' ),
   'parent_item' => __( 'Parent Author' ),
   'parent_item_colon' => __( 'Parent Author:' ),
   'edit_item' => __( 'Edit Author' ),
   'update_item' => __( 'Update Author' ),
   'add_new_item' => __( 'Add New Author' ),
   'new_item_name' => __( 'New Author Name' ),
   'menu_name' => __( 'Authors' ),
   ),
   // Control the slugs used for this taxonomy
   'rewrite' => array(
   'slug' => 'post-authors', // This controls the base slug that will display before each term
   'with_front' => false, // Don't display the category base before "/authors/"
   'hierarchical' => true // This will allow URL's like "/authors/lorem/ipsum/"
 ),
));
}
add_action( 'init', 'add_custom_taxonomies', 0 );


// and in my archive page......

//ARGS
$args = array( 
    'post_type' => 'my-post-type',
    'order' => 'DESC',
    'tax_query' => array(
        array(
            'taxonomy' => 'post_authors',
            'field'    => 'slug',
            'terms'    => 'Jill Jones',
        ),
    ),
);



//RETRIEVES AUTHOR NAME FROM CUSTOM TAXONOMY
$terms = get_the_terms( $post->ID, 'post_authors' );

if ($terms) {
    $terms_name = array();
    foreach ( $terms as $term ) {
    // The $term is an object, so we don't need to specify the $taxonomy.
    $term_link = get_term_link( $term );
    $terms_name[] = $term->name;
    // If there was an error, continue to the next term.
    if ( is_wp_error( $term_link ) ) {
      continue;
    }
}
$author_name = $terms_name[0]; 
}



//RETRIEVING THE AUTHOR NAME IN LOOP
if ( $post_typed == ('my-post-type') && $author_name  != '' )  {  echo '<a href="' . esc_url( $term_link ) . '    ">' . $author_name . '</a>'; } 
1
amespower

Ceci est attendu à partir de ce que vous avez dans votre code. Ne changez jamais la requête principale d'une requête personnalisée sur une page d'archive ou sur la page d'accueil. Les requêtes personnalisées sont toujours gênantes car la requête principale est assez spécifique sur ces pages.

Je vous conseillerais plutôt d’utiliser pre_get_posts pour modifier la requête principale sur la page d’archive ou la page d’accueil spécifique que vous souhaitez cibler, et de laisser la boucle par défaut en place.

En outre, votre requête fiscale est complètement fausse. Ce devrait être un tableau d'un tableau. Regardez s'il vous plaît construire une requête de taxe dans WP_Query

Pour plus de lecture et une meilleure compréhension, veuillez consulter ma réponse je l’ai fait récemment sur un type de question similaire

Exemple de code (place dans functions.php et retour à la boucle par défaut dans taxonomy.php):

function custom_author_page( $query ) {
    if ( !is_admin() && $query->is_tax( 'post_authors' ) && $query->is_main_query() ) {

        $query->set( 'post_type', 'my-post-type' );
        $query->set( 'order', 'DESC' );

    }
}
add_action( 'pre_get_posts', 'custom_author_page' );

EDIT

À partir de vos commentaires, vous avez nommé votre modèle de taxonomie taxonomy-post-author.php qui concerne la taxonomie post et le terme author. Renommez votre modèle de taxonomie en taxonomy-post_authors.php

EDIT 2

OPTION 1

Changez votre page de taxonomie sur la boucle par défaut, pas de boucle personnalisée.

<?php 
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post(); 
        //
        // Post Content here
        //
    } // end while
} // end if
?>

Modifiez la requête principale avec pre_get_posts comme ci-dessus. C'est la méthode correcte

OPTION 2

Récupère le terme recherché en utilisant get_queried_object('term');, et renvoie le slug du terme. PS! ce code doit être utilisé dans les pages de taxonomie

$queried_object = get_queried_object('term');
$term_slug = $queried_object->slug;

Renvoyez $term_slug dans votre tax_query sous la forme terms

EDIT 3

Pour obtenir un tableau de noms de termes/slugs/ID d'une taxonomie spécifique, utilisez get_terms() .

$terms = get_terms('post_authors');

$term_names = array();

if ( !empty( $terms ) && !is_wp_error( $terms ) ) { 

    foreach ( $terms as $key=>$term){
        $term_names[$key] = $term->name;
    }
}

Vous pouvez alors simplement passer $term_names à terms,

'terms'    => $term_names

EDIT 4

Utilisation

<pre><?php var_dump($term_names); ?></pre>

pour imprimer le tableau. La sortie ressemblera à ceci

array(6) {
  [0]=>
  string(12) "Admin se pen"
  [1]=>
  string(11) "Besprekings"
  [5]=>
  string(12) "Toets Parent"
  [6]=>
  string(15) "Uit die grapkas"
  [7]=>
  string(14) "Uit die koskas"
  [8]=>
  string(11) "Uit my lewe"
}
2
Pieter Goosen