こんにちは
この処理はどこで実行される想定なのでしょうか?
この処理を投稿を取得可能なフックかテンプレートで実行するのなら、get_post()
で投稿を取得できます。
そもそもget_post()
で投稿を取得できないタイミングで実行してしまうとグローバルの$postもセットされていないので、どこからも現在の投稿を取得することができないので実行できないのではないでしょうか。
munyaguさんコメントありがとうございます!
実行するのは以下の場所で考えています。
wp-content/plugins/test-oo-plugin/test-oo-plugin.php
または
themes/page.php
ただ実行場所も含めて迷いがあり、おすすめがありましたら知りたいです。
仰る通りフックで実行するかテンプレートで実行すれば
get_post()などの実行はできます。
ただtest-oo-plugin.phpのクラス内メンバ変数からreturnで値を返したい時に
フックを使う場合だとreturnが返せないと思います。(何か方法があれば知りたいです)
public function __construct () {
add_action( 'wp', array( $this, 'connect_function' ) );
return $this->base_information;
}
↑としてもフック経由で実行された値が入っていない。
public function connect_function () {
$this->my_Oo_function();
$this->get_post_id();
return $this->base_information;
}
↑こちらも同じ理由
private function get_post_id () {
$post_data = get_post();
array_push( $this->base_information, $post_data->ID );
return $this->base_information;
}
↑こちらも返るのはconnect_function()の部分までで
結局クラス外に出すことができない?そこでいっそのことpage.phpでクラスをインスタンス化し
関数を定義すれば一応実行させることができました。
【test-oo-plugin.php】
class Test_Oo_Plugin {
/**
* コンストラクタを削除
public function __construct () {
add_action( 'wp', array( $this, 'connect_function' ) );
}
*/
/**
* 基本情報を格納する配列
*/
private $base_information = array();
/**
* add_actionに橋渡しする関数
*/
public function connect_function () {
$this->my_Oo_function();
$this->get_post_id();
return $this->base_information;
}
/**
* 現在のユーザー名を取得し配列に格納
*/
private function my_Oo_function () {
$my_original_current_user = wp_get_current_user();
array_push( $this->base_information, $my_original_current_user->user_login );
}
/**
* 現在のIDを取得し配列に格納
*/
private function get_post_id () {
$post_data = get_post();
array_push( $this->base_information, $post_data->ID );
}
}
function user_function($information_instans) {
foreach ( $information_instans as $key => $value ) {
echo '<br><hr><br>' . $key . ':' . $value . '<br><hr><br>';
}
}
【page.php】
$test_oo_plugin = new Test_Oo_Plugin();
user_function( $test_oo_plugin->connect_function() );
上記で動くことは動きますが以下の点が気になっております。
・後から読んだ際の可読性が悪くなりそう
(この辺りは自分の経験が少ないのでご意見を伺いたいです。)
・このまま拡張すると処理がテーマ→プラグイン→テーマ・・・となりそうなので
プラグイン内で完結できる方法、add_action経由でreturn返す方法があれば知りたいです。
・get_postなどの関数はグローバル変数に値を保存するように作られていると思います。
今回のようにカプセル化をする必要がないと考えて設計したほうが良いのでしょうか。
またご不明点などありましたら突っ込んでいただければ幸いです。
よろしくお願いいたします。
munyaguさんコメントありがとうございます!
実行するのは以下の場所になります。
wp-content/plugins/test-oo-plugin/test-oo-plugin.php
または
themes/page.php
仰る通りフックで実行するかテンプレートで実行すれば
get_post()などの実行はできます。
ただメンバ変数からreturnで値を返したい時に
フックを使う場合だとreturnが返せないと思います。(何か方法があれば知りたいです)
public function __construct () {
add_action( 'wp', array( $this, 'connect_function' ) );
return $this->base_information;
}
↑としてもフック経由で実行された値が入っていない。
public function connect_function () {
$this->my_Oo_function();
$this->get_post_id();
return $this->base_information;
}
↑こちらも同じ理由
private function get_post_id () {
$post_data = get_post();
array_push( $this->base_information, $post_data->ID );
return $this->base_information;
}
↑こちらも返るのはconnect_function()の部分までで
結局クラス外に出すことができない?
そこでいっそのことpage.phpでクラスをインスタンス化し
関数を定義すれば一応実行させることができました。
wp-content/plugins/test-oo-plugin/test-oo-plugin.php
class Test_Oo_Plugin {
/**コンストラクタを外す
public function __construct () {
add_action( 'wp', array( $this, 'connect_function' ) );
}
*/
/**
* 基本情報を格納する配列
*/
private $base_information = array();
/**
* この関数をテーマのpage.phpで呼び出す。
*/
public function connect_function () {
$this->my_Oo_function();
$this->get_post_id();
return $this->base_information;
}
/**
* 現在のユーザー名を取得し配列に格納
*/
private function my_Oo_function () {
$my_original_current_user = wp_get_current_user();
array_push( $this->base_information, $my_original_current_user->user_login );
}
/**
* 現在のIDを取得し配列に格納
*/
private function get_post_id () {
$post_data = get_post();
array_push( $this->base_information, $post_data->ID );
}
}
function user_function($information_instans) {
foreach ( $information_instans as $key => $value ) {
echo '<br><hr><br>' . $key . ':' . $value . '<br><hr><br>';
}
}
themes/page.php
$test_oo_plugin = new Test_Oo_Plugin();
user_function($test_oo_plugin->connect_function ());
上記で動くことは動きますが以下の点が気になっております。
・後から読んだ際の可読性が悪くなりそう
(この辺りは自分の経験が少ないのでご意見を伺いたいです。)
・処理がテーマ→プラグイン→テーマ・・・となりそうなので
プラグイン内で完結できる方法などがあれば知りたいです。
・get_postなどの関数はグローバル変数に値を保存するように作られていると思います。
今回のようにカプセル化をする必要がないと考えて設計したほうが良いのでしょうか。
仰る通りフックで実行するかテンプレートで実行すれば
get_post()などの実行はできます。
ただメンバ変数からreturnで値を返したい時に
フックを使う場合だとreturnが返せない
ちょっとうまく伝わっていないかもしれないのですが、書かれているクラスはフックかテンプレートでインスタンス化するのであれば、そのインスタンスが使われるのはそのフックかテンプレートの中なのでメンバー変数から値を取得できるという意味です。
プラグイン読み込み時点でインスタンス化する目的が何かは分かりませんが、それよりもインスタンス化時点でpostやユーザーを取得している理由は何でしょうか?
インスタンス化時点で取得できないなら、使うときに取得してメンバーにセットすれば良いと思います。
使うときには当然取得できると思いますし、使う時点まではメンバーにセットされている必要もありません。
また、ご自身だけで使うクラスについて、カプセル化が必要か必要でないかは、ご自身で判断して決めるしかないと思います。
私には何のためのクラスかも分からないので。
WordPressやphoに限らず、あらゆるフレームワークではいつ、何を取得できるのかは制限があります。
クラス設計ではフレームワークに合わせていつインスタンス化し、いつメンバーに値をセットし、いつ取り出すかを慎重に設計する必要があります。
それらをいつやるのかは目的・用途によって様々なので、一般論で定義するのは難しい気がします。
幸い、WordPressでは非常に多くのプラグインやテーマのソースが公開されているので、それらを参考にしてみてはどうでしょうか。
munyaguさん度々のコメントありがとうございます。
クラス設計ではフレームワークに合わせていつインスタンス化し、いつメンバーに値をセットし、いつ取り出すかを慎重に設計する必要があります。
なるほど、ありがとうございます!参考になりました!
再度プラグインを色々見てみたいと思います。
モデレーター
hide
(@hideokamoto)
WPプラグインの作り方であれば、以下の書籍がわかりやすいかなと思います。
WP-CLIコアコミッターの方なども参加されているので、信頼性も高いです。
サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル
http://amzn.asia/dAjXiqT
Okamoto Hidetakaさん、コメントありがとうございます!
すでに購入済みです^^;仰る通りで
当初フックに$thisを追加するくだりがわからず助けられました。
内容も分かりやすく、他にも便利なテクニック満載でかなり勉強になっていますm(_)m
4-5,4-6以外にも関連のありそうなところは見てみたのですが
今回のケースが載ってなかったと記憶しておりますが
見落としがあったのかもしれません。
再度探してみます!ありがとうございます!