将WP升级到4.7或更高版本后,插件中的页面模板无法工作

时间:2017-02-23 作者:Adi

我正在为教育网站开发一个插件。我在插件中添加了3-4个页面模板,以便在插件激活时调用。

直到WordPress4.7, 它工作得很好;但当我将WordPress升级到最新版本时(从4.6.3), 页面模板甚至不会显示在页面属性部分。

以下是在旧版本(之前)中运行良好的代码4.7):

add_action( \'wp_loaded\', \'add_my_templates\' );
function add_my_templates() {
    if( is_admin() ){
        global $wp_object_cache;
        $current_theme = wp_get_theme();
        $templates = $current_theme->get_page_templates();
        $hash = md5( $current_theme->theme_root . \'/\'. $current_theme->stylesheet );
        $templates = $wp_object_cache->get( \'page_templates-\'. $hash, \'themes\' );
        $templates[\'templates/exams.php\'] = __(\'Exams\');
        $templates[\'templates/colleges.php\'] = __(\'Colleges\');
        $templates[\'templates/study_home.php\'] = __(\'Study Home\');
        $templates[\'templates/study_job_home.php\'] = __(\'Study Job Home\');
        wp_cache_replace( \'page_templates-\'. $hash, $templates, \'themes\' );
    }
    else {
        add_filter( \'page_template\', \'get_my_template\', 1 );
    }
}

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, \'_wp_page_template\', true );
    if( $page_template == \'templates/study_home.php\' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == \'templates/study_job_home.php\' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == \'templates/exams.php\' ) {
        $template = plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == \'templates/colleges.php\' ) {
        $template = plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}
我正在寻找过去两天的解决方案,但运气不好!

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

问题:

Mark suggested already, 通过操纵缓存加载模板远远不是标准做法。使用这些缓存更改,即使您修改代码以使用WordPress4.7+, 无法保证您在将来的更新中不会发现类似的问题。因此,最好使用下面提到的任何解决方案:

主题解决方案:

您可以使用实际的page templates 在活动主题中。您的活动主题是recommended 放置这些页面模板。

插件解决方案

但是,如果出于某种原因必须将这些模板与插件一起分配,请使用theme_page_templates 钩子这样做。这对WordPress有用4.4+.

以下是使用theme_page_templates 过滤器挂钩:

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, \'_wp_page_template\', true );
    if( $page_template == \'templates/study_home.php\' ){
        return plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == \'templates/study_job_home.php\' ){
        return plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == \'templates/exams.php\' ){
        return plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == \'templates/colleges.php\' ){
        return plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}

function filter_admin_page_templates( $templates ) {
    $templates[\'templates/exams.php\'] = __(\'Exams\');
    $templates[\'templates/colleges.php\'] = __(\'Colleges\');
    $templates[\'templates/study_home.php\'] = __(\'Study Home\');
    $templates[\'templates/study_job_home.php\'] = __(\'Study Job Home\');
    return $templates;
}

function add_my_templates() {
    if( is_admin() ) {
        add_filter( \'theme_page_templates\', \'filter_admin_page_templates\' );
    }
    else {
        add_filter( \'page_template\', \'get_my_template\', 1 );
    }
}

add_action( \'wp_loaded\', \'add_my_templates\' );
使用上述代码而不是您提供的代码。它适用于任何WordPress版本4.4 之后。我已经用WordPress测试过了4.7.2 &;它工作得很好。

SO网友:Mark Kaplun

缓存插入代码看起来很奇怪,这取决于core计算缓存哈希并使用它们的特定方式。您需要重写这部分代码(我假设添加虚拟页面模板),以找到更健壮的插入方法,或者完全放弃它(为什么不使用实际的页面模板?)

一般来说,页面模板是一个主题的东西,插件不应该真正有一个,而是提供短代码或其他方式,让用户拥有包含其数据的页面。