问题描述

我收到了一个问题,我必须加载我的父主题的 functions.php 文件加载我的孩子主题的 functions.php 文件。这对于设置& init 程序。我看着/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 文件干净,但父主题引导完成?

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

最佳解决方案

Justin Tadlock 最近写了一篇关于制作一个更好的 functions.php 文件的伟大文章,其中 (如果我记得正确的话) 他处理这个确切的问题。

不幸的是,他的网站目前正在下降,所以现在我不得不依靠我的 memory 。

您正在 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() {
...
}

次佳解决方案

首先,你不能。孩子主题的 functions.php 总是先加载,期间。

二,主题不能挂钩到 setup_theme 。插件可以,但主题可以挂钩的第一件事是 after_setup_theme 。

如果您的父母设计正确,那么该子项能够覆盖父项中的功能和内容,但只有在首次加载时才可以。

一般来说,如果您认为您需要首先加载父级的函数文件,那么您可能会做错,不知何故。你需要解释更大的问题。

第三种解决方案

所以你试图从孩子的 functions.php 执行代码,但在父主题加载完毕之后。简单,只需使用自定义操作:

parent/functions.php 结束时:

do_action('parent_loaded');

child/functions.php

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

所有值得他们的盐的父母主题都是这样做的。此外,他们还有几个其他的操作和过滤器,以供儿童主题使用。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。