it-swarm.com.de

get_template_part für jeden Taxonomieebenenbegriff

bevor wir anfangen, danke für deine Zeit.

Structure:
cpt = corsi
tax = argomenti
tax_term = parent
tax_term_child = child
tax_term_child_granchild = grandchild

Aktueller Code (auf taxonomy-argomenti.php):

$queried_object = get_queried_object();
$cpt = get_post_type( get_the_ID() );
$taxonomy = $queried_object->taxonomy;
$term_id = $queried_object->term_id;

    $current_term = get_term_by('id', get_query_var('term'), $taxonomy);
    if((int)$current_term->parent)
        get_template_part('argomenti', 'child');
    else
        get_template_part('argomenti', 'parent');

Ich würde wählen, welche Vorlage für alle Ebenen der Taxonomie verwendet werden soll.

Beispiel:

localhost\cpt                           archive-cpt.php
localhost\cpt\parent                    argomenti-parent.php
localhost\cpt\parent\child              argomenti-child.php
localhost\cpt\parent\child1\grandchild  argomenti-grandchild.php

Ist das mit einer Funktion wie der von mir geposteten möglich?

Danke vielmals.

1
Simo

Das Erstellen und Einfügen einer Vorlage für Ihr benutzerdefiniertes Archiv für Beitragstypen ist einfach. Sie müssen lediglich eine archive-{$post_type}.php-Vorlage erstellen. Wordpress verwendet diese Vorlage automatisch, wenn Sie die Archivseite dieses bestimmten Beitragstyps besuchen. Denken Sie daran, den Parameter has_archive bei der Registrierung Ihres Beitragstyps festzulegen.

Was die Taxonomie-Archivseite angeht, sind Sie fast da. Es muss nur überprüft werden, ob ein Begriff der obersten Ebene oder ein Begriff für ein Kind oder ein Enkelkind ist. Was ich aus Ihrer Frage lesen kann, Sie haben bereits eine taxonomy-{$taxonomy}.php-Vorlage erstellt, die Sie für alle Begriffe aus der Taxonomie argomenti verwenden, unabhängig von der Hierarchie. Sie haben Schablonenteile verwendet, die Sie der Hierarchie entsprechend einfügen.

Schauen wir uns also die Logik an, die wir hier verwenden werden.

  • get_queried_object() enthält das Termobjekt des aktuell angezeigten Terms. Wir werden dies verwenden, um die Eltern- und Term-ID des Terms zu erhalten

  • Alle Begriffe der obersten Ebene haben die übergeordnete ID 0, was wichtig ist.

  • Für jeden Begriff mit einer übergeordneten ID von mehr als 0 müssen wir bestimmen, wo er in die Hierarchie passt. Dafür verwenden wir get_ancestors . Diese Funktion gibt ein Array von Term-IDs zurück. Die ID des ersten Terms ist der Begriff, der als direktes übergeordnetes Element getestet wird, und die ID des letzten Terms ist der Begriff der obersten Ebene, das übergeordnete Element. Um zu bestimmen, in welche Hierarchie ein Begriff passt, müssen wir nur die Größe des Arrays ermitteln. Ein leeres Array bedeutet übergeordnet, ein Array mit einem Schlüssel bedeutet untergeordnet und ein Array mit zwei Schlüsseln bedeutet Enkel

Wir können jetzt all diese Logik in Code umsetzen. Um eine Menge Code in Ihrer Taxonomie-Vorlage zu vermeiden, erstellen wir eine Funktion, die Sie in functions.php einfügen können, und rufen dann eine einzelne Zeile in Ihrer Taxonomie-Vorlage auf. ( HINWEIS: Der gesamte Code ist ungetestet und möglicherweise fehlerhaft. Testen Sie ihn daher unbedingt lokal, wenn das Debugging aktiviert ist Außerdem benötigen Sie PHP 5.4 + )

function get_tax_hierarchy_template_part( $template = '', $subfolder = '' )
{
    /**
     * Make sure we are actually on a taxonomy archive page, if not, return false
     * 
     * Instead of returning false here, you can also set it to return a default template
     * Check the section commented out
     */
    if ( !is_tax() )
        return false;
        // return get_template_part( 'content' ); // Return default template

    // Get the current term object
    $current_term_object = get_queried_object();

    // Check if we have a value for $subfolder, if so, sanitize it and add slashes
    if ( $subfolder )
        $subfolder = '/' . filter_var( $subfolder, FILTER_SANITIZE_STRING ) . '/';

    /**
     * Check if we have value for $template, if so, sanitize, if not, use the taxonomy name
     * Also append the $subfolder to $template
     */
    if ( $template ) {
        $template = filter_var( $template, FILTER_SANITIZE_STRING );
    } else {
        $template = $current_term_object->taxonomy;
    }
    $template = $subfolder . $template;
    // Check if current term is top level, if so, return template part for parent terms
    if ( $current_term_object->parent == 0 )
        return get_template_part( $template, 'parent');

    /**
     * If we have reached this section, it means our term is not toplevel
     * We must now determine where in the hierarchy the term is
     */
    $hierarchy = get_ancestors( $current_term_object->term_id, $current_term_object->taxonomy );

    // We must now get the size of the array
    $hierarchy_depth = count( $hierarchy );

    /**
     * We will set child when the size of the array is one. For any size more 
     * than one, we will set grandchild
     *
     * If you are going to have grand-grandchildren which should have its own
     * template, you would need to adjust this section
     */
    $part = ( $hierarchy_depth == 1 ) ? 'child' : 'grandchild';

    // Return the correct template part according to hierarchy
    return get_template_part( $template, $part );
}

Sie können es jetzt wie folgt in Ihrer Taxonomie-Vorlage aufrufen

get_tax_hierarchy_template_part();

Wenn Sie einen Fallback festgelegt haben, können Sie ihn überall verwenden

BEARBEITEN

Wie gewünscht habe ich einen Parameter in die Funktion namens $template eingefügt. Sie können jetzt den Vorlagennamen für das Vorlagenteil festlegen. Wenn dieser Parameter nicht festgelegt ist, wird der Taxonomiename verwendet.

VERWENDUNGSZWECK

Wenn Ihr Vorlagenteil den folgenden Namen hat, {$taxonomy}-parent.php, müssen Sie Ihre Funktion wie folgt aufrufen

get_tax_hierarchy_template_part();

Wenn Ihr Vorlagenteil einen anderen Namen hat, zum Beispiel content-parent.php, müssen Sie Ihre Funktion wie folgt aufrufen

get_tax_hierarchy_template_part( 'content' );

BEARBEITEN 2

Aufgrund der Bedingungen, unter denen der Taxonomiename als Standard für ein Vorlagenteil verwendet werden sollte, musste ich einen zweiten Parameter namens $subfolder einfügen, um Vorlagenteile in Unterordnern unterzubringen. Ich habe den Code entsprechend aktualisiert.

VERWENDUNGSZWECK

Sie müssen nur den Namen des Unterordners ohne Schrägstriche als zweiten Parameter übergeben. Denken Sie daran, eine leere Zeichenfolge als ersten Parameter zu übergeben, wenn Sie {$taxonomy}-parent.php als Vorlagenteil verwenden

Beispiel:

get_tax_hierarchy_template_part( '', 'subfoldername'  );

Verwenden Sie für content-parent.php Vorlagenteile

 get_tax_hierarchy_template_part( 'content', 'subfoldername' );
2
Pieter Goosen