根据布局后选择加载不同的Single.php模板

时间:2015-11-27 作者:Madeirense

我创建了一种为帖子选择不同布局的方法(右侧边栏、左侧边栏、全宽)。这是通过一个元框完成的,该元框显示单选按钮,每个布局类型都有一个图像。例如,当我选择第一个布局图像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(); ?>
我只是想知道这是一个好方法还是有更好的方法。

2 个回复
SO网友:Mark Kaplun

这些差异似乎不足以让它值3个不同的模板。

您可以使用body_class 筛选以添加基于元的类,并调整CSS以根据类在特定位置隐藏或显示侧栏。

SO网友:Abhik

您不需要三个模板文件,只需要一个即可。将元值另存为类名。例如,默认值为col-md-8, 左侧边栏组件col-md-8 pull-right 和全宽ascol-xs-12.

然后是一个将类回显到main content div的函数。

function wpse_210044_layout_classes() {
    global $post;
    $template = get_post_meta( $post->ID, \'_my_theme_post_template\', true );

    esc_attr_e( $template );

    //Or you can just compare the existing values and echo relavant classes.
    //In that case, you don\'t need to save the meta value as class names.
}
然后是单身。php

<?php get_header(); ?>

<div class="main-content <?php wpse_210044_layout_classes();?>" 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(); ?>

相关推荐

我需要在函数.php中使用is_Single

我需要在文件函数中使用validation is\\u single(\'wordpress\')。php。但是函数is\\u single()在文件函数中不起作用。php。我可以在文件函数中使用的是\\u single()。php?如果更多,则:我在做一个检查,不管是不是单页。对于单页,我设置了自定义功能。。请帮帮我。