Ist es möglich, eine Vorlage für einen benutzerdefinierten Beitragstyp innerhalb eines Plugins unabhängig vom aktiven Thema zu definieren?

8

Ich schreibe ein Plugin, um Daten über Open Source-Projekte zu verwalten. Ich habe ein Objektmodell entwickelt und erfolgreich alle benutzerdefinierten Beitragstypen und Taxonomien erstellt sowie die richtigen Funktionen / Rollen mithilfe des MembersPlugins implementiert . Die entsprechenden Benutzer können ihre eigenen Beiträge erstellen, ändern und löschen, und Administratoren können sie genehmigen sowie die Beiträge anderer Personen ändern und löschen.

Mein Problem ist, dass ich die Vorlage für ein einzelnes Projekt und für eine Liste von Projekten definieren möchte (einzeln und archiviert, glaube ich - ich habe auf dieser Ebene noch nie mit Wordpress gearbeitet), aber ich möchte nicht, dass sich The Loop darauf verlässt auf das aktuelle Thema, um die Seite für ein einzelnes Projekt oder eine Liste von Projekten zu rendern. Wenn ich das TwentyTen-Thema verwende, soll die Vorlage meines Plugins für diese benutzerdefinierten Beitragstypen verwendet werden. Wenn ich das TwentyEleven-Thema verwende, möchte ich weiterhin, dass die Vorlage meines Plugins für diese benutzerdefinierten Beitragstypen verwendet wird.

Ich möchte, dass dies dem Paradigma "es funktioniert einfach" folgt, aber im Moment können Benutzer den Ordner nicht einfach im Plugin-Verzeichnis ablegen - sie müssen jedes Mal, wenn sie das Thema wechseln, die entsprechenden Dateien zu ihrem Themenordner hinzufügen. Ich habe die Vorlagenhierarchie überprüft und die Dateinamen sind korrekt, aber sie werden von Wordpress nicht verwendet, wenn sie sich im Plugin-Ordner oder im Plugin / Vorlagen-Ordner befinden.

Vielen Dank!

ZachM
quelle
Natürlich scheint es immer so, als ob ich die Antwort direkt nach dem Posten einer Frage finde ... Es scheint, als müsste ich den single_templateFilter erweitern, um dies zu erreichen. Quelle: codex.wordpress.org/Plugin_API/Filter_Reference/single_template (1 Ruf, damit ich meine eigene Frage nicht beantworten kann!)
ZachM
single_templateLäuft für einzelne Beiträge und Seiten. Sie beschreiben die Verwendung für eine Liste von Projekten, so dass Sie einen anderen Filter benötigen - Antwort unten
Sanchothefat

Antworten:

7

Sie müssen den template_includeFilter verwenden, der der generische Filter für alle Vorlageneinschlüsse ist.

add_filter( 'template_include', 'my_plugin_templates' );
function my_plugin_templates( $template ) {
    $post_types = array( 'project' );

    if ( is_post_type_archive( $post_types ) && ! file_exists( get_stylesheet_directory() . '/archive-project.php' ) )
        $template = 'path/to/list/template/in/plugin/folder.php';
    if ( is_singular( $post_types ) && ! file_exists( get_stylesheet_directory() . '/single-project.php' ) )
        $template = 'path/to/singular/template/in/plugin/folder.php';

    return $template;
}

Ich habe das Post-Type-Archivbit noch nicht vollständig getestet. Möglicherweise müssen Sie eine Prüfung mit einfügen is_tax( $taxonomies ), damit es für zugehörige benutzerdefinierte Taxonomiearchive funktioniert.

Sanchothefat
quelle
Vielen Dank! Das hilft. Obwohl die $theme = wp_get_theme();und if ( $theme-> stylesheet...Zeilen nicht das sind, was ich hier brauche (ich brauche sie, um völlig unabhängig von Themen zu sein - vielleicht habe ich es vorher auf verwirrende Weise gesagt). Der Rest des Codes sieht aber gut aus!
ZachM
Funktioniert super! Benötigt ein Semikolon nach den beiden $template=...Zeilen ... hat das beim ersten Mal nicht verstanden und hat sich gefragt, was schief gelaufen ist. Vielen Dank!
ZachM
@ ZachM d'oh! Entschuldigung - das werde ich in der Antwort beheben. Ich dachte, Sie wollten nur diese beiden Themen überschreiben, aber was Sie dann wirklich tun müssen, ist, das aktuelle Thema auf das Vorhandensein dieser Vorlagendateien zu überprüfen. Willst du Hilfe bei diesem Teil?
Sanchothefat
Ist dieses Thema wirklich unabhängig? Ich dachte, single.php usw. enthalten get_header () / get_footer () und viele vorlagenspezifische HTML?
Steve
1
@Eherman wird nur an die Include-Funktion von PHP übergeben. Funktioniert gut für mich. Ist Ihr absoluter Weg definitiv richtig? z.B. Sie müssen möglicherweise verwendenplugins_dir_path( __FILE__ ) . 'template.php'
Sanchothefat