使用自定义部分覆盖模板 [英] Template Overriding using a customization section

查看:26
本文介绍了使用自定义部分覆盖模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从自定义部分覆盖我的默认模板,我正在使用代码来做到这一点,但是如果我使用它,我无法将模板分配给编辑页面页面,任何人都可以给出一个想法定制部分和编辑页面分配模板工作.我想在创建页面时设置模板,并在分配它后我想覆盖.考虑我有一个博客页面,我想为它分配 archive.php 模板,十个想从自定义部分覆盖它.我希望它在特定条件下工作.

I am trying to override my default templates from customization section, I am using code to do that, but if I am using it I am unable to assign a template to the edit-page page, Can anyone give an idea how both the customization section and edit-page assign template work. I want to set the template when I am creating a page and after assigning it I want to override. Consider I have a blog page, I want to assign it archive.php template and ten want to override It from customization section. There is the particular condition where I want it to work.

 <?php
    /**
     * Adds the Customize page to Select template For Pages
     */

    add_action( 'wp_footer', 'cur_page_template' );
function cur_page_template(){
    var_dump( get_option('current_page_template') );
    var_dump( get_page_template() );
    exit;
}
 function widgetsite_template_override($wp_customize){
    $wp_customize->add_panel( 'template_options', array(
        'title' => __( 'Template Options', 'widgetsite' ),
        'description' => $description, // Include html tags such as <p>.
        'priority' => 160, // Mixed with top-level-section hierarchy.
    ) );

    $wp_customize->add_section('theme_template_override', array(
        'title'    => __('Override  Templates', 'widgetsite'),
        'panel' => 'template_options',
        'description' => '',
        'priority' => 120,
    ));


    $templates = get_page_templates();

    $cats = array();
    $i = 0;
    foreach($templates as $template_name => $template_file){
        //$cats[$template_name] = $template_name;   
        if (strpos($template_file,'layouts') !== false) {
            $cats[$template_file] = $template_name;
        }
    }


    $wp_customize->add_setting('widgetsite_archive_template');
    $wp_customize->add_setting('widgetsite_page_template');
    $wp_customize->add_setting('widgetsite_index_template');
    $wp_customize->add_setting('widgetsite_post_template');
    $wp_customize->add_setting('widgetsite_search_template');

    $wp_customize->add_control( 'widgetsite_archive_template', array(
        'settings' => 'widgetsite_archive_template',
        'label'   => 'Override Archive Template:',
        'section'  => 'theme_template_override',
        'type'    => 'select',
        'choices' => array_merge(array( "archive.php"=>get_option('current_page_template')), $cats)
    ));
    $wp_customize->add_control( 'widgetsite_page_template', array(
        'settings' => 'widgetsite_page_template',
        'label'   => 'Override Page Template:',
        'section'  => 'theme_template_override',
        'type'    => 'select',
        'choices' => array_merge( array( "page.php" =>get_option('current_page_template')), $cats)
    ));
    $wp_customize->add_control( 'widgetsite_index_template', array(
        'settings' => 'widgetsite_index_template',
        'label'   => 'Override Index Template:',
        'section'  => 'theme_template_override',
        'type'    => 'select',
        'choices' => array_merge(array( "index.php"=>get_option('current_page_template')), $cats)
    ));
    $wp_customize->add_control( 'widgetsite_post_template', array(
        'settings' => 'widgetsite_post_template',
        'label'   => 'Override Post Template:',
        'section'  => 'theme_template_override',
        'type'    => 'select',
        'choices' => array_merge(array( "post.php"=>get_option('current_page_template')), $cats)
    ));
    $wp_customize->add_control( 'widgetsite_search_template', array(
        'settings' => 'widgetsite_search_template',
        'label'   => 'Override Search Template:',
        'section'  => 'theme_template_override',
        'type'    => 'select',
        'choices' => array_merge(array( "search.php"=>get_option('current_page_template')), $cats)
    ));

}
add_action('customize_register', 'widgetsite_template_override');

$theme_mode_templates['archive.php'] = get_theme_mod("widgetsite_archive_template");
$theme_mode_templates['page.php'] = get_theme_mod("widgetsite_page_template");
$theme_mode_templates['index.php'] = get_theme_mod("widgetsite_index_template");
$theme_mode_templates['post.php'] = get_theme_mod("widgetsite_post_template");
$theme_mode_templates['search.php'] = get_theme_mod("widgetsite_search_template");


function widgetsite_template_redirect($template){

    global $wp_query;
    global $post;
    $cur= basename($template);
    if(  $cur === 'page.php' && get_theme_mod("widgetsite_page_template")){  //note $cur will never be empty!
        $template=  get_template_directory() . '/' . get_theme_mod("widgetsite_page_template");// assuming this will return correct template...
        //if issues try hardcoding a path to test...
    }
    if(  $cur === 'archive.php' && get_theme_mod("widgetsite_archive_template")){  //note $cur will never be empty!
        $template=  get_template_directory() . '/' . get_theme_mod("widgetsite_archive_template");// assuming this will return correct template...
        //if issues try hardcoding a path to test...
    }
    if(  $cur === 'index.php' && get_theme_mod("widgetsite_index_template")){  //note $cur will never be empty!
        $template=  get_template_directory() . '/' . get_theme_mod("widgetsite_index_template");// assuming this will return correct template...
        //if issues try hardcoding a path to test...
    }
    if(  $cur === 'post.php' && get_theme_mod("widgetsite_post_template")){  //note $cur will never be empty!
        $template=  get_template_directory() . '/' . get_theme_mod("widgetsite_post_template");// assuming this will return correct template...
        //if issues try hardcoding a path to test...
    }
    if(  $cur === 'search.php' && get_theme_mod("widgetsite_search_template")){  //note $cur will never be empty!
        $template=  get_template_directory() . '/' . get_theme_mod("widgetsite_search_template");// assuming this will return correct template...
        //if issues try hardcoding a path to test...
    }
    return $template;


}
add_filter( 'template_include', 'widgetsite_template_redirect', 99 ); 

推荐答案

  1. 选择模板框如何在帖子编辑屏幕中工作.

重要的是要记住页面也是帖子,所有与帖子相关的元都存储在帖子元表中.页面帖子类型与标准帖子类型略有不同,因为它们不遵循 single-postname.php 模板使用功能.相反,页面使用 _wp_page_template 键将模板文件路径保存在 wp_postmeta 数据库表中.

It is important to remember pages are also posts and all meta relating to posts are stored in the post meta table. Page post types differ slightly from the standard post types as they do not follow the single-postname.php template use function. Instead pages save the template file path in the wp_postmeta database table with a key of _wp_page_template.

因此,更改此值的一种选择是在保存帖子后更改它.

So one option to change this value is to change it after save post.

function save_template_file( $post_id ) {

    if ( 'page' != $post->post_type ) {
        return;
    }

    //insert logic here
    $filelocation= 'anywhere.....';

    update_post_meta($post_id, '_wp_page_template', $filelocation);

}

add_action('save_post', 'save_template_file', 11 );

现在这不是你要找的,但你提到你想了解这个过程,所以对于页面,wp 将从 post meta 中引用模板文件并拉取这个值.所以你可以在保存后更改它,如果它总是遵循相同的逻辑(稍微优化了流程).这是显示在编辑帖子屏幕中的文件,它将始终拉取 db 值,除非 wp 尝试加载模板并意识到它不再存在,在这种情况下,它会恢复到选择框中的默认文件.

Now this is not what you are looking for, but you mentioned you wanted to understand the process, so for pages, wp will reference the template file from post meta and pull this value. So you can change it after saving if it will always follow the same logic (slightly optimized the process). This is the file that shows up in the edit post screen and will always pull the db value unless wp tries to load the template and realizes it does not exist anymore, in which case it reverts to the defaults file in the select box.

  1. 过滤器 template_include 位于为页面帖子类型搜索正确模板的函数内(其他帖子类型具有过滤器 single_template)
  1. The filter template_include is within the function that searches for the correct template for the pages post type (other post types have the filter single_template)

您在此处使用 include 是不正确的.不要忘记过滤器会期望返回的值在这种情况下正常工作$template.

Your use of include here is incorrect. Don't forget a filter will expect a value returned to work correctly in this case $template.

所以如果我们想改变页面的模板....

So if we want to change the template for pages....

add_filter('template_include', 'assign_new_template');

function assign_new_template ($template){

 //we already have a template name, no need to pull it again..
 $cur= basename($template);

 if(  $cur === 'page.php' && get_theme_mod("widgetsite_page_template")){  //note $cur will never be empty!
    $template=  get_template_directory() . '/layouts/' . get_theme_mod("widgetsite_page_template");// assuming this will return correct template...
    //if issues try hardcoding a path to test...
 }

// dont need a else, we will only change the template if our logic is satisfied...

// etc

return $template;
}

  1. 设置选择

您缺少默认值,因此我建议使用以下模块,因为我看不到您在 get_option('current_page_template') 中的设置,但是如果有正确的文件名,请替换 page.php 与它.

You are missing the value for default so i propose the following mod as i cant see what your setting in get_option('current_page_template') but if there is a correct filename there replace page.php with it.

虽然您没有为选择框设置默认值,但如果没有标记为选择,您的页面将呈现选择的第一个值,因此它应该工作相同.

While you are not setting a default value for your select box, your page will render the 1st value of the select if none are marked selected so it should work the same.

$wp_customize->add_control( 'widgetsite_search_template', array(
    'settings' => 'widgetsite_search_template',
    'label'   => 'Override Search Template:',
    'section'  => 'theme_template_override',
    'type'    => 'select',
    'choices' => array_merge(array("page.php"=>'default'), $cats)
 ));

如果您重新保存上述所有选项,它应该可以工作(这是为我准备的)!

If you resave all the options like above it should be working (it was for me)!

这篇关于使用自定义部分覆盖模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆