Modelos de taxonomia ... por nível hierárquico?

3

Gostaria de saber se existe uma maneira de especificar por nome de arquivo modelos diferentes para níveis dentro de uma taxonomia hierárquica. Eu sei sobre os modelos taxonomy-taxonomyname.php e taxonomy-taxonomyname-term.php .

Então, com uma taxonomia como earth eu posso ter:

  • África
    • Camarões
    • Congo
    • Senegal
  • Ásia
    • Japão
    • Coréia
  • Europa
    • Grécia
    • ...
  • América do Sul
  • ...

Existe uma maneira de ter um modelo diferente para a África, Ásia, Europa e América do Sul ... e outro modelo para Camarões, Congo, Japão, Grécia ...?

Examinando alguns documentos de hierarquia de modelos diferentes, acredito que não. Se isso for verdade, qual é a melhor / mais eficiente maneira de diferenciar os níveis de taxonomia em taxonomy-earth.php para que eu possa usar diferentes partes de modelo para cada uma delas?

    
por Will 23.11.2015 / 05:06

2 respostas

4

A resposta de Pieter Goosen, mas desta vez eu quero ser a pessoa que defende a maneira "simples".

No seu modelo taxonomy-earth.php , você pode verificar se o termo consultado é pai e, em caso afirmativo, exigir outro modelo.

Se você fizer essa pergunta, eu acho que você já tem (ou deseja criar) dois modelos, vamos chamá-los:

  • taxonomy-earth-continent.php
  • taxonomy-earth-country.php

No seu arquivo taxonomy-earth.php , você pode:

<?php
$slug = 'taxonomy-earth';
// default to continent
$name = 'continent';

// maybe set specific template to "country" if queried term has a parent
$term = get_queried_object();
if ( is_object( $term ) && ! empty( $term->parent ) )
    $name = 'country';

get_template_part( $slug, $name );

Essas 6 linhas de código de modelo serão suficientes para exigir um modelo diferente para termos "filho".

Graças ao uso de get_template_part , o código do modelo também é compatível com temas infantis e aciona um gancho: get_template_part_taxonomy-earth que pode ser usado para fazer coisas quando o modelo é requeridos.

    
por gmazzap 23.11.2015 / 16:31
4

Você tem algumas opções aqui:

taxonomy-{$taxonomy}-{$term->parent}-{$term}.php

Podemos criar nossa própria hierarquia ( ou, na verdade, amplia a hierarquia existente ) criando nosso próprio modelo taxonomy-{$taxonomy}-{$term->parent}-{$term}.php para uso quando um termo filho estiver sendo visualizado. Também usaremos o filtro taxonomy_template para adicionar nossos novos modelos de taxonomia à hierarquia, para que eles sejam usados.

Você pode tentar algo como o seguinte: ( OBSERVAÇÃO: Todo o código não foi testado e todo o código foi comentado para fácil compreensão e compreensão. O código também pressupõe que o nível superior termos já têm um modelo taxonomy-{$taxonomy}-{$term}.php .)

add_filter( 'taxonomy_template', function ( $template )
{
    // Get the current term object being viewed
    $current_term = get_queried_object();

    // We can restrict this to a single taxonomy, for example
    // if ( $current_term->taxonomy !== 'my_taxonomy' )
        // return $template;

    /**
     * Check if current term is top level, if so, return the default $template which
     * should be template taxonomy-{$taxonomy}-{$term}.php if found
     */
    if ( $current_term->parent == 0 ) // Top level terms have parent of 0
        return $template;

    // We made it to here, so the term is not top level

    // We need to get the top level term of the current term
    $hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
    // The parent ID will always be the last ID in the array returned by get_ancestors
    $parent_ID = end( $hierarchy );
    // Now we can get the top level term object
    $top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );

    /** 
     * Lets build our custom template name, add subfolder name if template
     * is in a subfolder, for example /subfolder/name-of-template.php
     */
    $custom_template = 'taxonomy-{$current_term->taxonomy}-{$top_level_term->slug}-{$current_term->slug}.php';
    // Check if our custom template exist, if not, return default $template
    $locate_template = locate_template( $custom_template );
    if ( !$locate_template )
        return $template;

    // Finally, everything checked out, return our custom template
    return $template = $locate_template;
}); 

Você pode ajustar o código conforme necessário

Peças de modelo personalizadas

Você pode criar seu modelo taxonomy-{$taxonomy}-{$term}.php e fazer uso de partes do modelo dentro de seu loop para incluir partes de modelo de acordo com o termo filho. O melhor aqui será escrever uma função personalizada e chamar essa função dentro do loop ( ou onde quer que você precise ) em vez de get_template_part()

Para que isso funcione, precisamos chamar nossa parte de modelo da seguinte forma:

  • os termos de nível superior serão {$ term} .php, como africa.php

  • termos filhos serão {$term->parent}-{$term}.php como africa-cameroon.php

  • modelo padrão / de fallback como content.php . Lembre-se de não passar a parte .php do nome do modelo para a função

Aqui está o código

/** 
 * Function to set template parts according to child term
 *
 * @param (string) $default Default template part to use like content.php
 * @return $template
 */
function get_custom_template_part( $default = '' )
{
    // Check if we have a value for $default, if not, return false
    if ( !$default )
        return false;

    // Sanitize the $default value
    $default = filter_var( $default, FILTER_SANITIZE_STRING );

    // Check if we are on a taxonomy page, if not, return the $default template
    if ( !is_tax() )
        return get_template_part( $default );

    // Get the current term being viewed
    $current_term = get_queried_object();

    /**
     * Set our custom variables
     * $top_level_term will hold the top level term object
     * $part will hold the current term slug if the current term is not top level
     */
    $top_level_term = '';
    $part = '';

    // Check if current term is top level, if not, get the top level parent
    if ( $current_term->parent != 0 ) {
        // We need to get the top level term of the current term
        $hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
        // The parent ID will always be the last ID in the array returned by get_ancestors
        $parent_ID = end( $hierarchy );
        // Now we can get the top level term object
        $top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );
        $part = $current_term->slug;
    }

    // We now will set our template's name accordingly
    if ( $top_level_term ) {
        $name = $top_level_term->slug;
    } else {
        $name = $current_term->slug;
    }

    // We will now check if our template parts exist, if not, return our default
    if ( $part ) { // This means we have a child term
        $template = get_template_part( $name, $part );
    } else { // This means top level term
        $template = get_template_part( $name );
    }

    if ( $template )
        return $template;

    return get_template_part( $default );
}

Você pode estender isso conforme necessário, e também pode adicionar suas partes de modelo em uma subpasta e, em seguida, apenas acrescentar o nome da subpasta ao valor de $name dentro da função

Agora você pode usar a função da seguinte maneira no seu taxonomy-{$taxonomy}-{$term}.php ou taxonomy-{$taxonomy}.php template

Modelo padrão: content.php

get_custom_template_part( 'content' );
    
por Pieter Goosen 23.11.2015 / 08:46