web-dev-qa-db-ja.com

子関数の親テーマ設定を上書きする

誰かが手伝ってくれることを願っています。親テーマにロードされているいくつかの関数をオーバーライド/置き換えて子テーマに移動する方法についての提案を探しているので、子テーマのファイル自体を変更できます。

構造とファイルを子テーマに「複製」しますが、元の親テーマファイルを「アンロード」してから変更したい子テーマファイルを読み込む方法をまだ見つけることができません。

基本的に、以下にリストされているすべての "require"ファイルが、子テーマで複製および変更されますが、両親のfunctions.phpをオーバーライドするための何らかの方法を見つける必要があります。

これを行うために複数の方法を試しましたが、今のところうまく機能するようには思えません。

このIS現在の親の関数FUNCTIONS.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をまったく通過していないためです。 WordPressが傍受できないのは通常のPHPインクルードです。さらに、get_template_directory()は親テーマへのディレクトリになるだけで、子テーマがアクティブな場合は子テーマにはなりません。

子テーマ内のファイル全体を置き換えることができるようにするためには、親テーマは次のいずれかの関数でそれをロードする必要があります。

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

ファイルパスは単にPHPに直接渡される連結された文字列ではなくget_theme_file_path()への引数として渡されるので、関数が最初に子テーマを調べることは可能です。

テンプレートの場合、親テーマがget_template_part()を使用している場合は、次のようになります。

get_template_part( 'partials/content' );

それから子テーマはそれを置き換えるためにpartials/content.phpを作ることができます、しかし親テーマがinclude partials/content.phpを使うならば、それは子テーマで置き換えることは不可能です。

get_theme_file_path()get_template_part()3.0で導入された)よりもずっと新しく(4.7で導入された)、それほど一般的ではなく、古いテーマでは存在しません。それも広く知られていません。

あなたのコードでは、親テーマはこれらのメソッドのどちらも使用していないので、ファイル全体を置き換えることは不可能です。つまり、個々の機能を1つずつ置き換える必要があります。これを行う方法は、関数の使い方によって異なります。

親テーマが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