@fujixfujiko

« これこそ奮闘記では… WordPress管理画面からSSHでプラグインアップデートする云々 | メイン  | PHPってこんな機能もあったんだ?っていう、存在感の薄い仕様について(ユーザ関数編) »

WordPressの子テーマで、親テーマのfunctions.phpを上書きする方法

どうも(p・ω・q)


最近Twenty Tenの子テーマでテンプレートを作ることが多いです。
その方が、自作しなくても一通りの出力系機能を揃えられて楽だからです。


Twenty Tenのすばらしさ(フロントエンドレベル)については
過去に書いたこの記事を読んでみてくださーい。

WordPressの最新デフォルトテーマ、Twenty Tenが良いとされる5つの特徴(まとめ追記)



Twenty Tenは親テーマとしてもよくできていて、テンプレートの中に
子テーマで上書きするときはこういう風にしてください」と詳しく書いてあります。



だがしかし(oΦωΦo)+キラン

functions.phpだけは簡単に行かない機能がチラホラとあるようですよ。







例えば、記事一覧の概要(本文の省略版)の最後にリンクされている「...」とか。
あれ、好きなように変えられるんですけれど、普通に変えてもうまくいきません。


普通って例えばこういう感じ。
l_029.gif
// 親テーマの「...」を出す関数を削除して
remove_filter( 'excerpt_more', 'twentyten_auto_excerpt_more' );
// 子テーマの「...」を出す関数を追加する
add_filter( 'excerpt_more', 'twentyten_auto_excerpt_more_child' );

l_030.gif

なぜうまくいかないのか?

親テーマのfunctions.phpが、子テーマのfunctions.phpより後に読み込まれるからです!


いくつかの関数には、子テーマでも上書きできるように
l_029.gif
if( ! function_exists ( xxxxxxxxxx ) ) {
l_030.gif
という条件分岐がついているのですが、ついていないのもあるんです。


同じ関数名で定義したらPHPに怒られるし、違う関数名で定義したら効かないし。
なんてこった!(@・д・@)



でも解決策はありました。

関数を読み込む順番を操作するんです。


子テーマのfunctions.phpが読み込まれて、親テーマのfunctions.phpが読み込まれて、
その後で、フックをかけた関数を読み込んでもらうのです。

l_029.gif
// 子テーマで上書きしたい設定を書く
if ( ! function_exists( 'child_theme_setup' ) ):
function child_theme_setup() {
    // 「...」の出力関数を子テーマのものに入れ替える
    remove_filter( 'excerpt_more', 'twentyten_auto_excerpt_more' );
    add_filter( 'excerpt_more', 'twentyten_auto_excerpt_more_child' );

    // ダイナミックサイドバーの定義を子テーマのものに入れ替える
    remove_action( 'widgets_init', 'twentyten_widgets_init' );
    add_action( 'widgets_init', 'twentyten_widgets_init_child' );
}
endif;
// 上記の関数を、親テーマの読み込みより後に読み込んでもらう
add_action( 'after_setup_theme', 'child_theme_setup' );

// 「...」の設定
function twentyten_auto_excerpt_more_child( $more ) {
    return '...[<a href="'. get_permalink() . '">more</a>]';
}

// ダイナミックサイドバーの設定
function twentyten_widgets_init_child() {
    //親テーマじゃ4つも定義されてたけど、1つしかいらないよの
    register_sidebar( array(
        'name' => __( 'Primary Widget Area', 'twentyten' ),
        'id' => 'primary-widget-area',
        'description' => __( 'The primary widget area', 'twentyten' ),
        'before_widget' => '<div id="%1$s" class="clearfix widget widget-container %2$s">',
        'after_widget' => '</div>',
        'before_title' => '<h3 class="title">',
        'after_title' => '</h3>',
    ) );
}

l_030.gif


これはいろんな子テーマで重宝すると思いますよー。


参考URLはこちらです。
WordPress :  Support ≫ can i create child functions.php file for twentyten?




(o・ω・o)ノそれではよい週末を~