我正在尝试从插件内部添加页面模板。对于这个问题,我将代码裁剪为一个测试插件,该插件有两个文件,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
相反