web-dev-qa-db-fra.com

redéfinit la configuration du thème parent dans child function.php

J'espère que quelqu'un pourra vous aider. Je suis à la recherche de suggestions sur la façon de remplacer/remplacer certaines fonctions qui se chargent dans un thème parent et de les déplacer dans le thème enfant afin que nous puissions modifier les fichiers eux-mêmes dans le thème enfant.

Nous allons "dupliquer" la structure et les fichiers dans le thème enfant, mais nous ne pouvons pas encore trouver un moyen de "décharger" les fichiers de thème parent d'origine, puis charger les fichiers de thème enfant que nous souhaitons modifier à la place.

Ce sont essentiellement tous les fichiers "obligatoires" énumérés ci-dessous que nous allons dupliquer et modifier dans le thème de l'enfant, mais nous devons trouver un moyen de remplacer le fichier parents functions.php.

Nous avons essayé plusieurs façons de faire cela, mais nous n'arrivons tout simplement pas à le faire fonctionner jusqu'à présent.

CECI IS LES FONCTIONS DES PARENTS ACTUELS.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';

Aucune suggestion?

Merci d'avance.

2
CMYK

Vous ne pouvez pas nécessairement remplacer des fichiers arbitraires entiers par un thème enfant.

WordPress recherchera automatiquement dans le thème enfant des remplacements pour les modèles de la hiérarchie template , ainsi que quelques fichiers supplémentaires tels que searchform.php ou comments.php, mais tous les autres fichiers chargés par le thème parent ne sont que des fichiers. remplaçables dans un thème enfant si l'auteur du thème parent les a construites. Cela inclut tous les fichiers inclus dans functions.php ou dans les modèles.

Pour qu'un fichier puisse être remplacé par un thème enfant, il doit être chargé à l'aide de fonctions prises en charge. Par exemple, si un thème (comme le vôtre) charge un fichier comme celui-ci:

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

Ensuite, un thème enfant ne peut pas le remplacer. En effet, la partie '/include/aq_resizer.php' du chemin ne passe pas du tout par WordPress. C'est un PHP normal que WordPress ne peut pas intercepter. De plus, get_template_directory() ne sera jamais que le répertoire du thème parent, pas le thème enfant s'il est actif.

Pour qu'il soit possible de remplacer un fichier entier dans un thème enfant, le thème parent doit le charger avec l'une des fonctions suivantes:

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

Étant donné que le chemin d'accès au fichier est transmis en tant qu'argument à get_theme_file_path(), plutôt que d'être simplement une chaîne concaténée transmise directement à PHP, il est possible que la fonction examine d'abord le thème enfant, ce qui est le cas.

Pour les modèles, vous si le thème parent utilise get_template_part(), comme ceci:

get_template_part( 'partials/content' );

Ensuite, le thème enfant peut créer partials/content.php pour le remplacer, mais si le thème parent utilise include partials/content.php, il n'est pas possible de le remplacer par un thème enfant.

get_theme_file_path() est beaucoup plus récent (introduit dans 4.7) que get_template_part() (introduit dans 3.0), il est donc beaucoup moins courant et inexistant dans les thèmes plus anciens. Ce n'est pas non plus largement connu.

Dans votre code, le thème parent n'utilise aucune de ces méthodes, il est donc impossible de remplacer le fichier entier. Cela signifie que vous devrez remplacer les fonctions individuelles une par une. La méthode à suivre dépend de la manière dont la fonction est utilisée.

Si le thème parent accroche la fonction avec add_action()

Si le thème parent accroche la fonction que vous souhaitez remplacer par add_action(), vous pouvez alors la remplacer en créant une nouvelle version de la fonction dans votre thème enfant (avec un nom différent), en décrochant la fonction d'origine avec remove_action() , puis accrocher votre nouvelle fonction avec add_action() :

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

Si le thème parent utilise la fonction dans un fichier modèle

Si le thème parent a une fonction que vous souhaitez remplacer et que cette fonction est utilisée dans un fichier modèle, vous devrez créer une nouvelle version de la fonction dans votre thème enfant (avec un nom différent), puis remplacer le fichier modèle dans votre thème enfant, puis dans la version du modèle de votre thème enfant, remplacez l'utilisation de la fonction d'origine par votre nouvelle fonction.

Si la fonction de thème parent est connectable

Les thèmes parents sont chargés avant le thème enfant. Cela signifie qu'il est possible pour les développeurs de thèmes de rendre les fonctions remplaçables par des thèmes enfants en les encapsulant ensuite dans une vérification function_exists(). Cela signifie que vous pouvez remplacer la définition de fonction par votre propre fonction, ce qui ne causera pas de conflit, car le thème parent n'essaiera pas de le redéfinir si vous en avez déjà un.

Votre code en a un exemple: la fonction moto_setup() est à l'intérieur de cette vérification:

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

Cela rend la fonction moto_setup() "connectable", ce qui signifie que vous pouvez définir une fonction moto_setup() dans votre thème enfant et que le thème parent l'utilisera à la place.

Il est impossible de dire si d'autres fonctions de votre thème sont "connectables" sans voir le code.

Conclusion

  • Il n'est pas nécessairement possible de remplacer des fichiers entiers dans des thèmes enfants. En dehors d'une poignée de modèles WordPress principaux, le thème parent doit explicitement prendre en charge les fichiers remplaçables.
  • Si le thème n'a pas rendu les fichiers de fonctions remplaçables, plusieurs options permettent de remplacer des fonctions, en fonction de la construction du thème parent.
  • Selon la manière dont le thème parent a été construit, il est tout à fait possible que certaines parties soient impossibles à remplacer par un thème enfant sans remplacer d’énormes morceaux du thème que vous ne voudriez pas modifier autrement. Cela peut arriver à un point où il est préférable d’introduire le thème et d’en créer un nouveau.
2
Jacob Peattie

OK, après des semaines de travail avec les développeurs de Moto Theme Pro v3, ils ne parviennent pas à faire fonctionner le thème enfant comme il le devrait.

Le thème n'adhère pas à la "meilleure pratique" en matière de codage, le thème enfant ne peut pas remplacer le thème parent sans un codage supplémentaire étendu dans le fichier functions.php et, dans l'ensemble, est un peu le bordel.

Nous avons abandonné.

0
CMYK

Simplement utiliser

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

sans vérifier si la fonction existe ou non. Cette fonction remplacera la moto_setup() déclarée dans le thème parent.

0
Pim