当重写子主题中的父主题函数时,如何解决“警告:使用未定义常量”?

时间:2020-08-28 作者:Ben Turner

通过将以下代码放置在子主题的functions.php 文件

该函数可以工作,但会引发以下错误:

警告:在/Users/myuser/Local-Sites/storytime/app/public/wp-content/themes/buddyboss-THEME-child/functions中使用未定义的常量THEME\\u HOOK\\u前缀-假定为“THEME\\u HOOK\\u PREFIX”(这将在未来版本的PHP中引发错误)。php在线82

这是我的孩子主题中的代码functions.php:

//Removing the comments section
if ( ! function_exists( \'bjg_buddyboss_theme_single_template_part_content\' ) ) {
  function bjg_buddyboss_theme_single_template_part_content( $post_type ) {
    if ( wp_job_manager_is_post_type() ) :
      get_template_part( \'template-parts/content\', \'resume\' );
    elseif ( gamipress_is_post_type() ) :
      get_template_part( \'template-parts/content\', \'gamipress\' );
    else :
      get_template_part( \'template-parts/content\', $post_type );
    endif;
  }
  add_action( THEME_HOOK_PREFIX . \'_single_template_part_content\', \'bjg_buddyboss_theme_single_template_part_content\' );
}

function change_buddyboss_theme_single_template_part_content() {
    remove_filter( THEME_HOOK_PREFIX . \'_single_template_part_content\', \'buddyboss_theme_single_template_part_content\' );
    add_filter( THEME_HOOK_PREFIX . \'_single_template_part_content\', \'bjg_buddyboss_theme_single_template_part_content\' );
}
add_action( \'after_setup_theme\', \'change_buddyboss_theme_single_template_part_content\' );
我知道错误告诉我常数THEME_HOOK_PREFIX 未定义,但我不确定原因,因为我复制了bjg_buddyboss_theme_single_template_part_content 来自父主题的函数。所以THEME_HOOK_PREFIX 必须在父主题的某个位置定义,因为如果我从子主题中删除此代码,它不会引发此错误。

这是在父主题中定义常量的地方。父主题中此代码的路径为buddyboss-theme/inc/init.php:

/**
 * Setup config/global/constants etc variables
 */
private function _setup_globals() {
    // Get theme path
    $this->_tpl_dir = get_template_directory();

    // Get theme url
    $this->_tpl_url = get_template_directory_uri();

    // Get includes path
    $this->_inc_dir = $this->_tpl_dir . \'/inc\';

    if ( !defined( \'BUDDYBOSS_DEBUG\' ) ) {
        define( \'BUDDYBOSS_DEBUG\', false );
    }

    if ( !defined( \'THEME_TEXTDOMAIN\' ) ) {
        define( \'THEME_TEXTDOMAIN\', $this->lang_domain );
    }

    if ( !defined( \'THEME_HOOK_PREFIX\' ) ) {
        define( \'THEME_HOOK_PREFIX\', \'buddyboss_theme_\' );
    }
}

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

子主题加载在父主题之前。这就是为什么您能够替换function_exists(). 主题使用时function_exists() 他们利用了先加载子主题的事实,让子主题定义具有相同名称的函数,而不会引发错误。

出现错误的原因是,在父主题加载和定义常量之前,您正在子主题中使用此常量。但是,您的父主题正在使用defined() 以与相同的方式function_exists() 要允许您自己在子主题中定义此常量,请执行以下操作:

if ( !defined( \'THEME_HOOK_PREFIX\' ) ) {
    define( \'THEME_HOOK_PREFIX\', \'buddyboss_theme_\' );
}
所以你需要做的就是在你的孩子主题中定义这一点:

define( \'THEME_HOOK_PREFIX\', \'buddyboss_child_theme_\' );
现在,您可以在子主题中使用它,父主题将获取新值并使用它。

相关推荐

Child-theme breaks site

所以,我有一个子主题,里面除了所需的CSS文件之外什么都没有。一旦我激活了这个儿童主题,我的整个网站就关闭了。最后我有两个问题:激活一个只有CSS的子主题怎么能破坏我的网站</我怎样才能回到我原来的主题</这些是网站给我的错误:Warning: require_once(/wp-content/themes/interio_child/admin/options-framework.php) [function.require-once]: 无法打开流:中没有此类文件或目录/wp-c