Please note this is all "working" - the question is about the best practice and to try and work out why I need to include the PHP file which contains the class in two places for it to work correctly.
我正在研究一个简单的父主题,以加快我自己的开发周期,并且已经达到了测试一个简单的子主题的程度。
我知道functions.php
子级的文件在父级之前调用functions.php
- 它包括所有PHP函数和一个用于添加CPT的类。
我想从子主题构建CPT—我希望父主题包含所有可重用和可更新的功能—但不想在每个WP安装中预构建添加的功能。
针对代码问题:
我试图在子级中包含该类(它位于单独的PHP文件中)functions.php
然后实例化一个实例-例如:
require_once TEMPLATEPATH."/library/cpt/cpt.php"; // CPT class ##
$cpt_tree = new Custom_Post_Type( "tree" ); // New CPT - "tree" ##
重新加载页面时出现错误:
Fatal error: Class \'Custom_Post_Type\' not found in C:\\xampp\\htdocs\\site\\wordpress\\wp-content\\themes\\child\\functions.php on line 14
因此,我在父级中包含了相同的PHP文件
functions.php
文件-并且一切正常-作为一个实验,我从子主题中删除了该类-它给出了相同的错误。
我知道这个问题缺少很多代码示例-我希望它能引起一些人的注意-或者对使用类有更多了解的人能够给我一些指针-在两个地方要求这个文件似乎很愚蠢,我想保留functions.php
文件尽可能干净。
最合适的回答,由SO网友:fuxia 整理而成
在一个可预测的操作(时间点)上处理父主题中的所有类加载,并稍后在子主题中挂钩。
示例:
add_action( \'wp_loaded\', \'parent_prefix_load_classes\', 10 );
function parent_prefix_load_classes()
{
$classes = [ \'Extra_Comment_Walker\', \'Extra_Nav_Menu_Walker\' ];
foreach ( $classes as $class )
{
locate_template( "php/class.$class.php", TRUE, TRUE );
}
}
在子主题中创建实例确保在加载类后运行代码:
// Priority 11 to run after the parent theme\'s loader.
add_action( \'wp_loaded\', \'child_prefix_create_objects\', 11 );
function child_prefix_create_objects()
{
$nav_walker = new Extra_Nav_Menu_Walker;
}
经验法则:
切勿仅在文件(function.php
) 被调用。等待wp_loaded
.使用priority参数控制执行顺序一些注意事项:
自定义帖子类型、分类法和短代码属于插件。它们永远不应该是主题的一部分,因为这会为用户创建锁定效果。如果主题切换会破坏内容,您就做错了请勿使用require_once
在主题中。locate_template()
更灵活。如果使用相同的目录结构,现在可以在子主题中覆盖整个类