如何在不丢失$This的情况下从插件添加页面模板

时间:2017-05-30 作者:Andy Mercer

我正在尝试从插件内部添加页面模板。对于这个问题,我将代码裁剪为一个测试插件,该插件有两个文件,PHP主插件文件和PHP模板文件。

wp插件/测试插件/测试插件。php

wp插件/测试插件/模板/测试模板。php

插件有两部分。首先,我点击template_include 过滤,然后返回模板文件(test template.php)的路径。

接下来,我有一个新的扩展Walker_Page, 调用Walker_Page_New 在本例中。在该文件中,它是Walker_Page.

当前代码

test-plugin.php

<?php

/**
 * Plugin Name: Test Plugin
 * Version: 1.0
 * Author: Andy Mercer
 * Author URI: http://www.andymercer.net
 * License: GPL2
 */ 

add_filter( \'template_include\', \'test_get_template\' );

function test_get_template( $template ) {

    $template_path = plugin_dir_path( __FILE__ ) . \'templates/test-template.php\';

    if ( file_exists( $template_path ) ) {

        $template = $template_path;

    }

    return $template;

}


class Walker_Page_New extends Walker_Page {

    // THE CODE IN HERE IS AN EXACT COPY OF WALKER_PAGE

    // I AM NOT ENTERING IT ALL IN THIS QUESTION BECAUSE IT\'S A COUPLE HUNDRED LINES OF CODE

}

test-template.php

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
        ...head stuff...
    </head>
    <body>
        <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <div>
            <?php $ancestors = get_ancestors( get_the_ID(), \'page\' );
            wp_list_pages([
                \'title_li\' => \'\',
                \'sort_column\' => \'menu_order\',
                \'child_of\' => $ancestors[0],
                \'depth\' => 2,
                \'walker\' => \'Walker_Page_New\',
            ]); ?>
        </div>
        <div>
            <?php the_title(); ?>
            <?php the_content() ?>
        </div>
        <?php endwhile; endif; ?>
        <?php wp_footer(); ?>
    </body>
</html>
问题当我加载页面时,我只得到以下错误:

致命错误:未捕获错误:当不在C中的对象上下文中时使用$this:。。。\\wp包括\\类wp walker。菲律宾比索:199

触发此错误的是调用wp_list_pages() 带着一个定制的助行器。当我取下助行器时,我很好,一切正常。

研究

环顾四周,我发现唯一具体提到这一点的地方是半相关的:https://github.com/Automattic/amp-wp/issues/412#issuecomment-240871878, 其中规定使用template_include 将导致:

e、 g.模板中不再有$this上下文

问题

是否希望使用template_include 会打碎东西吗?我应该使用template_redirect 相反

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

你的walker论点wp_list_pages 应该是实例,而不是字符串。

\'walker\' => new Walker_Page_New()

SO网友:Rarst

WordPress没有将显式上下文传递给模板的概念。当模板被它加载时,几个全局变量将显式地可用,但即使这样也无关紧要。

总的来说,您必须以某种方式处理WP模板中的全局范围。方法各不相同,最终取决于你。典型的解决方案可以是:

创建自己的全局

结束

相关推荐