我创建了一种为帖子选择不同布局的方法(右侧边栏、左侧边栏、全宽)。这是通过一个元框完成的,该元框显示单选按钮,每个布局类型都有一个图像。例如,当我选择第一个布局图像single时。当我选择第二个图像single-template-1时,php文件已加载。php文件已加载,当我选择第三个图像single-template-2时。php已加载。
现在,这一切都很好,但我不能停止思考,这可能是一个混乱的方法,因为3个单模板之间的唯一区别是单模板-1。php在左侧显示侧栏和single-template-2。php根本不显示边栏。
我只是想知道这是不是一种方法,或者是否有一种方法可以将此功能整合到一个单独的功能中。php文件,这可能是一个更干净的解决方案。
meta box code which is responsible for loading the different single templates:
<?php
function my_theme_add_meta_box_post_template_switcher() {
add_meta_box( \'my_theme-post-layout\', __( \'Post template\', \'my_theme\' ), \'my_theme_show_post_template_switcher\', \'post\', \'normal\', \'high\' );
}
add_action( \'add_meta_boxes\', \'my_theme_add_meta_box_post_template_switcher\' );
function my_theme_show_post_template_switcher( $post ) {
$template = get_post_meta( $post->ID, \'_my_theme_post_template\', true );
// Default template for new posts
if( empty( $template ) ) {
$template = \'default\';
}
wp_nonce_field( \'save_post_template\', \'post_template\' );
?>
<fieldset class="clearfix">
<div class="post-layout">
<label for="default-post" id="default-post-layout">
<input type="radio" id="default-post" name="_my_theme_post_template" value="default" <?php checked( $template, \'default\' ); ?> />
<img width="150" height="100" src="<?php echo get_template_directory_uri(); ?>/admin/images/default.png" >
<span> <?php _e( \'Default\', \'my_theme\' ); ?> </span>
</label>
</div>
<div class="post-layout">
<label for="sidebar-left-post">
<input type="radio" id="sidebar-left-post" name="_my_theme_post_template" value="template-1" <?php checked( $template, \'template-1\' ); ?> />
<img width="150" height="100" src="<?php echo get_template_directory_uri(); ?>/admin/images/left-sidebar.png" >
<span> <?php _e( \'Sidebar left\', \'my_theme\' ); ?> </span>
</label>
</div>
<div class="post-layout">
<label for="full-width-post">
<input type="radio" id="full-width-post" name="_my_theme_post_template" value="template-2" <?php checked( $template, \'template-2\' ); ?> />
<img width="150" height="100" src="<?php echo get_template_directory_uri(); ?>/admin/images/full-width-layout.png" >
<span> <?php _e( \'Full width\', \'my_theme\' ); ?> </span>
</label>
</div>
</fieldset>
<?php
}
function my_theme_save_post_template( $post_id ) {
if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
return;
}
if( !isset( $_POST[\'post_template\'] ) || !wp_verify_nonce( $_POST[\'post_template\'], \'save_post_template\' ) ) {
return;
}
if( !current_user_can( \'edit_post\' ) ) {
return;
}
if( isset( $_POST[\'_my_theme_post_template\'] ) ) {
update_post_meta( $post_id, \'_my_theme_post_template\', esc_attr( strip_tags( $_POST[\'_my_theme_post_template\'] ) ) );
}
}
add_action( \'save_post\', \'my_theme_save_post_template\' );
function my_theme_get_post_template_for_template_loader( $template ) {
$post = get_queried_object();
if ( $post ) {
$post_template = get_post_meta( $post->ID, \'_my_theme_post_template\', true );
if ( !empty( $post_template) && $post_template != \'default\' ) {
$template = get_stylesheet_directory() . "/single-{$post_template}.php";
}
}
return $template;
}
My single.php file:
<?php get_header(); ?>
<div class="main-content col-md-8" role="main">
<?php while (have_posts()) : the_post(); ?>
<?php get_template_part( \'content\', get_post_format() ); ?>
<?php comments_template(); ?>
<?php endwhile; ?>
</div> <!-- end .main-content -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
My single-template-1.php, the sidebar left template:
<?php get_header(); ?>
<?php get_sidebar(); ?>
<div class="main-content col-md-8" role="main">
<?php while (have_posts()) : the_post(); ?>
<?php get_template_part( \'content\', get_post_format() ); ?>
<?php comments_template(); ?>
<?php endwhile; ?>
</div> <!-- end .main-content -->
<?php get_footer(); ?>
My single-template-2.php, full width template:
<?php get_header(); ?>
<div class="main-content col-md-12" role="main">
<?php while (have_posts()) : the_post(); ?>
<?php get_template_part( \'content\', get_post_format() ); ?>
<?php comments_template(); ?>
<?php endwhile; ?>
</div> <!-- end .main-content -->
<?php get_footer(); ?>
我只是想知道这是一个好方法还是有更好的方法。