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

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

新規登録して質問してみよう
ただいま回答率
85.49%
WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

864閲覧

WordPress テンプレートを読み込んでから、その一部を変更したい。

igawayoshihisa

総合スコア1

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/11/06 07:34

前提・実現したいこと

WordPressで、寄稿記事専用のテンプレートを作成しようとしています。
既存のテンプレート(親テーマ内のsingle.php)を、子テーマに用意したsingle-contribution.phpで読み込んでから、その一部分だけ内容変更したいと思っています。

わざわざ子テーマに用意するのは、親テーマに手を加えても、親テーマのバージョンアップで消えてしまうためです。
とはいえ、親テーマでsingle.phpが更新されたら、全体としてはその内容を引き継ぎながら、という形にしたいです。

<変更内容イメージ>
0.  include(TEMPLATEPATH . '/single.php')でsingle.phpを読み込む
0.  その中身にある
<?php getsidebar(); ?>を書き換えて、
<?php getsidebar('contribution'); ?> にする。

  (sidebar-contribution.phpで、寄稿記事用のサイドバーを用意してある)

調べたところ、str_replaceで文字の置き換えができるとのことで、以下のようなコードを試しましたが、うまくいきません。

どういった方法なら実現可能でしょうか?

試したこと1

テンプレートは読み込みますが、サイドバーは変わっていませんでした。

php

1<?php 2/** 3 * Template Name: 寄稿用テンプレート2 4 * Template Post Type: page, post 5 */ 6?> 7<?php 8include(TEMPLATEPATH . '/single.php'); 9$str = get_sidebar(); 10$str = str_replace("get_sidebar()", "get_sidebar('contribution')", $str); 11 echo $str; 12?>

試したこと2

ネットで見つけたコードを元に、以下を試しましたが、機能しませんでした。
single.phpは、子テーマフォルダの直上のフォルダにあります。

php

1<?php 2$content = file_get_contents("../single.php"); 3echo okikae($content); 4 5function okikae($str){ 6return str_replace("get_sidebar()","get_sidebar('contribution')",$str); 7} 8?>

補足情報(FW/ツールのバージョンなど)

WordPress5.5.3、PHP7.4です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PHPのコードを加工してから実行しようという試みはリスキーかつちょっと面倒なので
基本的に別の方法を考えた方がいいです

upgrader_process_completeってフックが更新時に走るらしいので
親テーマが更新されたら当該テンプレートをfile_get_contentsして加工してから
子テーマの方にfile_put_cotentsしておく、みたいなやり方の方がマシな気がします

一応PHPのコードを加工してから実行する場合の手順だけ

  1. ファイルのコードを文字列として取得
  2. コードの文字列を加工
  3. 一時ファイルを作成して加工したコードを書き込み
  4. 作成した一時ファイルをinclude

必要な関数は
fopen
fwrite
tempnam
sys_get_temp_dir
あたり

面倒でリスキーでパフォーマンスも低い
いいことないです

投稿2020/11/06 09:47

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igawayoshihisa

2020/11/08 03:11

ご回答ありがとうございました。 リスキーでパフォーマンスも低いとのことで、別の方法でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問