【问题标题】:Template Overriding using a customization section使用自定义部分覆盖模板
【发布时间】:2015-09-30 05:32:07
【问题描述】:

我正在尝试从自定义部分覆盖我的默认模板,我正在使用代码来执行此操作,但如果我正在使用它,我无法将模板分配给编辑页面页面,任何人都可以知道两者如何自定义部分和编辑页面分配模板工作。我想在创建页面时设置模板,在分配它之后我想覆盖它。 考虑我有一个博客页面,我想分配它archive.php 模板和十个想从自定义部分覆盖它。我希望它在特定条件下起作用。

 <?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 ); 

【问题讨论】:

  • 如果它工作正常,仍然没有找到,仍然在工作。在某些情况下它不工作,在某些情况下它正在工作。
  • 哪些实例不起作用?

标签: wordpress templates wordpress-theming


【解决方案1】:
  1. 选择模板框在后期编辑屏幕中的工作方式。

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

因此,更改此值的一种方法是在保存帖子后更改它。

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 尝试加载模板并意识到它不再存在,在这种情况下,它会恢复为选择框中的默认文件。

  1. 过滤器template_include位于为页面帖子类型搜索正确模板的函数中(其他帖子类型有过滤器single_template

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

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

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. 设置选择

您缺少默认值,因此我建议使用以下 mod,因为我无法看到您在 get_option('current_page_template') 中的设置,但如果有正确的文件名,则将 page.php 替换为它。

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

$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)
 ));

如果您重新保存上面的所有选项,它应该可以工作(对我来说)!

【讨论】:

  • 感谢您的回答,但我认为代码中还有其他问题我收到错误Warning: include(E:\projects\wamp\www\widgetsite/wp-content/themes/widgetsite/layouts/default) 所以,您能找出我在哪里得到这个吗?
  • Warning: include(E:\projects\wamp\www\widgetsite/wp-content/themes/widgetsite/layouts/default): failed to open stream: No such file or directory in E:\projects\wamp\www\widgetsite\wp-includes\template-loader.php on line 75 这是错误我认为选择框中的默认模板导致问题,你能建议我能用它做什么吗?
  • 该文件是否存在于该位置?无论如何它都缺少扩展名,但下拉框中的文件不会丢失。这是您自己制作的模组,您是否忘记将扩展程序放在某个地方?
  • 'choices' =&gt; array_merge(array("default"=&gt;get_option('current_page_template')), $cats) 这是存在问题的行。但是将其更改为 index.php 我得到了同样的错误。
  • 看到我很难调试您创建选择框的方式,它应该将 xxx.php 保存为“current_page_template”选项。但是手动将其更改为 index.php 将在 layouts 文件夹中查找 index.php(假设您没有更改我给您的代码格式)。您是否有权访问数据库以检查当前页面模板中的值?顺便说一句...你知道每个get_option('current_page_template') 永远都是一样的吗?
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2013-03-07
  • 2017-07-17
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多