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

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

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

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

PHP

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

Q&A

解決済

1回答

1154閲覧

wordpress プラガブル関数の実装(ファイル内の特定のユーザー定義関数の制御について)

ito_yu

総合スコア5

WordPress

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

PHP

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

0グッド

0クリップ

投稿2021/04/16 04:56

編集2021/05/04 01:03

前提・実現したいこと

私は、wordpressをベースとしたCMSシステムの提供を行なう企業に務めています。
今回wordpressコアのバージョンアップを行うにあたって、現環境のwordpressのソースコードをかなり書き換えていたため、
このバージョンアップ改修を期に今後はコアへの直接の改修を無くし、独自に作成するプラグイン内でフックを使って既存の仕様を再現できるよう実装を行なっています。

そこで設計について皆様の意見をお聞かせ頂きたいと思います。

現行のプログラムでは、独自プラグイン内でwp-includes\pluggable.php内に定義されているプラガブル関数を使いたい独自関数があるため、pluggable.phpの読み込み前に必要な関数のソースコードをそのまま独自プラグイン内にコピーしてしまっています。

これによって、対象のプラガブル関数は利用できるようになっていますが、このままではこの先のwordpressバージョンアップ時にpluggable.phpの最新のソースより古いソースの関数が使われる可能性があります。

『バージョンアップのたびにコピー先の関数のソースも更新するしか無い』と考えていますが、皆様ならどう対応しますか?
ご意見頂けますとありがたいです。

なお、下記のコードはwordpressを使っていない方でも理解できるように雑に簡略化して書いたコードです。

以下追記

分かりにくかった為、箇条書きでまとめてみました。

■前提
1.wordpressの仕様として、各プラグインディレクトリ内(mu-plugin,plugin)のphpが読み込まれてから『pluggable.php』が読み込まれる。この時、pluggable.php内では既に定義済みの関数を定義しない様に実装されている。
2.上記プラグインディレクトリ内のphpの中で、『pluggable.php』内の関数を使いたい。(該当ソースの『myOverride.php』に定義されているfunction aにあたります。)
3.『pluggable.php』などWordpressのコアファイルに事前に実装されているものは、プラグインディレクトリ内を除いて、ソースの改変をしたくない。(今後のバージョンアップ時の保守に影響するため)

■検討した内容
『pluggable.php』に記載されているfunction aのソースをプラグイン内のファイルで先に定義しようと考えました。
しかし、プラグイン内でfunction aを使いたいという問題が解決する代わりに、今後Wordpress自体の更新により『pluggable.php』内のfunction aが更新された場合、そのソースをプラグイン内のfunction a定義箇所にマージする必要が発生します。

可能であれば、Wordpressの更新時(『pluggable.php』のfunction aに変更があった際)にプラグインを修正することは避けたいです。

これは個人的な考えですが、『pluggable.php』の関数を予め定義できる理由として、『事前に使いたい為』ではなく『メソッドの挙動を変えたい為』の仕様と考えており、プラグイン内で利用したいという理由で同一のソースコードをプラグイン内でも定義するというのは、良いやり方ではないと考えています。

該当のソースコード

php

1// myOverride.php 2/**** 3 * pluggable.php内の関数定義をここでインクルードできれば、コアのバージョンアップ時にこのファイルを改修する必要がない 4 * ただし全ての関数を読み込みたい訳ではないのでpluggable.phpのインクルードではなく、function aの定義のみ読み込みたい 5 ****/ 6function a(){ 7 echo 'func a ver1.0'; 8} 9 10include_once('pluggable.php'); 11 12// ------------------------------------------------- 13// pluggable.php 14if(function_exists('a')){ 15 function a(){ 16 echo 'func a ver1.0'; 17 // echo 'func a ver1.1'; pluggable.phpが更新されて1.1になったらmyOverride.phpも更新する必要がある 18 } 19} 20 21if(function_exists('b')){ 22 function b(){ 23 echo 'func b ver1.0'; 24 } 25}

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

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

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

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

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

satokei

2021/04/28 10:05

事前に読み込みたい関数だけ別ファイルにすることはできないのですか? (pluggable.php 側でも別ファイルを include する
ruuusaamarki

2021/05/03 11:16

>独自プラグイン内でwp-includes\pluggable.php内に定義されているプラガブル関数を使いたい独自関数があるため、pluggable.phpの読み込み前に必要な関数のソースコードをそのまま独自プラグイン内にコピーしてしまっています。 ↑この部分がよくわかりませんでしたので可能でしたら追記をお願いいたします。 wp-includes\pluggable.phpに定義されている以外の wpコア定義関数を独自プラグインにコピーしているor読み込んでいるということはありますでしょうか。
ito_yu

2021/05/04 01:59

内容が分かりにくかった為、まとめ直しました。 以下についても記載を加えています。 ・実装時に検討していた内容
ito_yu

2021/05/04 06:39

何度も後出ししてしまい、すみません。 pluggable.phpをプラグイン読み込みより前にincludeしてしまう事も検討していたのですが、読み込んでいる別のプラグイン内でpluggable.php内の一部のメソッドを定義しており、このプラグイン内の処理が、function_existsによる重複定義の回避を行なっていない(本来の流れである『プラグイン読み込み完了→pluggable.phpのinclude』を意識して実装されている)為、pluggable.phpの読み込み順の変更は見送りました。 その為、プラグイン読み込み後にpluggable.phpのincludeを行う事は外せないかと思います。
ruuusaamarki

2021/05/04 06:58

追記ありがとうございます。 認識のすり合わせをお願い致します。 wpが処理をすすめる中で`plugins_loaded`アクションの 実行されるタイミングとしては プラグイン読み込み → pluggable.php読み込み → plugins_loadedアクション という流れで実行されplugins_loadedアクションで pluggable.php内に定義されている関数をもう一度呼び出して使う というような動きになると思いますがこちらでも難しそうでしょうか。 https://qiita.com/SwuBHj8aKGqBKHet/items/fd76291de21e1257eb1c >別のプラグイン内でpluggable.php内の一部のメソッドを定義して こちらに関しても`plugins_loaded`アクションが使用できるのでは?と考えましたが 問題が起こりそうでしょうか。
guest

回答1

0

ベストアンサー

myOverride.php(独自プラグイン)のfunction aと
pluggable.phpのfunction aが同じ

つまりpluggable.phpのfunction aを
独自プラグイン内のmyOverride.phpにコピーして使っている
という前提で回答してみたいと思います。

pluggable.phpにかかれている関数(コア依存)は
プラグインで同名の関数が定義されていた場合は実行されないようです。

https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%AC%E3%83%96%E3%83%AB%E9%96%A2%E6%95%B0

ですから現状のままでコアとの疎結合(分離)が出来ている状態だと思います。

解釈が違っていましたらご指摘いただければと思います。

投稿2021/05/03 11:08

編集2021/05/03 11:10
ruuusaamarki

総合スコア470

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

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

ito_yu

2021/05/04 01:20

ご回答頂きありがとうございます。 頂いた回答の通りでpluggable.phpに改修を加えていないため、コアとの分離は出来ており、処理としては問題ありません。 しかし、個人的に気になっている点として、『コアに関数定義のソースが含まれているにも関わらず、同じソースをプラグイン内にコピーしなければならない』というのが、如何なものかと考えています… 『同一のコードが重複してしまう事(多重定義にならない事は分かっていますが、実装方法としての違和感)』『コアに変更があった場合、myOverride.phpのfunction aも更新しなければいけない事』を諦めればいいのですが、なにか良い方法が無いかと考えています。 むちゃくちゃな事を言っているのだと分かっていますが、『ファイル内の特定の関数の定義のみを読み込む』なんて事ができればと思っています(^_^;)
ito_yu

2021/05/31 23:14

色々と検討しましたが、やはりpluggable.phpの関数をコピーする方法で進めたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問