web-dev-qa-db-de.com

Benutzerdefinierte einzelne Vorlage für eine bestimmte Kategorie

Was ist der beste Weg (Performance & Code-Struktur), um eine benutzerdefinierte Vorlage für einen WordPress-Beitrag zu erstellen, der zu einer bestimmten Kategorie gehört? Ich habe festgestellt, dass Sie nicht einfach single-catname.php erstellen können.

Bisher habe ich zwei Möglichkeiten ausprobiert, um die Vorlage zu ändern. Aber welches (oder ein anderes) ist das Beste?

BEARBEITEN:

Irgendeine Idee, wie man alle Unter-/Elternkategorien usw. einbezieht? Mir ist im Moment klar geworden, dass es nur die Hauptkategorie zeigt ...

1. Zur functions.php hinzugefügt

function get_custom_cat_template($single_template) {
   global $post;
   if ( in_category( 'movies' )) {
      $single_template = dirname( __FILE__ ) . '/single-movies.php';
   }
   return $single_template;
} 
add_filter( "single_template", "get_custom_cat_template" ) ;

2. Gib den folgenden Code in single.php ein (anstatt allen anderen Codes) und erstelle einen single-template.php (mit dem Code aus der single.php) & einen custom single-movies.php

<?php        
if(has_term('movies', 'category', $post)) {      
   get_template_part('single-movies', 'movies');
} else {
   // use default template file single-template.php
   get_template_part('single-template');
}
?>
6
NewUser

Von meinem Kommentar zum OP

Meine Meinung, verwenden Sie, was Sie sich wohl fühlen. Wenn es einen Leistungsunterschied gibt, ist dieser geringfügig/irrelevant. Ich bevorzuge den Filter

Um zu Ihrem eigentlichen Anliegen/Ihrer eigentlichen Frage zu kommen, ist es meiner Meinung nach am besten, die ID der Elternkategorie zu verwenden und von dort aus zu arbeiten. Es wird am wenigsten ressourcenintensiv sein, von hier aus zu arbeiten. Reverse Engineering kann zu einer unnötigen Verschwendung von Ressourcen werden.

Verwenden Sie get_categories , um die untergeordneten Kategorien aus der angegebenen Kategorie abzurufen. Sie können einen von zwei Parametern verwenden, entweder parent oder child_of

parent (Ganzzahl)

Zeigt nur Kategorien an, die direkte Nachkommen (d. H. Nur Kinder) der durch ihre ID identifizierten Kategorie sind. Dies funktioniert NICHT wie der Parameter 'child_of'. Für diesen Parameter gibt es keine Standardeinstellung. [In 2.8.4]

child_of (Ganzzahl)

Alle Kategorien anzeigen, die Nachkommen der durch ihre ID identifizierten Kategorie sind (d. H. Kinder und Enkelkinder). Für diesen Parameter gibt es keine Standardeinstellung. Wenn der Parameter verwendet wird, wird der Parameter hide_empty auf false gesetzt.

Wenn Sie diese haben, verwenden Sie wp_list_pluck , um die Felder catID, name oder slug aus dem zurückgegebenen Array von Kategorien abzurufen. Dieses Array wird verwendet, um zu überprüfen, ob ein Beitrag zu einer dieser Kategorien gehört. Sie können entweder has_category oder in_category verwenden.

Auf diese Weise können Sie Ihren Code erweitern, um sicherzustellen, dass Posts, die entweder zur übergeordneten Kategorie oder zu deren Nachkommen gehören, die angegebene Vorlage verwenden

add_filter( 'single_template', function ( $single_template ) {

    $parent     = '21'; //Change to your category ID
    $categories = get_categories( 'child_of=' . $parent );
    $cat_names  = wp_list_pluck( $categories, 'name' );

    if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
        $single_template = dirname( __FILE__ ) . '/single-movies.php';
    }
    return $single_template;

}, PHP_INT_MAX, 2 );
6
Pieter Goosen

schritt 1: Erstelle oder kopiere content-single.php und erstelle eine neue Datei. zB: content-yourCategory.php Schritt 2: Öffne single.php und ersetze diese get_template_part('content','single'); durch den folgenden Code

    if(is_category('yourCategory')){
        get_template_part('content','yourCategory');
    }else{
        get_template_part('content','single.php');
    }

Der Parameter kann eine Kategorie-ID, ein Kategorietitel, eine Kategorie-Slug oder ein Array von IDs, Namen und Slugs sein.

3
Karun

Dies ist ein bequemer Weg, um dies zu tun. Finden Sie hier diesen Code in Ihrem function.php

// Custom single template by category
// https://halgatewood.com/wordpress-custom-single-templates-by-category

add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
  foreach( (array) get_the_category() as $cat ) 
  { 
    if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php"; 
    if($cat->parent)
    {
      $cat = get_the_category_by_ID( $cat->parent );
      if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
    }
  } 
  return $t;
}

weitere Informationen finden Sie unter https://halgatewood.com/wordpress-custom-single-templates-by-category

2
Ninda