从子主题函数声明父主题中包含的类的实例。php

时间:2012-10-28 作者:Q Studio

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 文件尽可能干净。

1 个回复
最合适的回答,由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() 更灵活。如果使用相同的目录结构,现在可以在子主题中覆盖整个类

结束

相关推荐

Functions.php:从博客中排除类别

所以很明显,如何从模板中排除某些类别,但我不想修改4个模板,使它们忽略某个类别。有没有一种方法可以将某个类别从阅读设置的“博客”集中排除?我正在将博客分配到名为“博客”的页面。。。但显然,档案和搜索也需要对这一超出类别的内容视而不见。我宁愿在里面做functions.php