J'essaie de créer un modèle d'archive qui s'appliquera uniquement aux sous-catégories d'un terme particulier. Ma structure ressemble à ceci:
Je veux que Show subcat 1
et Show subcat 2
(et toutes les autres sous-catégories) obtiennent le même modèle d'archive. C’est l’une de mes tentatives, qui ne fonctionne vraiment pas. Voici le code de mon functions.php
.
add_filter( 'template_include', 'kd_event_subcategory_archive' );
function kd_event_subcategory_archive( $template ) {
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
$event_subcat = locate_template( 'taxonomy-tradeshow-subcategory.php' );
return $event_subcat;
}
return $template;
}
Je n'arrive pas à comprendre comment vérifier correctement si un terme est l'enfant de mon terme tradeshow
.
Deux problèmes ont contrarié votre chèque:
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
Commençant par:
$term = get_queried_object()->term_id;
Ici, $term
contient l'ID d'un terme, pas un objet de terme. Supposons que c'est le terme numéro 5, le résultat est:
$term = 5;
if ( $term->parent == 'tradeshow' ) {
Ce qui ne fonctionnera pas. $term
est un nombre, pas un objet, vous ne pouvez donc pas ->parent
dessus.
Le correctif consiste simplement à utiliser directement l'objet interrogé:
$term = get_queried_object();
Ce qui nous amène au prochain problème:
if ( $term->parent == 'tradeshow' ) {
Le parent n'est pas une chaîne, c'est un identifiant de terme. 0
s'il n'y a pas de parent, sinon c'est l'ID du terme parent, comme indiqué si on cherche WP_Term
:
/**
* ID of a term's parent term.
*
* @since 4.4.0
* @var int
*/
public $parent = 0;
Il est donc nécessaire d’acquérir le terme du salon à l’avance pour connaître son identifiant. Habituellement, pour ces scénarios, les développeurs ne codent pas le slug en dur, mais fournissent plutôt un paramètre répertoriant les termes, et stockent l'ID en tant qu'option pour éviter ce type de recherche et augmenter la flexibilité.
Mais dans ce cas, vous pouvez utiliser la fonction get_term_by
, par exemple.
$tradeshow = get_term_by('slug', 'tradeshow', 'events')
Puis en utilisant:
$tradeshow->term_id === $term->parent
Ce sont des éléments supplémentaires que je voulais mentionner qui ne sont pas liés
Utiliser var_dump
, un débogueur ou un autre outil pour voir ce que le contenu de $term
aurait révélé ces problèmes.
De plus, les journaux d'erreur PHP seront pleins d'avertissements et de notifications pointant sur l'instruction if pour avoir tenté de faire l'équivalent de 5->parent
, ce qui n'a aucun sens pour PHP. Faites attention aux journaux d'erreurs. Je vous recommande d'utiliser le plug-in de moniteur de requête comme moyen facile d'attraper des avertissements inattendus.
Ce code sera exécuté à chaque chargement de page:
add_filter( 'template_include', 'kd_event_subcategory_archive' );
function kd_event_subcategory_archive( $template ) {
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
Mais que se passe-t-il si l'utilisateur visite une archive de date ou une archive d'auteur? Maintenant, le code fonctionne quand même, générant des erreurs. Ce filtre nécessite donc des tests pour vérifier si l'utilisateur se trouve dans une archive de taxonomie et si la taxonomie correspond.
Il peut même s'agir d'une publication singulière et si le terme du salon a un identifiant de 5, et que vous êtes sur l'article ou la page portant l'ID 5, vous obtiendrez une publication sur une archive de taxonomie.
Je suppose cependant qu’il serait plus facile d’utiliser une taxonomie distincte.
https://codex.wordpress.org/Function_Reference/get_queried_object
- si vous êtes sur un seul post, il retournera l'objet post
- si vous êtes sur une page, il retournera l'objet page
- si vous êtes sur une page d'archive, il retournera l'objet de type post
- si vous êtes sur une archive de catégorie, il retournera l'objet category
- si vous êtes sur une archive d'auteur, il retournera l'objet author
- etc.