Welchen Unterschied macht es, wenn ich index.php als HTML-Drahtmodell verwende und jede Hauptvorlagendatei als vollständiges HTML-Dokument schreibe?

7

Angenommen, eine Website, auf der die Elemente für Seitenkopf und Fußzeile in jeder Ansicht konstant bleiben: Aufgrund des Vorlagenhierarchiesystems von WP konnte ich das allgemeine Website-Layout in index.php fest codieren. Dann könnte ich bedingte Tags in index.php verwenden, um zu bestimmen, welche inneren Inhaltsvorlagen gerendert werden sollen.

Andererseits konnte ich das Grundlayout in jeder der Hauptvorlagen wiederholt schreiben. Daher würde ich mehr Codezeilen schreiben und etwas mehr Redundanz einführen. Vielleicht speichere ich jedoch einige Datei-E / A-Operationen, wenn beispielsweise single.php vollständig gerendert werden kann, ohne auf index.php zurückgreifen zu müssen?

Option 1 ohne single.php, category.php, archive.php usw., aber mit content-post.php, content-category.php ...

<?php
/**
 * The index.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  if (is_front_page()){
    ... // some front page specific markup and settings
  }
  elseif(is_category()){
    ... // some category specific markup and settings
  }
  elseif (is_singular()) {
    ... // some singular post specific markup and settings
  }
  elseif (is_archive()) {
    ... // some general archive specific markup and settings
  }
  else{
    ... // defaults
  }
  while (have_posts()) : 
    the_post();
    get_template_part( 'content', get_post_format());
  endwhile;
endif;
get_footer();
?>

Option 2 : Jede Hauptvorlagendatei enthält wie folgt das gesamte Los

<?php
/**
 * The single.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // single post markup
  endwhile;
endif;
get_footer();
?>

Und noch eine Hauptvorlagendatei

<?php
/**
 * The category.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // category archive markup
  endwhile;
endif;
get_footer();
?>

Gibt es also Leistungsprobleme bei beiden Optionen? Ist es nur eine Frage des individuellen Geschmacks?

Bunjip
quelle

Antworten:

5

Option 2 ist die beste Option. Um zu wissen warum, muss man sich den Template Loader ansehen .

( Die Vorlagenhierarchie bedeutet nichts, wenn Sie nicht wissen, wie es wirklich funktioniert oder woher es kommt. )

    if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) :
59          $template = false;
60          if     ( is_404()            && $template = get_404_template()            ) :
61          elseif ( is_search()         && $template = get_search_template()         ) :
62          elseif ( is_front_page()     && $template = get_front_page_template()     ) :
63          elseif ( is_home()           && $template = get_home_template()           ) :
64          elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
65          elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
66          elseif ( is_attachment()     && $template = get_attachment_template()     ) :
67                  remove_filter('the_content', 'prepend_attachment');
68          elseif ( is_single()         && $template = get_single_template()         ) :
69          elseif ( is_page()           && $template = get_page_template()           ) :
70          elseif ( is_singular()       && $template = get_singular_template()       ) :
71          elseif ( is_category()       && $template = get_category_template()       ) :
72          elseif ( is_tag()            && $template = get_tag_template()            ) :
73          elseif ( is_author()         && $template = get_author_template()         ) :
74          elseif ( is_date()           && $template = get_date_template()           ) :
75          elseif ( is_archive()        && $template = get_archive_template()        ) :
76          elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
77          elseif ( is_paged()          && $template = get_paged_template()          ) :
78          else :
79                  $template = get_index_template();
80          endif;

Dieser Template Loader wird unabhängig vom Laden jeder Seite im Frontend ausgeführt. Wie Sie sehen können, geht WordPress eine Liste durch und überprüft die Bedingungen anhand der angeforderten Seite. Verwenden wir als Beispiel eine Kategorieseite, wobei die Kategorie die Kategorie " Nicht kategorisiert" ist.

Eine if / else-Anweisung führt die erste Bedingung aus, die true zurückgibt, und auf Kategorieseiten ist dies die is_category()bedingte Anweisung. Diese Anweisung führt die Anweisung aus get_category_template()und bewertet sie auch. Wenn diese Anweisung auch true klingt ( eine gültige Kategorieseite ist verfügbar ), wird die Vorlage entsprechend dem gefundenen Wert geladen. Wenn diese Anweisung false zurückgibt, sucht der Template Loader weiter nach der nächsten true-Anweisung, die ich etwas später behandeln werde .

Was drinnen passiert, get_category_template()ist wichtig. Die Funktion erstellt drei Vorlagennamen entsprechend der angeforderten Kategorieseite. Als Beispiel wird die folgende in der Reihenfolge erstellt category-uncategorized.php, category-1.phpund category.php. Diese Vorlagennamen werden in einem Array gespeichert und an übergeben get_query_template(). Dies ist die Funktion, die die Aufgabe hat, nach den übergebenen Vorlagennamen zu suchen und die erste vorhandene und verfügbare Vorlage zurückzugeben. Dies ist erledigt mit locate_template().

Das heißt also, WordPress ( eigentlich, locate_template()wenn Sie technisch werden möchten ) beginnt mit der Suche nach category-uncategorized.php, wenn es gefunden wird, wird die Vorlage zurückgegeben und geladen. Wenn nicht gefunden, fährt WordPress mit Versuchen fort category-1.phpund wenn dies fehlschlägt, versucht es zuletzt category.php. Wenn keine gefunden werden, wie gesagt, unsere

elseif ( is_category()       && $template = get_category_template()  

Bedingung gibt false zurück und die Bedingungen weiter unten werden ausgewertet. Die nächste Bedingung, die wahr klingelt, ist is_archive()( denken Sie daran, dass is_archive()true für Kategorie-, Tag-, Taxonomie-, benutzerdefinierte Post-Typ-Archive, autor- und datumsbezogene Seiten zurückgegeben wird ). Der gleiche Vorgang wie oben geschieht, diesmal jedoch mit archive.phpdem Suchen und Laden, falls vorhanden. Wenn archive.phpnicht vorhanden ist , bewertet die gesamte bedingte Anweisungen , um es den Standard welche Lasten index.phpdurch get_index_template(). Dies ist der ultimative Fallback für jede Seite

SCHLUSSFOLGERUNG UND ENDGÜLTIGE ANTWORT

Auch wenn Sie vielleicht denken, dass category.phpdies zu einem hohen Overhead führen wird, ist dies nicht der Fall. Durch die Zeit , die index.phpauf Ihrer Kategorie Seite geladen wird, ( kann unser Beispiel wieder verwenden ) für die noch nicht zugeordnet Kategorie hat Wordpress schon geschaut und versucht zu laden category-uncategorized.php, category-1.php, category.phpund archive.php. Machen Sie also weiter und haben Sie Ihre schönen Vorlagen ( alle Vorlagen außerindex.php ) ( das ist Ihre OPTION 2 ). 10 schöne Vorlagen zu haben ist besser als eine, index.phpdie so lang wie der Nil ist und mehr Logik enthält als das, was Albert Einstein in seinem Gehirn hatte ( was Ihre OPTION 1 ist ).

Wenn Sie zu Option 1 zurückkehren , ist es auch sehr wichtig, dass Sie die Vorlagen so kurz wie möglich, wartbar und lesbar halten. Es nützt wirklich nichts, eine Vorlage zu haben, die 0,0000001 Sekunden schneller sein kann, aber es ist ein totales Durcheinander und ein wahrer Albtraum, den man pflegen muss.

Am Ende hat Option 2 viel mehr Profis als Option 1.

Pieter Goosen
quelle
Wenn ich jemals ein reines zu schaffen haben index.phpThema, dann wird es verlockend sein , es zu nennen nilestein;-)
birgire
@ Birgire Hahaha, das wäre der richtige Name für ein solches Thema
Pieter Goosen
Noch einmal, Pieter, Sie haben mich davor bewahrt, wegen dieser Angelegenheit graue Haare zu bekommen. Ich schätze Ihre Hilfe und Ihr Fachwissen sehr. Das gilt auch für alle anderen! Vielen Dank.
Bunjip
Ich freue mich, dass Sie dies nützlich fanden. Viel Spaß ;-)
Pieter Goosen
3

Speichern von Datei-E / A-Vorgängen .
Sie können auf dieser Ebene so viel wie möglich sparen, wenn Sie möchten, aber am Ende hängt alles von Ihrer Codierungs- / Serverkonfiguration ab und so weiter.
Die statischen / dynamischen Dateien können / würden / sollten auch zwischengespeichert werden (möglich auf Serverebene oder per Plugin / eigenem Code). Dies hilft Ihnen auch dabei, sich weniger Sorgen zu machen, wenn es um kleinere Dinge wie Dateien geht, die mit Code voll sind, oder um die Menge von Vorlagen.

Vorlagenreduzierung Bei
Ihrem Ansatz, die Verwendung von Vorlagen zu reduzieren, ist es nicht immer "weniger ist mehr".
Hier noch ein Beispiel (auch von ialocin erwähnt):
Verwenden Sie eine Standardschleife (für front-page.php/index.php/page.php/single.phpund andere Vorlagen natürlich)

<?php
if ( have_posts() ) : 

    // Start the Loop.
    while ( have_posts() ) : the_post();

    // Include format-specific template for the content.
    get_template_part( 'content', get_post_format() );

    // End the loop.
    endwhile;
else :
    // If no content, include the "No posts found" template part.
    get_template_part( 'content', 'none' );

endif;
?>

Und verwenden Sie dieses Beispiel für content.php(das sich im Themenordner befinden sollte)

 <?php
 if ( is_front_page() ) { get_template_part( 'include/content', 'front' ); }
 if ( is_single() ) { get_template_part( 'include/content', 'single' ); }
 if ( is_page() ) { get_template_part( 'include/content', 'page' ); }
// and so on
?>

Und (im Include-Ordner) können Sie Dateien wie content-front.php / content-single.phpund so weiter verwenden.

Diese template_parts(die in den loop, wie in den oben genannten Dateien erwähnt, enthalten sein werden) enthalten den Code, den Sie für diese Vorlagendateien haben möchten.

Als Referenz:

Die Schleife
Template-Hierarchie
Get Template Part
Organisieren von Themendateien
Seitenvorlagen


Dieser Ansatz scheint für eine Site weniger empfindlich zu sein, wenn nur ein kleiner Fehler gemacht wird. Weil ppl hauptsächlich in den Vorlagenteilen (in diesem Unterordner) funktioniert. Natürlich hängt alles von der Art des Fehlers ab, aber ich denke, Sie wissen, was gemeint ist.

Imho ist es auf diese Weise auch schneller / einfacher, Fehler auszulösen und ein wenig einfacher zu referenzieren.

Charles
quelle
2

Kurz und schmerzlos würde ich empfehlen, Option 2 zu wählen.

Warum? Denn dafür ist die WordPress- Vorlagenhierarchie da. Ich kann aus Ihrer Frage keinen Grund erkennen, sich vom Konzept der Vorlagenhierarchie zu unterscheiden.

Last but not least kann es in einigen Projekten sinnvoll sein, darüber nachzudenken, sogar den Schleifenteil der Vorlagendateien über zu erhalten get_template_part().

Nicolai
quelle