web-dev-qa-db-ja.com

クラスメソッドからadd_actionを使用する方法

状況によっては、WordPressをフレームワークとして使用して、アプリの新規ユーザー用のアクティベーションシステムを構築しています。このコードのすべてが常駐している私たちの相互作用の大部分を駆り立てるプラグインがあります。

新規ユーザーがサインアップすると、電子メールを介してアクティブ化リンクが送信され、クリックするとアクティブ化ページに送信されます。詳細を保存したら、適切なメタデータを使用してユーザーを作成し、それらを個人用サブサイトに転送するカスタムルーティングテンプレートにリダイレクトします。

新しく作成したユーザーのユーザー名とパスワードを入手できるので、 wp_signon() を使用できます。他の場所でインスタンス化されたRegistration_Modelクラスがあります。サインインプロセスを開始するためのクラスメソッドは、add_actionを呼び出したい場所です。

public function sign_user_in() {
    add_action( 'init', array( $this, 'auto_sign_in') );
}

サインインを処理するための私たちの方法は以下の通りですが、注意してください、私はアクションが文字列をエコーすることによってWordPressによってさえキューイングされているかどうかを確かめるために機能をテストしました。

public function auto_sign_in()
{
    // if ( ! is_user_logged_in() ) {

         //determine WordPress user account to impersonate
         $creds = array();
         $creds['user_login'] = $this->user->email;
         $creds['user_password']  = $this->user->password->one;
         $creds['remember'] = true;
         $user = wp_signon( $creds, false );
         if ( is_wp_error( $user ) ) {
             echo $user->get_error_message();
         } else {
             wp_redirect('/_router/'); exit;
         }
     }
}

実行されていないアクション、または何かに固執しているようです。 add_actionはクラスコンストラクタ以外の場所から実行できますか?ありとあらゆる助言や援助は大歓迎です。

_編集_

Initにフックしてもまだ何も得られませんが、$thisの代わりに__CLASS__を使用するように関数を調整しました。ちょうどテストとして、私は起動する絶対的な最後のフック、 'shutdown'を使いました、そしてそれを使ってブラウザにテスト文字列をエコーすることができます。それで、たくさんの操作がロードされていることを私は知っています、それで私はおそらくそれがより早く起動するようにどこかにadd_actionを移動する必要があります。

4
ToddSmithSalter

やってみました

add_action( 'init', array( $this, 'auto_sign_in') );

__CLASS__は、クラスインスタンスではなくクラス名を返すので、静的関数に対してのみ機能します。

5
vancoder

__CLASS__は、$this呼び出しでadd_actionにする必要があります。 __CLASS__は関数がstaticの場合にのみ使われると思います

2
Manny Fleurmond