重写子函数中的父主题配置。php

时间:2018-07-29 作者:CMYK

希望有人能提供帮助,我正在寻找一些关于如何重写/替换父主题中加载的某些函数并将其移动到子主题中的建议,以便我们可以在子主题中对文件本身进行更改。

我们将把结构和文件“复制”到子主题中,但还无法找到方法“卸载”原始父主题文件,然后加载我们想要更改的子主题文件。

本质上,我们将在子主题中复制和更改下面列出的所有“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\';
有什么建议吗?

提前谢谢你。

3 个回复
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模板外,父主题必须明确支持可替换的文件。

如果主题没有使函数的文件可替换,则根据父主题的构造方式,有几种替换函数的选项。

根据父主题的构造方式,完全有可能在不替换大块主题的情况下,无法用子主题替换其中的某些部分,否则您不想更改这些部分。这可能会达到一个程度,你最好只是分岔主题并创建一个新的主题。

SO网友:Pim

简单使用

function moto_setup() { 
  // Your new moto_setup function
}
不检查函数是否存在。该函数将覆盖moto_setup() 在父主题中声明。

SO网友:CMYK

好的,在与Moto Theme Pro v3的开发人员合作数周后,他们无法让子主题正常工作。

主题不遵循“最佳实践”编码,如果函数中没有大量的额外编码,子主题无法覆盖父主题。php文件和整体有点混乱。

我们已经放弃了。

结束

相关推荐

对WooCommerce的Functions.php更改不起作用

我正在尝试将其添加到函数中。php。在我的另一个站点上的测试实验室中,它可以很好地添加测试信息。但在这个网站上,我试图把它添加到什么都没有发生的情况下。该网站正在使用最新的woocommerce运行一个建筑节俭主题。有什么想法吗?我基本上只是想在每个产品页面上添加一行类似于免责声明但无法添加的文本。add_action(\'woocommerce_before_add_to_cart_form\',\'print_something_below_short_description\');