如何在child_theme之前加载parent_theme functions.php?


12

我遇到的问题是,我必须先加载父主题的functions.php文件,然后再functions.php加载子主题的文件。这是设置和初始化过程所必需的。我查看了/wp_core_root/wp-settings.php(名为:)中的钩子do_action('setup_theme');

问题是我不知道该如何挂钩,因为我得到的第一个文件是子主题的functions.php,所以没有用add_action( 'setup_theme', 'my_init_function' );

编辑:
a)我知道插件的加载早于主题加载,因此甚至可以访问初始查询,但是我不想依赖插件。
b)这是wp-settings.php文件中的代码(缩短了)

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

我想避免两件事:首先,向用户进行很多解释。其次,如果不小心删除了父母的初始化程序而割断了绳子,则有人可能会摔断任何东西。人们应该只在functions.php中玩,而不必冒险破坏任何东西而又不知道它。

换句话说:我如何保持子主题functions.php文件干净,但父主题引导程序完成了?

有任何想法吗?非常感谢!


你不能只包括它吗?
wyrfel 2011年

我的问题是:从哪里来?在主题上下文中加载的第一个文件是子主题的functions.php。看一下核心中的“ molto loko” wp-settings.php文件(行:275-279 @wp 3.1 rc)...看起来像这样:if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );,所以我看不到机会...而且我不想使用一个引导我的主题的插件。
kaiser

我可能在这里完全错过了一些东西,但是如果您include(/path/to/parent/themes/functions.php)在子主题functions.php的顶部插入,则之前的所有内容都会被加载。不?
wyrfel

@wyrfel:我更新了Q使其更清晰
kaiser

我知道了,谢谢,现在已经很清楚了。另外,我假设您只是一次安装即可。
wyrfel 2011年

Answers:


11

贾斯汀·塔德洛克(Justin Tadlock)最近写了一篇很棒的文章,介绍了如何制作更好的functions.php文件
(如果我没记错的话),他处理了这个确切的问题。

不幸的是,目前他的网站已关闭,因此我现在必须依靠自己的记忆。

您将在after_setup_theme勾子上走上正确的轨道。

  1. 据我所记得,诀窍是将过滤器和操作包装到其功能中。
    请参见下面的示例。
  2. 你这样做,在双方父母和子女functions.php的文件。
  3. 然后,您可以优先使用这两个钩子。

一小段价值一千个单词的代码-您的父主题function.php应如下所示:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

嗯,感谢您的来信(+1)。您的大脑令人印象深刻;)。问题是after_setup_theme为时已晚,因为已经加载了functions.php文件。
kaiser

编辑:重新思考代码并阅读“在父级和子级函数中都做到这一点。php”和“优先播放”后,它就变得有意义了。仍在寻找更好的解决方案,使用户无法轻易破解,但这是有道理的!谢谢!
kaiser

这里没有真正的解决方案,因此,我勾选了此项,因为您是第一个提出此建议的人。
kaiser

9

首先,你不能。子主题的functions.php始终首先加载,即句点。

其次,主题无法与setup_theme挂钩。插件可以,但是主题可以挂的第一件事是after_setup_theme。

如果您的父级设计正确,则子级可以覆盖父级中的功能和内容,但仅当它首先加载时才可以。

广义上讲,如果您认为需要先加载父级的函数文件,那么您可能会以某种方式做错了。您需要解释更大的问题。


感谢您的回答。我了解在主题之前加载插件的必要,并且已经意识到了这一事实(请阅读上文:“而且我不想使用插件来引导我的主题。”)。详细说明一下:我有一个ini文件,它关心加载我所有的框架部分,该文件从父主题函数php开始,需要该文件并加载init-class。InitClass关心从子主题.ini文件加载a)和数据数组,然后将其推入不同的类中以进一步处理ex。元框,自定义帖子类型等
kaiser

我的问题是,我必须从我的父母的functions.php文件中初始化所有这些文件,因此,在使用子主题时,普通用户无法破坏它。我的第二个问题是,所有这些类在子主题的functions.php文件中均不可用,因此它们毫无用处……但也许我在这里遇到了很大的思考错误。关于如何改善它的任何想法或建议?
kaiser

3
....我认为您将不得不接受这样一个事实,即如果用户破坏了事物,那实际上就是他们的问题。底线:无法先加载父主题的functions.php并将子主题保留为“干净”。如果在加载父主题的functions.php文件后需要运行子主题中的某些内容,则可以将其放在挂钩到after_setup_theme的函数中。这将在两个functions.php文件加载之后运行。
奥托

好。这不是什么大问题。如果有可能,我只是对我感兴趣。问题:在初始化过程之后,一个“值得花些钱的框架”又有一个钩子,而不是简单地使用after_setup_theme钩子又有什么用?只是为了不“滥发邮件”,还是因为它更“企业”或“酷”?我的意思是:主题并行挂钩“为插件保留核心挂钩”背后的“最佳实践”想法吗?(这就是我目前的处理方式。)
kaiser

“如果您要这样做,请不要担心额外的操作。只需挂接到after_setup_theme。” 好。谢谢。+1
kaiser

4

因此,您正在尝试从子级的functions.php中执行代码,但是要在父主题加载之后。简单,只需使用自定义操作即可:

在末尾parent/functions.php

do_action('parent_loaded');

child/functions.php

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

所有值得其关注的父主题都采用这种方式。此外,它们还有其他几个动作和过滤器,供孩子主题使用。


我尝试避免尽可能多的指示。这是我从子主题文件夹中的config.php文件切换到现在使用ini文件的原因之一。一句话:我试图摆脱旧的/您的解决方案,并尽可能接近核心和法典。我的问题是我无法从子主题中提供单个功能,因为在子主题functions.php文件中没有可用的类或我的引导程序(不谈论自定义/框架模板标签)。
kaiser

查看最新答案。
scribu 2011年

我也更新了Q。读完2/3答案后,我指的是同一来源(主题,在您进行编辑之前),我感到其中只有“ justin tadlock”方法,但我想确定一下。
kaiser

2
如果您要这么做,请不要多做任何动作。只需挂接到after_setup_theme。
奥托

0

为什么不将父主题functions.php文件包含在子主题functions.php文件中,如下所示:

在子主题functions.php文件中:

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

这样,父主题的functions.php文件就不会更改(有时这很重要)。


如问:“换句话说:如何保持子主题functions.php文件干净,但父主题引导已完成?” 更好的是:如何避免从任何functions.php文件内部进行调用?原因:人们习惯于将不需要的废话粉碎成模板文件。因此,很可能有人不小心删除了某些行。我的经验:没有人真正阅读评论,自述文件或文档。
kaiser

0

我之前也遇到过类似的问题,并通过在父级中创建一个额外的空“ child-functions.php”并将其包含在要在child中使用的文件/函数之后(包括“ parents”)中解决了此问题,然后在子主题中,我创建了一个“ child-functions.php”文件,在这里我可以开始模拟父功能不是很好的解决方案但可以完成工作的子功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.