it-roy-ru.com

переопределить конфигурацию родительской темы в дочерних функциях.

Надеюсь, что кто-то может помочь, я ищу некоторые предложения о том, как переопределить/заменить некоторые функции, которые загружаются в родительской теме, и переместить их в дочернюю тему, чтобы мы могли вносить изменения в сами файлы дочерней темы.

Мы "продублируем" структуру и файлы в дочернюю тему, но пока не можем найти способ "выгрузить" исходные файлы родительской темы, а затем загрузить файлы дочерней темы, которые мы хотим изменить.

По сути, это все "требуемые" файлы, перечисленные ниже, которые мы будем дублировать и изменять в дочерней теме, но нужно найти способ переопределить родительский файл functions.php.

Мы пытались сделать это несколькими способами, но пока никак не можем заставить его работать.

ЭТО IS ТЕКУЩИЕ РОДИТЕЛЬСКИЕ ФУНКЦИИ.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';

Какие-либо предложения?

Заранее спасибо.

2
CMYK

Вы не можете обязательно заменить целые произвольные файлы дочерней темой.

WordPress автоматически ищет в дочерней теме замены шаблонов в шаблонной иерархии , а также пару дополнительных файлов, таких как searchform.php или comments.php, но любые другие файлы, которые загружает родительская тема, являются только заменяется в дочерней теме, если автор родительской темы создал их так, чтобы они были. Это включает любые файлы, включенные в functions.php или в шаблоны.

Чтобы файл можно было заменить дочерней темой, его необходимо загрузить с использованием поддерживаемых функций. Например, если тема (как ваша) загружает файл следующим образом:

require_once get_template_directory() . '/include/aq_resizer.php';

Затем дочерняя тема не может заменить ее. Это связано с тем, что часть пути '/include/aq_resizer.php' вообще не проходит через WordPress. Это обычное PHP включение, которое WordPress не может перехватить. Кроме того, 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 ), поэтому гораздо реже и не существует в старых темах. Это также не широко известно.

В вашем коде родительская тема не использует ни один из этих методов, поэтому просто невозможно заменить весь файл. Это означает, что вам нужно будет заменить отдельные функции одну за другой. Метод для этого будет зависеть от того, как используется функция.

Если родительская тема перехватывает функцию с помощью add_action()

Если родительская тема перехватывает функцию, которую вы хотите заменить на add_action(), вы можете заменить функцию, создав новую версию функции в вашей дочерней теме (с другим именем), отсоединив исходную функцию с помощью remove_action() , затем подключите вашу новую функцию с помощью add_action() :

remove_action( 'hook_name', 'parent_theme_function_name' );
add_action( 'hook_name', 'child_theme_function_name' );

Если родительская тема использует функцию в файле шаблона

Если в родительской теме есть функция, которую вы хотите заменить, и эта функция используется в файле шаблона, то вам нужно будет создать новую версию функции в вашей дочерней теме (с другим именем), а затем заменить файл шаблона в дочерней теме, затем в версии шаблона дочерней темы замените исходное использование функции новой функцией.

Если функция родительской темы подключаема

Родительские темы загружаются до дочерней темы. Это означает, что разработчики тем могут сделать функции заменяемыми дочерними темами, включив их в проверку function_exists(). Это означает, что вы можете заменить определение функции своей собственной функцией, и это не вызовет конфликта, потому что родительская тема не будет пытаться переопределить его, если у вас уже есть.

Ваш код имеет пример этого: функция moto_setup() находится внутри этой проверки:

if ( ! function_exists( 'moto_setup' ) ) :
endif;

Это делает функцию moto_setup() "подключаемой", что означает, что вы можете определить функцию moto_setup() в своей дочерней теме, и родительская тема будет использовать ее вместо этого.

Являются ли другие функции в вашей теме "подключаемыми" таким образом, невозможно определить, не увидев код.

Вывод

  • Не обязательно можно заменить целые файлы в дочерних темах. Помимо нескольких основных шаблонов WordPress, родительская тема должна явно поддерживать заменяемые файлы.
  • Если тема не сделала заменяемыми файлы функций, есть несколько вариантов замены функций в зависимости от того, как была создана родительская тема.
  • В зависимости от того, как была создана родительская тема, вполне возможно, что есть ее части, которые невозможно заменить дочерней темой, не заменяя огромные куски темы, которые иначе вы не захотите менять. Это может привести к тому, что вам лучше просто разветвить тему и создать новую.
2
Jacob Peattie

Хорошо, после нескольких недель работы с разработчиками Moto Theme Pro v3, они не могут заставить дочернюю тему работать как надо.

Тема не придерживается кодировки "наилучшей практики", дочерняя тема не может переопределить родительскую тему без обширного дополнительного кодирования в файле functions.php, и в целом это немного путаница.

Мы отказались от этого.

0
CMYK

Просто использовать

function moto_setup() { 
  // Your new moto_setup function
}

без проверки, если функция существует или нет. Эта функция переопределит функцию moto_setup(), объявленную в родительской теме.

0
Pim