我正在尝试从插件中添加页面模板。对于这个问题,我已将我的代码修改为一个测试插件,它有两个文件,PHP主插件文件和PHP模板文件。
WP-插件/测试插件/测试plugin.php
WP-插件/测试插件/模板/测试的template.php
这个插件有两个部分。首先,我点击template_include
过滤器,然后返回模板文件的路径(test-template.php)。
接下来,我有Walker_Page
的新扩展名,在此示例中名为Walker_Page_New
。在文件中,它是Walker_Page
的单词副本。
测试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
}
测试的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-includes \ class-wp-walker.php:199
触发此错误的是使用自定义Walker调用wp_list_pages()
。当我删除沃克时,我很好,一切都按预期工作。
从环顾四周来看,我发现的唯一具体提及是半关联的:https://github.com/Automattic/amp-wp/issues/412#issuecomment-240871878,其中声明使用template_include
会导致此问题:
e.g。我们将不再在模板中使用$ this上下文
预计使用template_include
会破坏内容吗?我应该使用template_redirect
吗?