Weisen Sie Seitenvorlage innerhalb eines benutzerdefinierten Post-Typs zu

Ich habe einen benutzerdefinierten Post-Typ registriert und eine Datei namens archive-myCPT.php und eine weitere für einzelne Posts namens single-myCPT.php erstellt .

Ich möchte eine Seite erstellen, auf der ich nur wenige Posts aus meinem benutzerdefinierten Post-Typ anzeigen kann. In meinem Archiv-myCPT.php werde ich einen Link namens “Special Posts” haben und dieser Link wird auf die benutzerdefinierte Seite gehen, die ein wenig anders sein wird als archive-myCPT.php , der einzige Unterschied ist, dass ich hier werde Verwenden Sie eine benutzerdefinierte Abfrage für die Posts.

Die einzige Möglichkeit, dies zu tun, scheint eine Seitenvorlage zu erstellen, aber das Problem hier ist, dass ich Seiten innerhalb meiner CPT keine Seitenvorlage zuweisen kann. Ich habe dieses Plugin gefunden, das mir bei der Unterstützung von Seitenvorlagen für meinen benutzerdefinierten Post-Typ helfen kann, aber es ist ziemlich alt und ich weiß nicht, ob es mit der neuesten Version von WordPress kompatibel ist.

Gibt es einen anderen Weg, dies zu erreichen?

Ist das eine übliche / gute Praxis?

Vielleicht könntest du etwas anderes empfehlen?

Solutions Collecting From Web of "Weisen Sie Seitenvorlage innerhalb eines benutzerdefinierten Post-Typs zu"

Wenn Sie in der Vorlage eine benutzerdefinierte Abfrage hinzufügen, um Posts zu laden, muss der Post-Typ dieser Seite nicht der benutzerdefinierte Post-Typ sein. Sie können eine Plain-Vanilla- page erstellen, eine Vorlage hierfür über page-your_page_slug.php oder über eine benutzerdefinierte Vorlage, die Sie im Dropdown page-your_page_slug.php der Vorlage zugewiesen haben, und dann über WP_Query nach dem WP_Query Post-Typ WP_Query .

EDIT – hier ist ein Beispiel mit dem single_template Filter. Sie müssen den Post-Typ und den Slug ändern, damit sie zu Ihrem passen.

 function wpa_single_cpt_template( $templates = '' ){ $single = get_queried_object(); if( 'myCPT' == $single->post_type && 'my-special-slug' == $single->post_name ) $templates = locate_template( 'my-special-template.php', false ); return $templates; } add_filter( 'single_template', 'wpa_single_cpt_template' ); 

angepasst aus dem Beispiel der Vorlagenhierarchie: Filterhierarchie .

Sie würden denken, dass es so einfach wäre wie das Hinzufügen von add_post_type_support( 'cptslug', 'page-attributes' ); zu deinem Code, aber es ist nicht. Wenn Sie die Quelle überprüfen, sehen Sie, dass das Dropdown-Menü für die Vorlage nur auf den Seitenposttyp beschränkt ist. Es gibt auch einen Hinweis im Codex und einen Hinweis auf ein geschlossenes Trac-Ticket zum Thema.

Sie können diese Box zu Ihrem CPT hinzufügen, indem Sie die Core-function kopieren, eine kleine Bearbeitung vornehmen und eine neue Box hinzufügen.

 function my_cpt_attributes_meta_box($post) { $post_type_object = get_post_type_object($post->post_type); if ( $post_type_object->hierarchical ) { $dropdown_args = array( 'post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column' => 'menu_order, post_title', 'echo' => 0, ); $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); $pages = wp_dropdown_pages( $dropdown_args ); if ( ! empty($pages) ) { ?> 

< ?php _e('Parent') ?>

< ?php echo $pages; ?> < ?php } // end empty pages check } // end hierarchical check. $template = get_post_meta($post->ID,'_wp_page_template',true); ?>

< ?php _e('Template') ?>

< ?php _e('Order') ?>

< ?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?>

< ?php } function add_my_cpt_attributes_meta_box() { add_meta_box( 'my_cpt_attributes_meta_box', 'My Box Name', 'my_cpt_attributes_meta_box', 'book', 'side', 'core' ); } add_action( 'add_meta_boxes', 'add_my_cpt_attributes_meta_box' );

Wenn Sie diesen Code testen, werden Sie feststellen, dass das Feld angezeigt wird, die Daten jedoch nicht gespeichert werden. Hier ist warum .

Wir werden die Daten selbst speichern müssen.

 function my_save_cpt_template($post_ID,$post) { $page_template = (isset($_POST['page_template'])) ? $_POST['page_template'] : false; $page_templates = wp_get_theme()->get_page_templates(); // var_dump($page_template,$page_templates,'default' != $page_template && ! isset( $page_templates[ $page_template ] )); die; if ( 'default' != $page_template && ! isset( $page_templates[ $page_template ] ) ) { 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); } add_action('save_post_cptslug','my_save_cpt_template',1,2); 

Jetzt sollte es speichern, aber die Vorlage wird nicht geladen. Hier ist warum. get_single_template vor get_page_template und get_page_template sucht nach den spezialisierten Vorlagen. Also müssen wir diese Vorlage selbst laden.

 add_action( 'template_include', function ($template) { global $post; if (is_singular() && isset($post->post_type) && 'book' === $post->post_type) { $new = get_post_meta($post->ID,'_wp_page_template',true); $new = locate_template($new); if (!empty($new)) { $template = $new; } } return $template; } ); 

Kaum getestet Möglicherweise errorshaft. Vorbehaltsteller Keine Rückerstattung.