質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • WordPress

    7659questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Wordpress 子テーマのphpが反映されません

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,069

375

score 2

 前提・実現したいこと

WordPress 初心者です。子テーマを知らずに親テーマを少し触ってしまったので
あわてて子テーマを作っています。
style.css はなんとか子テーマのものが反映されているようですが、
phpがうまく反映されません。いろいろ調べてみましたがどうにもならないので
お分かりになる方、何がいけないのか教えていただけると助かります。
宜しくお願いいたします。

 発生している問題・エラーメッセージ

テーマはSydney

親テーマと並列に子テーマを作成
子テーマには、以下を格納
・style.css
・function.php
・widgets フォルダ その配下に fp-latest-news.php(←親テーマと同じ階層構造)

 該当のソースコード

function.phpの中身は以下
ーーーーーーーーーーーーーーーーーーーーーーーー
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
wp_enqueue_style( 'child-style',
get_stylesheet_directory_uri() . '/style.css',
array('parent-style')
);
}
?>
ーーーーーーーーーーーーーーーーーーーーーーーーー
fp-latest-news.php は、親のファイルをそのままコピー

 試したこと

親テーマの fp-latest-news.php を触るとサイトに反映されますが、
子テーマの fp-latest-news.php の同じ個所を触っても反映されません。
(つまり、子テーマのphpファイルが反映されない)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

そもそも前提として
テーマのサブディレクトリにあるものは基本require等で読み込ませないと使用できません。
親テーマのfunctions.phpでrequireされているはずです

これは子テーマも同じで、子テーマのサブディレクトリに配置したものは、他の子テーマファイルみたいにコピーしただけでは上書きされません。
ですので子テーマのfunctions.phpで該当のファイルを読み込ませてあげる必要があります。

require_once(get_stylesheet_directory_uri().'/widgets/fp-latest-news.php'):

中身を見てないのですがウィジェットであればファイル内にクラスが定義されているはずなので、親テーマのクラスをオーバーライドするように編集してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 11:45

    なるほど、サブディレクトリのものはそのままではだめだったんですね。ありがとうございます。やってみます。

    キャンセル

  • 2018/09/23 11:32 編集

    解決しましたか?

    同じような問題があり、こちらのページにたどり着きました。
    子テーマに上記の「require_once」を書くとエラーが出ます。
    WordPress公式ページでもそう書いてあるのに、書く場所がおかしいのでしょうか。
    http://wpdocs.osdn.jp/%E5%AD%90%E3%83%86%E3%83%BC%E3%83%9E

    キャンセル

+2

ファイルの階層は375さんが書かれているままで、子テーマのfunctions.phpに親テーマのfunctions.phpから以下をコードを持ってきて一部書き換えてください。

function sydney_widgets_initx() { //関数名を変更
    register_sidebar( array(
        'name'          => __( 'Sidebar', 'sydney' ),
        'id'            => 'sidebar-1',
        'description'   => '',
        'before_widget' => '<aside id="%1$s" class="widget %2$s">',
        'after_widget'  => '</aside>',
        'before_title'  => '<h3 class="widget-title">',
        'after_title'   => '</h3>',
    ) );

    //Footer widget areas
    $widget_areas = get_theme_mod('footer_widget_areas', '3');
    for ($i=1; $i<=$widget_areas; $i++) {
        register_sidebar( array(
            'name'          => __( 'Footer ', 'sydney' ) . $i,
            'id'            => 'footer-' . $i,
            'description'   => '',
            'before_widget' => '<aside id="%1$s" class="widget %2$s">',
            'after_widget'  => '</aside>',
            'before_title'  => '<h3 class="widget-title">',
            'after_title'   => '</h3>',
        ) );
    }

    //Register the front page widgets
    if ( defined( 'SITEORIGIN_PANELS_VERSION' ) ) {
        register_widget( 'Sydney_Latest_Newsx' ); //クラス名を変更
    }

}
add_action( 'widgets_init', 'sydney_widgets_initx' );

if ( defined( 'SITEORIGIN_PANELS_VERSION' ) ) {
    require get_stylesheet_directory() . "/widgets/fp-latest-news.php"; //表示したいファイル
}

変更したい子テーマのfp-latest-news.phpのファイルのクラス名をfunctions.phpで書き換えたクラス名に変更

class Sydney_Latest_Newsx extends WP_Widget { //クラス名を変更

参考:https://teratail.com/questions/84520

親テーマの上書きではなく、新たに同じ関数を付け加える形ですが……。

参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 11:46

    詳しく、ありがとうございます!
    やってみます。

    キャンセル

0

念のため確認ですが、
Wordpressのメニューから「外観」→「テーマ」のテーマは、
子テーマに変更されましたか?

これを変更すると、
テーマのカスタマイズした内容が全て消えますので、
ご注意ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/05 23:26

    子テーマの有効化は行いました。そういう意味ではないのでしょうか? 
    申し訳ありませんが、もう少し詳しく教えていただけませんか?

    キャンセル

0

子テーマか親テーマの選択をかけるには
基本的にはget_template_part
でなければget_theme_file_path

親テーマ
template_directory()
template_directory_uri()

子テーマ
stylesheet_directory()
stylesheet_directory_uri()

子テーマになければ親テーマ
get_theme_file_path()
get_theme_file_uri()
get_template_part()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 11:48

    回答ありがとうございます。ただ申し訳ありませんが、これだけだとよくわかりません。

    キャンセル

  • 2018/02/06 12:14

    子テーマを扱うにあたっては覚えておかないといけないことなので
    これらの関数の使い分けについては把握しておくことをお勧めします

    要するに
    include(get_template_directory().'/fp-latest-news.php');
    みたいに書かれてたら子テーマを探さないので
    include(get_theme_file_path('fp-latest-news.php'));
    とか
    get_template_part('fp-latest-news');
    みたいに書き直さないとダメですよってことです

    functions.php
    style.css
    index.php
    とかの基本のファイルと
    home.php
    archive.php
    single.php
    とかみたいな
    WPの表示テンプレート選択の対象のファイルについては
    ファイルがあるだけで
    「子テーマにあれば子テーマなければ親テーマのもの」
    といった選択の対象ですが
    それ以外はこれらの関数によって
    「子テーマのものを使う」
    「親テーマのものを使う」
    「子テーマになければ親テーマのものを使う」
    といった切り替えをします

    クラスの定義ファイルとかなんかは
    子テーマで上書きするんではなく
    拡張して使ってくれってことで
    「親テーマのものを使う」
    というようにしているかもしれません

    キャンセル

  • 2018/02/06 14:33

    ご丁寧にありがとうございます!(何度もスミマセン)
    他の皆さまの回答も含めて、やってみます。

    キャンセル

同じタグがついた質問を見る

  • WordPress

    7659questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。