サポート » 使い方全般 » おすすめのプラグイン開発の構成

  • オブジェクト指向を取り入れプラグインを作成したいと思い
    次のようなクラスを作成しました。

    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();
    	}
    
    	/**
    	 * 現在のユーザー名を取得し配列に格納
    	 */
    	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_array = new Test_Oo_Plugin();
    	
    	//値が格納された$base_informationをここで使いたい
    	
    }

    wordpressの関数を使い情報を配列に格納しています。
    この配列をprivateのまま関数などで使いたいと考えています。

    しかし、wordpress関数を実行するにはフックを経由しなければ
    動かないものがあり、上記のget_post()関数も
    wp_get_current_user()関数もフック経由でないと動きません。

    こういったケースの場合どのようにするのがおすすめでしょうか。
    以下自分で考えてみたこと、試したことです。

    ・そもそもwordpress関数で取得した情報をカプセル化することによるメリットはなく
    グローバル空間で情報を取得し、グローバル変数として使用するほうがいいのでしょうか?
    (今回はこれ以外にも直書きで書き込む情報があったのでついでにwordpress関数で取得する情報も
    カプセル化したほうがいいのかなぁとなんとなく初めてずぶずぶとはまっております)
    ・ゲッターファンクションを作成。

    public function getter() {
            return $this->base_information;
        }

     しかしよく考えてみるとデータを格納するメソッドは
      add_action経由で呼び出しているためデータを取得することはできない。
    ・ゲッターファンクションを使うにはテーマファイルでインスタンス化を行い
     プラグインのphpにはクラスとfunctionだけ定義してテーマファイルで合体させる。
     つまり上記のケースではadd_actionは不要になります。
     これは可読性が悪くなりそうな気がしています。テーマにコメント書けばいいのかもしれませんが。

    今回クローズドなサイトのプラグインとして開発していたので
    なるべくカプセル化をということで上記のような疑問が生まれました。
    オブジェクト指向でプラグインを開発されている方の経験談
    ざっくばらんな突っ込みなどいただけましたら嬉しいです。
    よろしくお願いいたします。

    ※解りずらい部分がありましたら補足させていただきますので
    そちらの突っ込みもありましたらお願いいたします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • こんにちは

    この処理はどこで実行される想定なのでしょうか?

    この処理を投稿を取得可能なフックかテンプレートで実行するのなら、get_post()で投稿を取得できます。
    そもそもget_post()で投稿を取得できないタイミングで実行してしまうとグローバルの$postもセットされていないので、どこからも現在の投稿を取得することができないので実行できないのではないでしょうか。

    トピック投稿者 hokutonojikei

    (@hokutonojikei)

    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などの関数はグローバル変数に値を保存するように作られていると思います。
    今回のようにカプセル化をする必要がないと考えて設計したほうが良いのでしょうか。
    またご不明点などありましたら突っ込んでいただければ幸いです。
    よろしくお願いいたします。

    • この返信は6年、 1ヶ月前にhokutonojikeiが編集しました。理由: 改行されていない部分があった
    • この返信は5年、 10ヶ月前にNaoko Takanoが編集しました。
    トピック投稿者 hokutonojikei

    (@hokutonojikei)

    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などの関数はグローバル変数に値を保存するように作られていると思います。
    今回のようにカプセル化をする必要がないと考えて設計したほうが良いのでしょうか。

    • この返信は6年、 1ヶ月前にhokutonojikeiが編集しました。理由: 追記しました

    仰る通りフックで実行するかテンプレートで実行すれば
    get_post()などの実行はできます。
    ただメンバ変数からreturnで値を返したい時に
    フックを使う場合だとreturnが返せない

    ちょっとうまく伝わっていないかもしれないのですが、書かれているクラスはフックかテンプレートでインスタンス化するのであれば、そのインスタンスが使われるのはそのフックかテンプレートの中なのでメンバー変数から値を取得できるという意味です。

    プラグイン読み込み時点でインスタンス化する目的が何かは分かりませんが、それよりもインスタンス化時点でpostやユーザーを取得している理由は何でしょうか?
    インスタンス化時点で取得できないなら、使うときに取得してメンバーにセットすれば良いと思います。
    使うときには当然取得できると思いますし、使う時点まではメンバーにセットされている必要もありません。

    また、ご自身だけで使うクラスについて、カプセル化が必要か必要でないかは、ご自身で判断して決めるしかないと思います。
    私には何のためのクラスかも分からないので。

    WordPressやphoに限らず、あらゆるフレームワークではいつ、何を取得できるのかは制限があります。

    クラス設計ではフレームワークに合わせていつインスタンス化し、いつメンバーに値をセットし、いつ取り出すかを慎重に設計する必要があります。

    それらをいつやるのかは目的・用途によって様々なので、一般論で定義するのは難しい気がします。

    幸い、WordPressでは非常に多くのプラグインやテーマのソースが公開されているので、それらを参考にしてみてはどうでしょうか。

    トピック投稿者 hokutonojikei

    (@hokutonojikei)

    munyaguさん度々のコメントありがとうございます。

    クラス設計ではフレームワークに合わせていつインスタンス化し、いつメンバーに値をセットし、いつ取り出すかを慎重に設計する必要があります。

    なるほど、ありがとうございます!参考になりました!
    再度プラグインを色々見てみたいと思います。

    モデレーター Okamoto Hidetaka

    (@hideokamoto)

    WPプラグインの作り方であれば、以下の書籍がわかりやすいかなと思います。
    WP-CLIコアコミッターの方なども参加されているので、信頼性も高いです。

    サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル
    http://amzn.asia/dAjXiqT

    トピック投稿者 hokutonojikei

    (@hokutonojikei)

    Okamoto Hidetakaさん、コメントありがとうございます!

    すでに購入済みです^^;仰る通りで
    当初フックに$thisを追加するくだりがわからず助けられました。
    内容も分かりやすく、他にも便利なテクニック満載でかなり勉強になっていますm(_)m
    4-5,4-6以外にも関連のありそうなところは見てみたのですが
    今回のケースが載ってなかったと記憶しておりますが
    見落としがあったのかもしれません。
    再度探してみます!ありがとうございます!

    • この返信は6年、 1ヶ月前にhokutonojikeiが編集しました。
    • この返信は6年、 1ヶ月前にhokutonojikeiが編集しました。
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「おすすめのプラグイン開発の構成」には新たに返信することはできません。