我将对现有的优秀答案补充几点想法:
我建议使用约定命名模板文件template-foobar.php
. 这样做有助于将其与其他模板和模板零件文件区分开来除非您打算对模板文件使用后期编辑器,否则不需要在自定义模板文件中输出默认循环。例如,如果您想要表单,而表单中没有其他内容,则需要从以下代码库开始:
<?php
/**
* Template Name: Foobar Form
*/
get_header();
// Your custom code goes here
get_footer();
假设您正在使用自己的主题(或子主题,如您修改了212的示例),您可以将功能代码添加到
functions.php
, 可以直接在文件中,也可以通过包含的文件。
如果您希望此代码在特定主题之外可用,那么您可能希望通过插件实现代码。在这种情况下,您可能根本不想使用自定义页面模板,而是想看看如何使用自定义短代码也就是说,您仍然可以使用主题自定义页面模板;您只需为使用的每个主题创建一个新的主题,我强烈建议您将任何插件函数调用包装在if ( function_exists() )
有条件的
您可以在插件中定义自定义页面模板,然后在上使用回调template_redirect
, template_include
, 或page_template
确定何时使用它(例如,基于特定的页面slug,或者更好的是,通过插件定义的自定义post meta)我将逐步介绍最后一点。在插件中,您需要为静态页面定义自定义post meta:
function wpse77991_add_meta_boxes( $post ) {
add_meta_box(
\'wpse77991_display_form\',
__( \'Display Form\', \'textdomain\' ),
\'wpse77991_display_form_meta_box\',
\'page\',
\'side\',
\'default\'
);
}
// Hook meta boxes into \'add_meta_boxes_page\'
add_action( \'add_meta_boxes_page\', \'wpse77991_add_meta_boxes\' );
然后,定义回调:function wpse77991_display_form_meta_box() {
global $post;
$custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
$display_form = ( isset( $custom[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\' );
<input type="checkbox" name="_wpse77991_display_form" <?php checked( \'true\' == $display_form ); ?> value="true" />
<label><?php _e( \'Display Form?\', \'textdomain\' ); ?></label>
}
然后,定义保存后回调:function wpse77991_save_display_form_meta_data() {
global $post;
$custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
$display_form = ( isset( $_POST[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\' );
update_post_meta( $post->ID, \'_wpse77991_display_form\', $display_form );
}
add_action( \'publish_page\', \'wpse77991_save_display_form_meta_data\' );
add_action( \'draft_page\', \'wpse77991_save_display_form_meta_data\' );
现在,编辑帖子页面将显示静态页面的元框,允许用户选中复选框“显示表单”。然后,您可以在回调中查询该自定义元数据template_redirect
, template_include
, 或者更好,page_template
:
function wpse77991_page_template_include( $template ) {
global $post;
$custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
$display_form = ( isset( $custom[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\'
if ( \'true\' == $display_form ) {
return( plugin_dir_path( __FILE__ ) . \'template-foobar.php\' );
}
}
add_filter( \'page_template\', \'wpse77991_page_template_include\', 1, 1 );
以上所有代码都是未经测试的代码,在这里用作流程的概念证明。