仅替换WordPress的存档和单页模板的部分内容

时间:2014-07-04 13:02:44

标签: wordpress templates

我在这里遇到一些麻烦,了解如何执行以下操作。我已经搜索了几个星期,但似乎无法找到我要找的东西。

我有自定义的帖子类型'产品'并希望更改为单个产品页面加载的模板以及产品的存档。我使用以下代码加载包含和加载模板。

add_filter('template_include', function() {
    if (is_post_type_archive('product')) {
        $templatefilename = 'archive-product.php';
        $template = WPVS_PATH . 'templates/' . $templatefilename;
        return $template;
    }

    if ('product' == get_post_type() ){
        $templatefilename = 'single-product.php';
        $template = WPVS_PATH . 'templates/' . $templatefilename;
        return $template;
    }
});

我遇到的问题是它取代了当前主题的模板,而不仅仅是内容和存档区域的内部部分。

这是我想要实现的目标:

  1. 创建自定义帖子类型'产品'在一个插件 - 完成(有点容易!)
  2. 打开单个产品时,仅更改内容部分。 - 我可以使用the_content过滤器钩子做到这一点。很简单。欢迎任何其他建议。
  3. 当我转到'产品'的归档视图时自定义帖子类型我不想让它加载主题的默认存档(列表)视图,而是从我的插件中获取网格视图,我似乎无法做到。我只想更改模板的内部部分,而不是整个页面。
  4. 几个星期前我创建了这个插件,只使用了很好的短代码,但想通过创建自定义帖子类型和更改当前活动的内部模板部分来查看是否可以在不使用短代码的情况下执行此操作主题。

    有人能引导我走向正确的方向吗?

    如果我创建一个主题,我可以做我正在寻找的东西,但我想在不添加或更改活动主题的情况下将其创建为插件。该插件应该处理所需的内容。

    这里讨论了同样的问题,但我想要的是开发一些独立于主题的东西。不应对主题文件进行任何更改,也不应将主题文件复制到插件中。

    WP - Use file in plugin directory as custom Page Template?

1 个答案:

答案 0 :(得分:1)

最近我也遇到了同样的问题。这是我如何解决的问题。

  1. template_include过滤器接受一个参数,该参数是您要覆盖的所选模板(这是您在代码中缺少的内容)。
  2. 我不知道,但有时过滤器钩子需要更高的优先级才能像9999那样工作。但是,如果不改变它,首先检查它是否可以使用默认优先级。
  3. 我假设您的存档和单个产品模板都包含get_header()get_footer(),可用于默认选定的主题(或者如果主题设置不同,则相应地进行设置)。
  4. 这是简化的代码:

    add_filter('template_include', function($default_template) {
    
        if (is_post_type_archive('product')) {
    
            $templatefilename = 'archive-product.php';
            $template = WPVS_PATH . 'templates/' . $templatefilename;
            $default_template = $template;
    
        } else if ('product' == get_post_type() ) {
    
            $templatefilename = 'single-product.php';
            $template = WPVS_PATH . 'templates/' . $templatefilename;
            $default_template = $template;
    
        }
    
        // Load new template also fallback if both condition fails load default
        return $default_template;
    
    }, 9999); // set priority, only if not worked with default one