通过插件添加存档页面模板

时间:2019-01-25 作者:Codesmith

因此,我正在为特定站点编写插件。

我知道WordPress从主题中选择页面模板,php脚本名称如下表所示。然而,我想为我的插件编写一个脚本,并让WordPress在搜索页面模板时包含我的脚本。

我知道这通常是主题的工作。我还知道子主题用于覆盖此行为。这是插件也能做到的吗?

WordPress Template Page Hierarchy

3 个回复
最合适的回答,由SO网友:WebElaine 整理而成

WordPress有一个template_include 可以使用的筛选器。

// Add a filter to \'template_include\' hook
add_filter( \'template_include\', \'wpse_force_template\' );
function wpse_force_template( $template ) {
    // If the current url is an archive of any kind
    if( is_archive() ) {
        // Set this to the template file inside your plugin folder
        $template = WP_PLUGIN_DIR .\'/\'. plugin_basename( dirname(__FILE__) ) .\'/archive.php\';
    }
    // Always return, even if we didn\'t change anything
    return $template;
}
明智的做法是允许用户决定哪些存档受到影响。许多网站都有自定义的帖子类型,可能不希望这些归档像其他帖子类型一样受到影响。您可以添加一个选项页面,动态地拉取当前站点上的所有帖子类型,并允许它们为每个类型打开或关闭插件。一旦有了这些,您将需要再次动态地提取所有post类型,然后为每个post类型动态构建“if”语句。例如if(is_archive(\'event\') && $eventtoggle == true - 如果它是这种特定类型的存档文件,并且用户为这种特定类型打开了插件。

SO网友:user3135691

除了上面的正确答案之外,假设您有一个名为“links”的自定义帖子类型。

WordPress自动请求一个名为“archive links.php”的归档文件。无论是在插件中还是在主题中,再加上用于CPT条目的单个实例的页面。

<?php
// Template Logic
function cc_links_init_template_logic($original_template) {
    // Check Theme Template or Plugin Template for archive-links.php

    $file = trailingslashit(get_template_directory()) . \'archive-links.php\';

    if(is_post_type_archive(\'links\')) {
    // some additional logic goes here^.
        if(file_exists($file)) {
            return trailingslashit(get_template_directory()).\'archive-links.php\';
        } else {
            return plugin_dir_path(__DIR__) . \'templates/archive-links.php\';
        }
    } elseif(is_singular(\'links\')) {
        if(file_exists(get_template_directory_uri() . \'/single-links.php\')) {
            return get_template_directory_uri() . \'/single-links.php\';
        } else {
            return plugin_dir_path(__DIR__) . \'templates/single-links.php\';
        }
    }

    return $original_template;
}
add_action(\'template_include\', \'cc_links_init_template_logic\');

SO网友:Asha
//add_filter( \'archive_template\', \'get_custom_post_type_template\' ) ;
add_filter(\'archive_template\', \'yourplugin_get_custom_archive_template\');
function yourplugin_get_custom_archive_template($template) {
    global $wp_query;
    if (is_post_type_archive(\'articles\')) {
        $templates[] = \'archive-articles.php\';
        $template = yourplugin_locate_plugin_template($templates);
    }
    return $template;
}
function yourplugin_locate_plugin_template($template_names, $load = false, $require_once = true) {
    if (!is_array($template_names)) {
        return \'\';
    }
    $located = \'\';
    $this_plugin_dir = WP_PLUGIN_DIR . \'/\' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__));
    foreach ($template_names as $template_name) {
        if (!$template_name) continue;
        if (file_exists(STYLESHEETPATH . \'/\' . $template_name)) {
            $located = STYLESHEETPATH . \'/\' . $template_name;
            break;
        } elseif (file_exists(TEMPLATEPATH . \'/\' . $template_name)) {
            $located = TEMPLATEPATH . \'/\' . $template_name;
            break;
        } elseif (file_exists($this_plugin_dir . \'/templates/\' . $template_name)) {
            $located = $this_plugin_dir . \'/templates/\' . $template_name;
            break;
        }
    }
    if ($load && $located != \'\') {
        load_template($located, $require_once);
    }
    return $located;
}

相关推荐

如何清理wp-content/plugins/wordpress-seo中不必要的文件?

我目前维护Wordpress网站7年。磁盘使用率最近已满,因此我需要定期检查自动备份并保存这些备份,然后将其从服务器中删除。当我检查时,插件文件夹中的wordpress seo文件夹(这是Yoast seo默认插件文件夹)占用了太多空间。据我所知,它充满了各种版本的插件文件。确切地说,它位于wordpress seo插件的js/dist文件夹中。它包含几种类型的小型javascript,每个名称的末尾都有某种序列或版本号,总容量约为250-300 MB。我可以清理这些文件吗?如果是,是否安全?如果我从以前