WordPress-Vorlagendateien in Unterverzeichnissen

Lesezeit: 10 Minuten

Benutzer-Avatar
Todessturm

Vor einiger Zeit habe ich ein neues WordPress-Projekt gestartet. Aber ich bin in ein Problem geraten. Da es mehrere Designs gibt, muss ich mehrere Vorlagen für Seiten, Beiträge und Textformatausgaben für die verschiedenen Seitenvorlagen erstellen.

Da es so viele Vorlagendateien gibt, wollte ich einige Unterverzeichnisse erstellen. Ich weiß, dass Sie seit WordPress 3.4 und höher den Namen des Unterverzeichnisses verwenden können page-templates für alle Seitenvorlagen, aber wie könnte ich das für die Formatdateien und für die Post-Dateien verwenden?

Ja, ich habe versucht, Funktionen hinzuzufügen wie:

 get_template_part('/template-parts/page-templates' , 'page');

Und

require( get_template_directory() . '/template-parts/template-tags.php' );

Die ideale Verzeichnisstruktur, die ich erstellen möchte, sieht wie folgt aus:

wp-content/themes/mytheme
- archive
- 404
- CSS
- JS
- Images 
- template-parts (dir)
-- page-templates (dir for page-template files.)
-- format-templates (dir for format-templates.)
-- post-templates (dir for post-templates.)
- header
- footer

Also um klar zu sein. Ich möchte die Struktur für Vorlagendateien wie oben erstellen. Kümmern Sie sich nicht um die Ordner wie CSS usw. Diese sind richtig eingestellt. Die Absicht ist, nachdem ich die Struktur erfolgreich erstellt habe, die Vorlagen wie einen Seitentempel aus dem auswählen zu können /wp-admin Seitenabschnitt bearbeiten.

  • Diese Antwort auf dieselbe Frage erklärt, wo es in WordPress fest codiert ist. wordpress.stackexchange.com/a/250024. Es ist jedoch keine gute Idee, mit Kern-Wordpress-Dateien herumzuspielen.

    – WizardCoder

    2. Juni 2017 um 15:22 Uhr

  • Wenn Sie benutzerdefinierte Beitragstypen für Ihre Seiten verwenden können, können Sie dies gerne verwenden apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type ); und hier können Sie Code schreiben, um tiefer in die Verzeichnisebene zu gehen.

    – Prafulla Kumar Sahu

    5. Juni 2017 um 13:30 Uhr

Benutzer-Avatar
hwl

WP_Theme Klasse enthält die Methode get_page_templates() das bietet diesen Filter:

apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type );

Zeile 1103 von class-wp-theme.php

Denken Sie daran, dass in WordPress post und page sind post_types,

add_filter( "theme_post_templates", ... und add_filter( "theme_page_templates",...
sollte gültig sein.

Unter dem Abschnitt „Verwendet von“ des Codex für diese Methode heißt es:

wp-admin/includes/template.php: page_template_dropdown()

wp-admin/includes/meta-boxes.php: page_attributes_meta_box()

Was mich zu der Annahme veranlasst, dass es sie auf der verfügbar machen würde /wp-admin/ Seitenabschnitt bearbeiten.

Informationen aus Kerndateien zum Filter:

 * Filters list of page templates for a theme.
 *
 * The dynamic portion of the hook name, `$post_type`, refers to the post type.
 * @since 4.7.0 Added the `$post_type` parameter.
 *
 * @param array        $post_templates Array of page templates. Keys are filenames,
 *                                     values are translated names.
 * @param WP_Theme     $this           The theme object.
 * @param WP_Post|null $post           The post being edited, provided for context, or null.
 * @param string       $post_type      Post type to get the templates for.

Ich bin mir nicht sicher, ob ein relativer URI hier funktioniert oder ob Sie es brauchen get_theme_file_path()gehe aber von ersterem aus.

function deep_templates( $post_templates, $theme, $post, $post_type )
   $post_templates['/folder/folder/folder/file.php'] = "Page Style One";
   $post_templates['/folder/other-folder/file.php']  = "Page Style Two";
   return $post_templates;
add_filter( 'theme_page_templates', 'deep_templates' );

UND/ODER

add_filter( 'theme_post_templates', 'deep_templates' );
add_filter( 'theme_my-custom-cpt_templates', 'deep_templates' );

  • Danke das funktioniert tatsächlich einwandfrei. Um anderen eine gute Antwort zu geben, werde ich Ihre in einer Sekunde bearbeiten, wie ich meine functions.php aktualisiert habe, um die sub > sub-Verzeichnisvorlagen zu vervollständigen.

    – Todessturm

    7. Juni 2017 um 7:30 Uhr

Benutzer-Avatar
WizardCoder

Hier ist ein Beispiel dafür, was Sie tun müssen.

- directory1 (dir)
-- directory2 (dir)
--- template-file.php

Um auf diese Vorlage zuzugreifen mit get_template_part du würdest das machen:

get_template_part( 'directory1/directory2/template', 'file' );

'directory1/directory2 definiert die Verzeichnisstruktur.
template' ist die Zeichenfolge vor dem - im Vorlagennamen. ‘Datei’ ist die Zeichenfolge nach der dash im Vorlagennamen.

Also in deinem Fall hättest du eine Template-Datei namens page-contact.php in deiner page-templates Verzeichnis, würden Sie verwenden.

get_template_part('template-parts/page-templates/page' , 'contact');

  • Okay, ich verstehe, und könnten Sie mir sagen, wo ich diesen Code platzieren könnte, damit die /wp-admin Back-End könnte meine Vorlage lesen, während eine Seite bearbeitet wird.

    – Todessturm

    30. Mai 2017 um 12:33 Uhr

  • Ah ok, ich glaube ich habe es falsch verstanden. Ich dachte, Sie beziehen sich auf Vorlagenteile, nicht auf vollständige Seitenvorlagen. Ich glaube, Sie können Vorlagendateien in Ihre eigene Vorlagenstruktur einfügen (allerdings nur 1 Ebene tief), und der Administrator wird sie aufnehmen, solange Sie sie hinzufügen /* Template Name: my fancy template name */ als PHP-Kommentar oben in der Vorlagendatei.

    – WizardCoder

    30. Mai 2017 um 12:36 Uhr


  • Das wusste ich bereits und entschuldige, dass ich meine Frage bereits bearbeitet habe. Aber wie wäre es mit zwei Schichten tief?

    – Todessturm

    30. Mai 2017 um 12:45 Uhr

  • WordPress sucht nur 1 Ebene tief nach Vorlagen. Dies ist im Kern von WordPress fest codiert und kann leider nicht geändert werden.

    – WizardCoder

    30. Mai 2017 um 12:53 Uhr

  • Ich bin mir nicht sicher, ob dies bei Ihnen der Fall ist, aber die Vorlagen, die ich erstelle, sind normalerweise nur strukturelle Rahmen. Der Großteil meines wichtigen Codes befindet sich in Vorlagenteilen, die Sie in eine beliebige Verzeichnisstruktur einfügen und dann aufrufen können get_template_part in Ihrer Vorlagendatei.

    – WizardCoder

    30. Mai 2017 um 13:03 Uhr


Ich weiß, dass dies eine alte Frage ist, auf die es bereits eine Antwort gibt, aber es war nicht die Lösung, nach der ich gesucht habe. Hinzufügen einer weiteren Option für den Fall, dass jemand nach einer Möglichkeit sucht, alle WordPress-Vorlagendateien in einen Unterordner zu verschieben. Ich habe es gefunden Code zum Ändern des Standardordners für WordPress-Vorlagendateien auf Reddit und nahm ein paar kleine Anpassungen vor. Dieser Code kann in die functions.php Ihres Themes oder Child-Themes eingefügt werden.

/**
 * Tell WordPress that we have moved default template files to the page-templates folder.
 * Based on code from: https://www.reddit.com/r/Wordpress/comments/ffhjvw/moving_wordpress_theme_template_files_to/
 *
 * Related posts with other solutions:
 * https://stackoverflow.com/questions/60589503/moving-wordpress-theme-template-files-to-subdirectory
 * https://wordpress.stackexchange.com/questions/17385/custom-post-type-templates-from-plugin-folder
 * https://wordpress.stackexchange.com/questions/291725/store-page-template-files-in-a-subfolder
 * https://wordpress.stackexchange.com/questions/312159/how-to-move-page-template-files-like-page-slug-php-to-a-sub-directory/312611#312611
 * 
 * Template hierarchy info: 
 * https://developer.wordpress.org/reference/hooks/type_template_hierarchy/
 * https://core.trac.wordpress.org/browser/tags/5.8.1/src/wp-includes/template.php
 * https://developer.wordpress.org/themes/basics/organizing-theme-files/#page-templates-folder
 *
 * @param array $templates A list of candidates template files.
 * @return string Full path to template file.
 */
function change_template_path($templates) {

  // The custom sub-directory for page templates in your theme. 
  $custom_sub_dir="page-templates";

  // Don't use the custom template directory in unexpected cases.
  if(empty($templates) || ! is_array($templates)) {
    return $templates;
  }

  $page_template_id = 0;
  $count = count( $templates);
  if($templates[0] === get_page_template_slug()) {
    // if there is a custom template, then our page-{slug}.php template is at the next index
    $page_template_id = 1;
  }

  // The last one in $templates is page.php, single.php, or archives.php depending on the type of template hierarchy being read.
  // Paths of all items starting from $page_template_id will get updated
  for($i = $page_template_id; $i < $count ; $i++) {
    $templates[$i] = $custom_sub_dir . "https://stackoverflow.com/" . $templates[$i];
  }

  return $templates;
}

// Add filters to override the path for each WP template hierarchy.
// These are all the template hierarchy filters. You should probably only override the ones you need.
add_filter('404_template_hierarchy', 'change_template_path');
add_filter('archive_template_hierarchy', 'change_template_path');
add_filter('attachment_template_hierarchy', 'change_template_path');
add_filter('author_template_hierarchy', 'change_template_path');
add_filter('category_template_hierarchy', 'change_template_path');
add_filter('date_template_hierarchy', 'change_template_path');
add_filter('embed_template_hierarchy', 'change_template_path');
add_filter('frontpage_template_hierarchy', 'change_template_path');
add_filter('home_template_hierarchy', 'change_template_path');
// If you override the index hierarchy, be sure to add an index.php template in your custom template folder.
add_filter('index_template_hierarchy', 'change_template_path'); 
add_filter('page_template_hierarchy', 'change_template_path');
add_filter('paged_template_hierarchy', 'change_template_path');
add_filter('privacypolicy_template_hierarchy', 'change_template_path');
add_filter('search_template_hierarchy', 'change_template_path');
add_filter('single_template_hierarchy', 'change_template_path');
add_filter('singular_template_hierarchy', 'change_template_path');
add_filter('tag_template_hierarchy', 'change_template_path');
add_filter('taxonomy_template_hierarchy', 'change_template_path');

Verpacken Sie die akzeptierte Antwort in einem funktionierenden Code:

<?php

/* Pages templates in sub folders */
/* --------------------------------------------------------------------------------- */

add_filter('theme_page_templates', function($post_templates) {
  $directories = glob(get_template_directory() . '/pages/*' , GLOB_ONLYDIR);
  
  foreach ($directories as $dir) {
    $templates = glob($dir.'/*.php');

    foreach ($templates as $template) {
      if (preg_match('|Template'.' '.'Name: (.*)$|mi', file_get_contents($template), $name)) {
        $post_templates['/pages/'.basename($dir)."https://stackoverflow.com/".basename($template)] = $name[1];
      }
    }
  }

  return $post_templates;
});

Dies könnte mit einer rekursiven Funktion erweitert werden, denn jetzt fügt es nur hinzu:

./pages/\*/\*.php

get_template_part funktioniert nur als Teil eines WordPress THEME.

Was Sie tun möchten, ist, Ihr eigenes WordPress-Thema zu erstellen (das sich in wp-content/themes/ befindet), das Sie dann für alle gewünschten PHP-Vorlagen, CSS-Ressourcen usw. verwenden können.

Sie können sich ansehen, wie Sie ein WordPress-Theme erstellen und alles einbinden im Kodex hier.

  • Ja, das ist mein eigenes Build-Theme. Es ist bereits erstellt und funktioniert mit den Vorlagendateien usw. Das einzige Problem, das ich habe, ist die Neuorganisation des Themas. Wie ich gesagt habe, muss ich nur wissen, wie man die benutzerdefinierten Verzeichnisse verwendet. Ein Link zum vollständigen WordPress-Codex ist KEINE Lösung.

    – Todessturm

    30. Mai 2017 um 12:26 Uhr

  • Was ich sagen will, ist, dass die Verwendung von get_template_part außerhalb eines Designordners nicht funktioniert, da die Datei nicht gefunden wird. In diesem Fall müssen Sie herkömmliche PHP-Includes/Anforderungen verwenden, die außerhalb des WordPress-Frameworks liegen.

    – Stevenkellow

    30. Mai 2017 um 12:31 Uhr


  • Dies ist alles im Themenordner. Nicht draußen.

    – Todessturm

    30. Mai 2017 um 12:34 Uhr

  • Das ist in Ihrer Frage unklar, Sie sollten Folgendes haben: – wp-content – themes — CSS …. Die obige Antwort von WizardCoder sollte funktionieren

    – Stevenkellow

    30. Mai 2017 um 12:35 Uhr


Benutzer-Avatar
Asley Arbolaez

Sie müssen eine Vorlagendatei (im Verzeichnis “Seitenvorlagen”) für jedes unterschiedliche Design erstellen, das Sie haben werden.

Um eine Vorlagendatei zu erstellen, auf die über das Backend (wp-admin) zugegriffen werden kann, müssen Sie Folgendes hinzufügen:

<?php
/*
Template Name: TEMPLATE-NAME
*/
?>

oben in jeder Datei (Vorlage). Dann können Sie in jeder Datei die Blöcke oder Module des Designs mit der Funktion get_template_part() hinzufügen.

  • Ja, das ist mein eigenes Build-Thema. Es ist bereits erstellt und funktioniert mit den Vorlagendateien usw. Das einzige Problem, das ich habe, ist die Neuorganisation des Themas. Wie ich gesagt habe, muss ich nur wissen, wie man die benutzerdefinierten Verzeichnisse verwendet. Ein Link zum vollständigen WordPress-Codex ist KEINE Lösung.

    – Todessturm

    30. Mai 2017 um 12:26 Uhr

  • Was ich sagen will, ist, dass die Verwendung von get_template_part außerhalb eines Designordners nicht funktioniert, da die Datei nicht gefunden wird. In diesem Fall müssen Sie herkömmliche PHP-Includes/Anforderungen verwenden, die außerhalb des WordPress-Frameworks liegen.

    – Stevenkellow

    30. Mai 2017 um 12:31 Uhr


  • Dies ist alles im Themenordner. Nicht draußen.

    – Todessturm

    30. Mai 2017 um 12:34 Uhr

  • Das ist in Ihrer Frage unklar, Sie sollten Folgendes haben: – wp-content – themes — CSS …. Die obige Antwort von WizardCoder sollte funktionieren

    – Stevenkellow

    30. Mai 2017 um 12:35 Uhr


1371610cookie-checkWordPress-Vorlagendateien in Unterverzeichnissen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy