Benutzerdefinierte Beitragstyp mit Vorlagen mit Meta-Boxen?

Ich habe dieses Problem, wo ich eine CPT brauche, um mehrere Layoutoptionen zu haben und Vorlagen zu verwenden. Ursprünglich unterstützt WP keine Vorlagen für benutzerdefinierte Posts, aber ich weiß, dass es möglich ist, es manuell über benutzerdefinierte Metadaten-Boxen zu tun.

Dies ist der Codeschnipsel, den ich in meinen functionen habe, was die Möglichkeit ermöglicht, eine Vorlage auszuwählen und zu speichern. Es funktioniert gut – fügt Daten zu db hinzu und speichert / aktualisiert die Vorlage. Mein Problem ist im letzten Teil, wo ich versuche, das Thema umzuleiten, um die Vorlage zu korrigieren, und einige – warum es nicht funktioniert.

// --------Add actions add_action('add_meta_boxes', 'custom_template_add_custom_box'); /* Do something with the data entered */ add_action('save_post', 'custom_template_save_postdata'); // --------Add functions /* Adds a box to the main column on the Post and Page edit screens */ function custom_template_add_custom_box() { add_meta_box( 'custom-post-type-choice', 'Choose custom template', 'custom_template_inner_box', 'campaign', 'side' ); } /* Prints the box content */ function custom_template_inner_box( $post ) { // Use nonce for verification wp_nonce_field( plugin_basename(__FILE__), 'custom_template_noncename' ); if ( 0 != count( get_page_templates() ) ) { $page_template = get_post_meta($post->ID, '_wp_page_template', TRUE); ?> 

<?php } } /* When the post is saved, saves our custom data */ function custom_template_save_postdata( $post_id ) { // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !isset( $_POST['custom_template_noncename'] ) || !wp_verify_nonce( $_POST['custom_template_noncename'], plugin_basename(__FILE__) ) ) return $post_id; // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; // Check permissions if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id ) ) return $post_id; } else { if ( !current_user_can( 'edit_post', $post_id ) ) return $post_id; } // OK, we're authenticated: we need to find and save the data $page_template = $_POST['page_template']; if ( !empty($page_template) && 'campaign' == get_post_type($post_id) ) { $page_templates = get_page_templates(); if ( 'default' != $page_template && !in_array($page_template, $page_templates) ) { if ( $wp_error ) return new WP_Error('invalid_page_template', __('The page template is invalid.')); else return 0; } update_post_meta($post_id, '_wp_page_template', $page_template); } } /* Custom template redirection hook */ function custom_template_redirect() { global $post; if ( is_single() && 'campaign' == get_post_type($post) ) { $page_template = get_page_template(); include($page_template); exit; } } add_action("template_redirect", 'custom_template_redirect');

Wie kann ich die ausgewählte Vorlage für diese Seite verwenden?

Solutions Collecting From Web of "Benutzerdefinierte Beitragstyp mit Vorlagen mit Meta-Boxen?"

Ich würde empfehlen, den template_include Filter im Gegensatz zu template_redirect , da die Verwendung dieses Hooks bedeutet, dass Sie den Benutzer nicht redirect, sondern ihn nur mit der Vorlage präsentieren, die erforderlich ist.

 add_filter('template_include', 'my_custom_template_redirect', 99); function my_custom_template_redirect($template){ global $post; if(is_single() && 'campaign' == get_post_type($post)){ $page_template = get_page_template(); $new_template = locate_template( array( 'subfolder/' . $page_template . '.php' ) ); $template = ($new_template !== '') ? $new_template : $template; } return $template; } 

Offensichtlich mache ich die Annahme, dass Ihre $page_template Variable am Ende keine .php , aber Sie können dies wie gewünscht ändern.

Ich empfehle Ihnen, die Dokumentation zu diesem Hook und die locate_template function zu locate_template

Aktualisieren

In meiner ursprünglichen Antwort habe ich vergessen, global $post; . Ich habe jetzt die Antwort geändert, um diese Zeile einzuschließen.