web-dev-qa-db-fra.com

Comment créer un modèle de thème pour la taxonomie "root"

Je viens juste de parler de ce problème pour un projet qui utilise beaucoup de taxonomies et je dois lister les publications en utilisant les taxonomies elles-mêmes, pas seulement les termes.

J'ai une taxonomie appelée "Couleurs", donc les termes peuvent être "rouge", "bleu", etc. et nous pouvons voir tous les articles en utilisant les termes suivants:

site.com/colors/red
site.com/colors/blue

Je souhaite pouvoir accéder à "site.com/colors" et répertorier tous les éléments à l'aide de n'importe quel terme de la taxonomie "Couleurs".

Pour un petit projet, j'ai créé un modèle de page pour une page statique avec une requête personnalisée qui l'a fait, mais sur ce projet en cours, j'ai environ 8 taxonomies et pour créer des pages statiques pour chaque taxo, il semble que un peu boiteux.

1
Diana

Voici une alternative basée sur un fichier taxonomy.php unique.

En résumé, appelez une fonction au début de taxonomy.php. La fonction évalue l'URL de la taxonomie et identifie la taxonomie personnalisée (le cas échéant) qui s'applique. Il obtient ensuiteTOUS les termespour cette taxonomie (pas uniquement celle de l'URL), puisTOUS les postsréférencés par ces termes. À ce stade, vous ajoutez le code pour formater les publications de taxonomie personnalisées comme vous le souhaitez OR (s’il n’y en a pas), vous laissez le fichier taxonomy.php prendre en charge et formater les publications comme d’habitude. Dans mon exemple (testé), la fonction va dans functions.php mais vous pouvez la mettre dans un plugin si vous préférez.

J'ai créé deux taxonomies personnalisées (' color ' et ' location '). Pour la vente des tests, j’ai codé en dur ces thèses dans un tableau de la fonction, mais il existe de nombreuses alternatives à cette approche. Mon intention était de montrer que cela pouvait être fait par programme, sans créer les "101 fichiers de taxonomie".

J'ai créé taxonomy.php en créant un fichier vide, en l'enregistrant sous 'taxonomy.php, puis en copiant le contenu de archive.php. Lors de mon test, j’imprimais uniquement le titre des postes à terme (pour prouver que les informations sur le poste avaient été récupérées), mais vous pouvez le modifier comme vous le souhaitez.

Dans la capture d'écran, vous pouvez voir que l'URL est "location/sydney". La page de taxonomie standard affiche les deux publications "Sydney" en bas de l'écran, mais la fonction inclut une publication supplémentaire (indiquée en haut de la page) pour location = "Melbourne".

Mon tableau de taxonomies personnalisées (ma variable s'appelle $ myarrayoptions ) n'a que deux taxonomies personnalisées (les slugs sont 'color' et 'location'), mais vous pouvez le faire à votre guise. J'ai émis une hypothèse: il n'y avait qu'une taxonomie personnalisée par publication. Là encore, il existe des moyens de traiter plusieurs taxinomies par poste, mais cela suffira à des fins de démonstration.

Ceci est ma fonction dans functions.php. J'ai laissé toutes mes déclarations "echo" pour le débogage - vous pouvez les supprimer à votre guise.

/*
 * Create function to set if custom taxonomy is set
*/
function checktax(){
    global $wp;
    //echo "<p>TESTING - START</p>";

    // create a simple array showing the name of all the referenced custom taxonomies
    $myarrayoptions = array('color','location');
    //echo "the custom taxonomies are <pre>";print_r($myarrayoptions);echo "</pre>";  //DEBUG

    // get the url
    $myurl = home_url( $wp->request );
    //echo "<p>The url is ".$myurl." </p>";  //DEBUG

    // Explode the url to get access to the taxonomy and terms
    $pageterms = explode('/', $myurl);
    //echo "the exploded components of the URL <pre>";print_r($pageterms);echo "</pre>"; //DEBUG

    // check whether any custom taxonomies are included in the page url and then do stuff
    if (array_intersect($pageterms,$myarrayoptions)) {

        // find which custom taxonomy is in the url - there should only be ONE!
        $result = array_intersect($pageterms,$myarrayoptions);
        //echo "the custom taxonomy is <pre>";print_r($result);echo "</pre>"; //DEBUG

        // get the value of the custom taxonomy. this is very clumsy but it does work.
        foreach ($result as $key => $value){
        //echo "<p>the array key is ".$key." and the taxonomy is ".$value."</p>";  //DEBUG
        }
        // echo "<p>the taxonomy is ".$value."</p>"; //DEBUG

        // the term in the URL is the field after the taxonomy so we just add 1 to the key to get the term
        $urlterm = $pageterms[($key+1)];
        //echo "<p>the term in the url is ".$urlterm."</p>"; //DEBUG

        // get all the terms for this custom taxonomy
        $myterms = get_terms( array(
                'taxonomy' => $value,
                'hide_empty' => false,
        ) );    
        //echo "the terms are <pre>";print_r($myterms);echo "</pre>"; //DEBUG

        //create a simple array to store the terms for use in a query
        $termsarray = []; 
        // get the slugs only
        $termsarray = wp_list_pluck( $myterms, 'slug' );
        //echo "terms array is <pre>";print_r($termsarray);echo "</pre>"; //DEBUG

        // build a new query to get all the posts for the custom taxonomy
        // this is sortable but the OP didn't mention that
        $myargs = array(
                'post_type' => 'post',
                'posts_per_page' => -1,
                'tax_query' => array(
                        array(
                                'taxonomy' => $value,
                                'field' => 'slug',
                                'terms' => $termsarray,
                        )
                )
        );  
        $newquery = new WP_Query( $myargs );    
        //echo "newquery is <pre>";print_r($newquery);echo "</pre>";  //DEBUG

        // now we have all the posts for the custom taxonomy
        // so we can print whatever we like

        // Page Header
        echo '<h1 class="page-title">'.$value.'</h1>';

        while ( $newquery->have_posts() ) {
            $newquery->the_post();
            the_title( '<h1 class="entry-title">', '</h1>' );

        }

    }

        //echo "<br/>TESTING - END<br/>";  //DEBUG  
}

Ceci est un extrait de taxonomy.php. La fonction "checktax" fait le travail.

get_header(); ?>

<div class="wrap">

    <?php if ( have_posts() ) : ?>
        <header class="page-header"><!-- taxonomy -->
            <?php
                checktax();     

                the_archive_title( '<h1 class="page-title">', '</h1>' );
                the_archive_description( '<div class="taxonomy-description">', '</div>' );
            ?>
        </header><!-- .page-header -->
    <?php endif; ?>

Enfin, il s'agit d'un instantané d'écran.  enter image description here 

0
Tedinoz

J'ai trouvé cette solution:

  • créer des pages avec le même slug utilisé pour la taxonomie par exemple. couleurs

  • donnant le même modèle aux pages créées par exemple. template-taxonomyroot.php

  • dans le modèle formulant le WP_Query personnalisé de cette façon:

 // Récupérer le slug de la page = taxonomie du slug 
 $ Taxonomy = get_post_field ('post_name', get_post ()); 
 
 // Si le nom de la taxonomie est composée de plusieurs mots avec le trait de soulignement, 
 // remplace le tiret possible: 
 /*
 $ tricktax = substr_count ($ taxonomy, '-'); ____.] 
 if ($ astuce! == 0) {
 $ taxonomy = str_replace ('-', '_', $ taxonomy); 
} 
 */
 
 // Récupère tous les identifiants de termes dans la taxonomie 
 $ Taxonomy_terms = get_terms ($ taxonomy, array (
 'Hide_empty' => 0 .____.] 'fields' => 'ids' 
)); 
 
 // Récupère toutes les publications contenant les termes de taxonomie 
 $ args = array (
 'post_type' => tableau ('post', 'page', 'cpt'), 
 'posts_per_page' => -1, // pour afficher toutes les publications 
 'tax_query '=> array (
 array (
' taxonomy '=> $ taxonomy, 
' field '=>' id ' , 
 'termes' => $ taxonomy_terms 
) 
) 
); 
 
 $ tax_query = new WP_Query ($ args ); 
 
 if ($ tax_query-> have_posts ()): while ($ tax_query-> have_posts ()): $ tax_query-> the_post (); 
0
benny-ben