Ich hasse es, der Überbringer von schlechten Nachrichten zu sein, aber WordPress codiert die Seitenvorlagenfunktionalität fest auf den Post-Typ "Seite" , zumindest in Version 3.0 (das könnte sich in zukünftigen Versionen ändern, aber es gibt keine spezifische Initiative, die ich kenne, um sie zu ändern Dies ist also eines der wenigen Male, bei denen ich Probleme habe, herauszufinden, wie ich etwas umgehen kann, ohne den Kern zu hacken.)
Die Lösung, die ich mir ausgedacht habe, besteht darin, den relevanten Code aus dem WordPress-Kern zu kopieren und an unsere Bedürfnisse anzupassen. Hier sind die Schritte (die Zeilennummern sind von v3.0.1):
Kopieren Sie die page_attributes_meta_box()
Funktion aus Zeile 535 von /wp-admin/includes/meta-boxes.php
und passen Sie sie an.
Code einen add_meta_boxes
Haken , um die in # 1 erstellte Metabox hinzuzufügen.
Kopieren Sie die get_page_templates()
Funktion aus Zeile 166 von /wp-admin/includes/theme.php
und passen Sie sie an.
Kopieren Sie die page_template_dropdown()
Funktion aus Zeile 2550 von /wp-admin/includes/template.php
und passen Sie sie an.
Fügen Sie Ihrem Thema eine Post-Vorlage hinzu .
Codieren Sie einen save_post
Hook , um das Speichern des Post-Template-Dateinamens beim Speichern zu ermöglichen.
Codieren Sie einen single_template
Hook , um das Laden der Beitragsvorlage für die zugeordneten Beiträge zu ermöglichen.
Nun weiter damit!
1. Kopieren Sie die page_attributes_meta_box()
Funktion
Als ersten Schritt müssen Sie die page_attributes_meta_box()
Funktion aus Zeile 535 von kopieren, /wp-admin/includes/meta-boxes.php
und ich habe beschlossen, sie umzubenennen post_template_meta_box()
. Da Sie nur nach Seitenvorlagen gefragt haben, habe ich den Code für die Angabe eines übergeordneten Posts und für die Angabe der Reihenfolge weggelassen, wodurch der Code viel einfacher wird. Ich entschied mich auch dafür, Postmeta zu verwenden, anstatt zu versuchen, die page_template
Objekteigenschaft wiederzuverwenden , um mögliche Inkompatibilitäten durch unbeabsichtigtes Koppeln zu vermeiden. Also hier ist der Code:
function post_template_meta_box($post) {
if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
$template = get_post_meta($post->ID,'_post_template',true);
?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
} ?>
<?php
}
2. Code einen add_meta_boxes
Haken
Der nächste Schritt ist das Hinzufügen der Metabox mit dem add_meta_boxes
Hook:
add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}
3. Kopieren Sie die get_page_templates()
Funktion
Ich ging davon aus, dass es nur Sinn machen würde, zwischen Seitenvorlagen und Beitragsvorlagen zu unterscheiden, daher die Notwendigkeit einer get_post_templates()
auf get_page_templates()
Zeile 166 basierenden Funktion /wp-admin/includes/theme.php
. Anstatt den Template Name:
Marker zu verwenden, für welche Seitenvorlagen diese Funktion verwendet wird Post Template:
, wird stattdessen ein Marker verwendet, den Sie unten sehen können.
Ich gefiltert auch aus Inspektion von functions.php
(nicht sicher , wie get_page_templates()
immer richtig , ohne dass gearbeitet, aber was auch immer!) Und das einzige , was links ist zu ändern Verweise auf das Wort , page
um post
für die Wartung Lesbarkeit auf der Straße:
function get_post_templates() {
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$post_templates = array();
if ( is_array( $templates ) ) {
$base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );
foreach ( $templates as $template ) {
$basename = str_replace($base, '', $template);
if ($basename != 'functions.php') {
// don't allow template files in subdirectories
if ( false !== strpos($basename, '/') )
continue;
$template_data = implode( '', file( $template ));
$name = '';
if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
$name = _cleanup_header_comment($name[1]);
if ( !empty( $name ) ) {
$post_templates[trim( $name )] = $basename;
}
}
}
}
return $post_templates;
}
4. Kopieren Sie die page_template_dropdown()
Funktion
Kopieren Sie in ähnlicher Weise page_template_dropdown()
aus Zeile 2550 von /wp-admin/includes/template.php
, um post_template_dropdown()
es zu erstellen, und ändern Sie es einfach, um get_post_templates()
stattdessen aufzurufen :
function post_template_dropdown( $default = '' ) {
$templates = get_post_templates();
ksort( $templates );
foreach (array_keys( $templates ) as $template )
: if ( $default == $templates[$template] )
$selected = " selected='selected'";
else
$selected = '';
echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
endforeach;
}
5. Fügen Sie eine Post-Vorlage hinzu
Im nächsten Schritt fügen Sie eine Post-Vorlage zum Testen hinzu. Verwenden Sie die Post Template:
in Schritt 3 erwähnte Markierung, kopieren Sie sie single.php
aus Ihrem Design single-test.php
und fügen Sie den folgenden Kommentar-Header hinzu (stellen Sie sicher, single-test.php
dass Sie etwas daran ändern, damit Sie erkennen können, dass es geladen wird, anstatt single.php
) :
/**
* Post Template: My Test Template
*/
Sobald Sie die Schritte 1 bis 5 ausgeführt haben, wird Ihre Metabox "Post Templates" auf Ihrer Post-Editor-Seite angezeigt:
(Quelle: mikeschinkel.com )
6. Code einen save_post
Haken
Nachdem Sie den Editor entfernt haben, müssen Sie den Dateinamen Ihrer Seitenvorlage tatsächlich auf Postmeta speichern, wenn der Benutzer auf "Veröffentlichen" klickt. Hier ist der Code dafür:
add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
if ($post->post_type=='post' && !empty($_POST['post_template']))
update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}
7. Code einen single_template
Haken
Und zu guter Letzt müssen Sie WordPress installieren, um Ihre neuen Post-Vorlagen verwenden zu können. Sie tun dies, indem single_template
Sie den gewünschten Vorlagennamen für die Posts anhängen und zurückgeben, denen einer zugewiesen wurde:
add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
global $wp_query;
$post = $wp_query->get_queried_object();
if ($post) {
$post_template = get_post_meta($post->ID,'_post_template',true);
if (!empty($post_template) && $post_template!='default')
$template = get_stylesheet_directory() . "/{$post_template}";
}
return $template;
}
Und das war's auch schon!
HINWEIS , dass ich nicht in Betracht ziehen Benutzerdefinierte Beitragstypen , nur post_type=='post'
. Meiner Meinung nach erfordert das Adressieren von benutzerdefinierten Beitragstypen die Unterscheidung zwischen den verschiedenen Beitragstypen, und obwohl dies nicht allzu schwierig ist, habe ich es hier nicht versucht.