希望有人能提供帮助,我正在寻找一些关于如何重写/替换父主题中加载的某些函数并将其移动到子主题中的建议,以便我们可以在子主题中对文件本身进行更改。
我们将把结构和文件“复制”到子主题中,但还无法找到方法“卸载”原始父主题文件,然后加载我们想要更改的子主题文件。
本质上,我们将在子主题中复制和更改下面列出的所有“require”文件,但需要找到某种方法来覆盖父函数。php。
我们已经尝试了多种方法来做到这一点,但到目前为止似乎还没有成功。
这是当前的父函数。PHP:
<小时>
<?php
/**
* moto functions and definitions
*
* @package moto
*/
if ( ! function_exists( \'moto_setup\' ) ) :
/**
* Sets up theme defaults and registers support for various WordPress features.
*
* Note that this function is hooked into the after_setup_theme hook, which
* runs before the init hook. The init hook is too late for some features, such
* as indicating support for post thumbnails.
*/
function moto_setup() {
/*
* Make theme available for translation.
* Translations can be filed in the /languages/ directory.
* If you\'re building a theme based on moto, use a find and replace
* to change \'moto\' to the name of your theme in all the template files
*/
load_theme_textdomain( \'moto\', get_template_directory() . \'/languages\' );
// Add default posts and comments RSS feed links to head.
add_theme_support( \'automatic-feed-links\' );
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded <title> tag in the document head, and expect WordPress to
* provide it for us.
*/
add_theme_support( \'title-tag\' );
/*
* Enable support for Post Thumbnails on posts and pages.
*
* @link http://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails
*/
add_theme_support( \'post-thumbnails\' );
// This theme uses wp_nav_menu() in one location.
register_nav_menus( array(
\'primary\' => esc_html__( \'MOTO Main Menu\', \'moto\' ),
\'pre_header\' => esc_html__( \'Preheader Menu(You have to enable Preheader from MOTO Options panel to view this menu.)\', \'moto\' )
) );
/*
* Switch default core markup for search form, comment form, and comments
* to output valid HTML5.
*/
add_theme_support( \'html5\', array(
\'search-form\',
\'comment-form\',
\'comment-list\',
\'gallery\',
\'caption\',
) );
/*
* Enable support for Post Formats.
* See http://codex.wordpress.org/Post_Formats
*/
add_theme_support( \'post-formats\', array(
\'aside\',
\'image\',
\'video\',
\'quote\',
\'link\',
) );
// Set up the WordPress core custom background feature.
add_theme_support( \'custom-background\', apply_filters( \'moto_custom_background_args\', array(
\'default-color\' => \'ffffff\',
\'default-image\' => \'\',
) ) );
add_theme_support( \'woocommerce\' );
global $pagenow;
if ( is_admin() && \'themes.php\' == $pagenow && isset( $_GET[\'activated\'] ) ) {
wp_redirect(admin_url("options-general.php?page=moto-system-status")); // Your admin page URL
exit();
}
}
endif; // moto_setup
add_action( \'after_setup_theme\', \'moto_setup\' );
/**
* Set the content width in pixels, based on the theme\'s design and stylesheet.
*
* Priority 0 to make it available to lower priority callbacks.
*
* @global int $content_width
*/
function moto_content_width() {
$GLOBALS[\'content_width\'] = apply_filters( \'moto_content_width\', 640 );
}
add_action( \'after_setup_theme\', \'moto_content_width\', 0 );
/**
* Register widget area.
*
* @link http://codex.wordpress.org/Function_Reference/register_sidebar
*/
function moto_widgets_init() {
register_sidebar( array(
\'name\' => esc_html__( \'Sidebar\', \'moto\' ),
\'id\' => \'sidebar-1\',
\'description\' => esc_html__( \'Defualt Sidebar\', \'moto\' ),
\'before_widget\' => \'<div id="%1$s" class="row no-margin widget %2$s">\',
\'after_widget\' => \'</div>\',
\'before_title\' => \'<hr><h4>\',
\'after_title\' => \'</h4>\',
) );
register_sidebar( array(
\'name\' => esc_html__( \'Shop Sidebar\', \'moto\' ),
\'id\' => \'shopsidebar\',
\'description\' => esc_html__( \'Shop Sidebar Show Only Shop pages\', \'moto\' ),
\'before_widget\' => \'<div id="%1$s" class="row no-margin widget %2$s">\',
\'after_widget\' => \'</div>\',
\'before_title\' => \'<hr><h4>\',
\'after_title\' => \'</h4>\',
) );
register_sidebar( array(
\'name\' => esc_html__( \'Footer Sidebar - 1\', \'moto\' ),
\'id\' => \'footer-1\',
\'description\' => esc_html__( \'Footer Sidebar - 1\', \'moto\' ),
\'before_widget\' => \'<div class="col-md-3 col-sm-6 text-left">\',
\'after_widget\' => \'</div>\',
\'before_title\' => \'<hr><h4>\',
\'after_title\' => \'</h4>\',
) );
register_sidebar( array(
\'name\' => esc_html__( \'Footer Sidebar - 2\', \'moto\' ),
\'id\' => \'footer-2\',
\'description\' => esc_html__( \'Footer Sidebar - 2\', \'moto\' ),
\'before_widget\' => \'<div class="col-md-3 col-sm-6 text-left"><div class="mt_footer_content">\',
\'after_widget\' => \'</div></div>\',
\'before_title\' => \'<hr><h4>\',
\'after_title\' => \'</h4>\',
) );
}
add_action( \'widgets_init\', \'moto_widgets_init\' );
/**
* Implement the Custom Header feature.
*/
require get_template_directory() . \'/function/custom-header.php\';
/**
* Custom template tags for this theme.
*/
require get_template_directory() . \'/function/template-tags.php\';
/**
* Custom functions that act independently of the theme templates.
*/
require get_template_directory() . \'/function/extras.php\';
/**
* Customizer additions.
*/
require get_template_directory() . \'/function/customizer.php\';
/**
* Load Jetpack compatibility file.
*/
require get_template_directory() . \'/function/jetpack.php\';
require_once get_template_directory() . \'/include/aq_resizer.php\';
require_once get_template_directory() . \'/include/moto-sys-req.php\';
require_once get_template_directory() . \'/include/moto-enqueue.php\';
require_once get_template_directory() . \'/include/moto-functions.php\';
require_once get_template_directory() . \'/include/theme_plugin/plugin-activate-config.php\';
require_once get_template_directory() . \'/include/wordpress-reset.php\';
有什么建议吗?
提前谢谢你。
SO网友:Jacob Peattie
您不必用子主题替换整个任意文件。
WordPress将自动在子主题中查找模板的替换项template hierarchy, 以及一些其他文件,如searchform。php或注释。php,但父主题加载的任何其他文件只有在父主题作者构建的子主题中才是可替换的。这包括函数中包含的任何文件。php或在模板中。
对于要被子主题替换的文件,必须使用支持的函数加载该文件。例如,如果一个主题(如您的主题)加载如下文件:
require_once get_template_directory() . \'/include/aq_resizer.php\';
然后,子主题不能替换它。这是因为
\'/include/aq_resizer.php\'
部分路径根本没有通过WordPress。这是WordPress无法拦截的普通PHP包含。此外,
get_template_directory()
将仅是父主题的目录,而不是活动的子主题的目录。
为了能够替换子主题中的整个文件,父主题必须使用以下函数之一加载它:
require_once get_theme_file_path( \'/include/aq_resizer.php\' );
因为文件路径作为参数传递给
get_theme_file_path()
, 函数可以首先查看子主题,而不仅仅是直接传递给PHP的串联字符串,它确实可以这样做。
对于模板,如果父主题使用get_template_part()
, 像这样:
get_template_part( \'partials/content\' );
然后子主题可以创建
partials/content.php
替换它,但如果父主题使用
include partials/content.php
, 那么就不可能用子主题替换。
get_theme_file_path()
更新得多(在4.7) 比get_template_part()
(介绍于3.0), 这样的情况就不那么常见了,在旧的主题中也不存在。它也不广为人知。
在您的代码中,父主题不使用这两种方法中的任何一种,因此无法替换整个文件。这意味着您需要逐个替换各个函数。执行此操作的方法将取决于函数的使用方式。
If the parent theme hooks the function with add_action()
如果父主题挂钩要替换的函数
add_action()
, 然后,您可以通过在子主题中创建新版本的函数(使用不同的名称)来替换该函数,使用
remove_action()
, 然后用
add_action()
:
remove_action( \'hook_name\', \'parent_theme_function_name\' );
add_action( \'hook_name\', \'child_theme_function_name\' );
If the parent theme uses the function in a template file
如果父主题有一个要替换的函数,并且该函数在模板文件中使用,则需要在子主题中创建新版本的函数(使用不同的名称),然后在子主题中替换模板文件,然后在子主题的模板版本中用新函数替换原函数用法。
If the parent theme function is pluggable
父主题在子主题之前加载。这意味着主题开发人员可以通过将子主题封装在
function_exists()
检查这意味着您可以用自己的函数替换函数定义,并且不会导致冲突,因为如果已经定义了,父主题不会尝试重新定义它。
您的代码有一个这样的示例:moto_setup()
函数在此检查内:
if ( ! function_exists( \'moto_setup\' ) ) :
endif;
这使得
moto_setup()
函数“pluggable”,这意味着您可以定义
moto_setup()
函数,而父主题将使用它。
如果不看代码,就无法确定主题中的其他功能是否可以通过这种方式“插入”。
Conclusion
<不一定可以替换子主题中的整个文件。除了少数核心WordPress模板外,父主题必须明确支持可替换的文件。
如果主题没有使函数的文件可替换,则根据父主题的构造方式,有几种替换函数的选项。
根据父主题的构造方式,完全有可能在不替换大块主题的情况下,无法用子主题替换其中的某些部分,否则您不想更改这些部分。这可能会达到一个程度,你最好只是分岔主题并创建一个新的主题。