web-dev-qa-db-fra.com

Modèle de catégorie pour afficher différentes catégories en fonction du parent

Ok, j'ai des catégories comme celle-là.

Products
   Category A
       Sub Category 1
       Sub Category 2
   Category B
   Category C

Ce dont j'ai besoin, c’est d’avoir la page des catégories de produits indiquant les principales catégories (A, B, C).

Les pages principales de catégorie (A, B, C) indiquant leurs sous-catégories (1, 2).

Ensuite, les sous-catégories (1,2) affichant mon type de message personnalisé, c’est-à-dire les produits réels.

Je souhaite éviter d'utiliser un modèle category-slug.php car, lorsque quelqu'un ajoute une nouvelle catégorie, je souhaite qu'il s'affiche automatiquement sur la bonne page, en fonction du nom du parent.

J'ai pensé à utiliser un modèle category.php mais je ne sais pas si cela est possible à partir d'un modèle ou du code dont j'ai besoin.

Les pages de première catégorie (Produits) afficheront uniquement les catégories principales (A, B, C). Il ne montrera pas de messages, mais simplement une liste de liens de catégories dans la section principale. Donc, je peux leur donner un style qui ressemble à de gros boutons sur la page. Il en ira de même pour les catégories A, B et C. Afficher les sous catégories.

La dernière page de catégorie (sous-catégorie 1, 2) affichera mon type de publication personnalisé (les produits réels) dans une sorte de liste. Cette page ne montrera aucune autre catégorie que les produits dans la section principale.

Toute aide sur la façon dont je peux y parvenir serait appréciée.

Merci

MISE À JOUR: J'ai réussi à obtenir le modèle de catégorie pour afficher les bonnes catégories. Il semble fonctionner mais je ne l'ai pas encore testé correctement.

Le problème que j'ai maintenant est d'afficher mes types d'articles personnalisés dans les catégories de niveau les plus profonds. Donc, il montrera des choses comme le titre de type d'article personnalisé, la vignette, peut-être un extrait.

Voici le code que j'utilise.

<?php // list child categories
$cat_id = get_query_var('cat');

$catlist = wp_list_categories('depth=1&hide_empty=0&echo=0&orderby=id&title_li=&child_of=' . $cat_id);

if ($catlist) {
echo $catlist;
} else {
echo "Please don't print No categories";
} ?>

Actuellement sur la page de catégorie de niveau le plus profond, il affiche simplement "Pas de catégorie". Je dois obtenir cette page affichant mes types de publication personnalisés appartenant à cette catégorie.

1
Corbula

Après avoir cherché quelque temps sur Internet, je l’ai enfin fait fonctionner.

Cela va dans le functions.php

function category_has_children() {
global $wpdb;
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = '$term->term_id' ");
     if ($category_children_check) {
          return true;
     } else {
          return false;
     }
}

Cela va dans le template category.php

<?php

if (!category_has_children()) {?>
<?php foreach(get_the_category() as $category) {
$cat = $category->cat_ID; }?>
<?php query_posts('post_type=Product&cat=' .$cat .'&order=ASC'); ?>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
                    <?php endwhile;?>
        <?php endif; ?> 
<?php get_template_part('loop', 'index');
} else {?>

<?php 
$cat_id = get_query_var('cat');
$catlist = get_categories('child_of=' . $cat_id);
if ($catlist) {
wp_list_categories('depth=1&hide_empty=0&echo=1&orderby=id&title_li=&child_of=' . $cat_id);
} 
}
?>

Ce code affichera des sous-catégories si une catégorie en a une, si elle n'a pas de sous-catégorie, elle affichera un post pour cette catégorie, dans mon cas, les produits. Si une catégorie n'a pas de sous-catégorie et n'a pas de messages, elle ne s'affichera pas.

0
Corbula

J'ai réussi à faire quelque chose comme vous le décrivez, mais pour une taxonomie personnalisée .. avec un petit bout de code supplémentaire. Nul doute qu’il existe un moyen bien meilleur d’écrire le code et qu’il existe probablement un moyen beaucoup plus efficace de le faire.

Mais cela a fonctionné et travaille sur un site Web actif. Je vais décrire ce que j'ai fait et vous pouvez modifier le code pour vos propres besoins:

Mon problème: Comme vous, je voulais une page universelle qui indiquerait le terme de taxonomie que je lui aurais envoyé, au lieu de devoir créer un fichier taxonomy-slug.php pour chaque nouveau terme. dans ma taxonomie. Pour clarifier: mon type de publication personnalisé est Vidéos et ma taxonomie personnalisée est Types de vidéo.

Ma solution J'ai réussi à extraire le terme de taxonomie de la liste de cette taxonomie (à saisir lorsque quelqu'un clique sur ce terme), puis à l'envoyer à une page d'archive pour ce type de publication personnalisé particulier. . Il lit ce terme et montre simplement le type de message en utilisant ce terme taxo0nmy

Mon code Trouvé quelque part sur le Web. Il est collé dans le fichier de fonctions:

/*add a filter to pass queries to pages
can be sent like so: <?= add_query_arg('t', 'argument', home_url( '/videos/' )); ?>
can be called like so:  $qvar = get_query_var('t');
*/
add_filter('query_vars', 'p_query');

    function p_query($qvars) {
        $qvars[] = 't';
        return $qvars;
    }

Sur la page d'accueil, j'énumère tous les différents "types de vidéo" sous forme de liens cliquables en utilisant une requête wp pour afficher le dernier message pour chacun des différents termes de la taxonomie.

La requête

$term_args=array(
    'orderby' => 'menu_order',
    'order' => 'DESC'
);
$terms = get_terms($taxonomy,$term_args);
if ($terms) {
  foreach( $terms as $term ) {
    $args=array(
      'post_type' => 'videos',
      'video_types' =>  $term->name ,
      'post_status' => 'publish',
      'posts_per_page' => 1,
      'caller_get_posts'=> 1
      );
    $my_query = null;
    $my_query = new WP_Query($args); 
    if( $my_query->have_posts() ) {  ?>
       <div class="thumb">
        <h3 class="darken"><?php echo $term->name;?></h3>

        <?php
      while ($my_query->have_posts()) : $my_query->the_post(); ?>

Les liens Je transforme ensuite chaque terme de la boucle en lien de la manière suivante:

<a href="<?= add_query_arg('t', strtolower($term->name), home_url( '/videos/' )); ?>">
 <h3><?php echo $term->name;?></h3>
</a>

qui envoie ensuite le nom de ce terme avec l’URL de la page archives-video.php. Le lien finit par ressembler à ceci:

http: // thedomainname/videos /? t = theterm

Et puis le code sur la page archives-videos.php ressemble à ceci:

La page des archives

<?php 

    $taxonomy = 'video_types';
    $qvar = get_query_var('t');
    $orderby      = 'name';
    $show_count   = 0;      // 1 for yes, 0 for no
    $pad_counts   = 0;      // 1 for yes, 0 for no
    $hierarchical = 1;      // 1 for yes, 0 for no
    $title        = '';
    $empty        = 0;

    $term = get_term_by('name', $qvar, $taxonomy);

  $args=array(  
    'taxonomy'     => $taxonomy, 
    'video_types'  => $qvar,
    'orderby'      => $orderby,
    'show_count'   => $show_count,
    'pad_counts'   => $pad_counts,
    'hierarchical' => $hierarchical,
    'title_li'     => $title,
    'hide_empty'   => $empty,
    'posts_per_page' => 8,
    );

        query_posts( $args); ?>




       <div class="vdescription">
        <h3 class="pagetitle"><?php echo $term->name;?></h3>

        <?php
            $termDiscription = $term->description;
                if($termDiscription != '') : ?>
                    <p><?php echo $termDiscription; ?></p>
                <?php endif; ?>
        </div>  <!--.vdescription -->

et ci-dessous, je peux énumérer toutes les vidéos de ce terme de taxonomie particulier:

<?php while (have_posts()) : the_post(); ?>

    <?php the_post_thumbnail(); ?>

<?php endwhile;?>

Cela me donne donc une page universelle qui montrera le type de vidéo que je lui envoie, ce qui permet au propriétaire du site Web de créer le nouveau type de vidéo souhaité, qui s'affichera automatiquement sur la page d'accueil sous forme de lien.

Encore une fois, je pense que quelqu'un avec une meilleure connaissance pratique de PHP pourrait l'écrire d'une meilleure façon (ce que j'aimerais voir), mais l'idée est là et fonctionne.

0
endle.winters