web-dev-qa-db-ja.com

クラスでwp_schedule_eventを使用する方法?

アプリケーションを書くためのOOPメソッドを試したのは今回が初めてです。まだよくわかりません。現在私はこのcronフックを持っています:

if( !wp_next_scheduled( 'my_cron_hook' ) ) {
    //schedule the event to run daily
    wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
}
add_action('my_cron_hook',array($this,'do_daily_job'));

クラス内でifを直接使用することはできないようです。上記のコード全体を__construct()関数に入れる必要がありますか?

また、私はWordPressのwp_schedule_eventdocumentation にこれを見つけました。

function my_activation() {
    if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'my_hourly_event');
    }
}
add_action('wp', 'my_activation');

ここで「wp」フックとは何の意味ですか?私はこれをフックAPIで見たことがありません。上記のcronコードを関数にラップして、この「wp」アクションを__construct()関数に含めるべきですか。

function __construct() {
    add_action('wp', array($this,'my_activation'));
}

function my_activation() {
    if( !wp_next_scheduled( 'my_cron_hook' ) ) {
        //schedule the event to run daily
        wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
    }
    add_action('my_cron_hook',array($this,'do_daily_job'));
}   
6
dev-jim

クラス定義の外側にアクションを追加します。

add_action('my_unique_plugin_event_hook', array($this,'hook'));

そしてあなたのイベントでこれを使用します。

wp_schedule_event(time(), 'daily', 'my_unique_plugin_event_hook');
2
Jonathan

クラス内に関数を作成してコンストラクタ内でフックを呼び出すことができます。以下のコードはあなたが示したものと似ています。これをプラグインに作成すると、起動時にクラスをインスタンス化してcronジョブを作成できます。以下のコードに加えて、これはPHPのCron Jobsへの良いリンクです PHPのCron Jobsの管理

class My_Class {
function __construct() {
    //Register ajax scripts
    add_action( 'admin_enqueue_scripts', array( $this, 'register_ajax_scripts' ) );
}

/**
 * Registers and enqueues admin-specific JavaScript.
 */    
public function register_ajax_scripts() {    
    wp_enqueue_script ('test-ajax' , plugins_url( 'myPlugin/test-ajax.js' ));
}
1
i-4Web
  • If文をクラス内に直接配置しようとすると、PHPは構文エラーをスローします。これらの波括弧の間に入ることができるのは、変数宣言(例えばpublic $foo)と関数(例えばfunction bar(){ /*stuff*/})だけです。

  • クラスコンストラクター、あるいは実際にはクラス内の他の関数からジョブを設定することは絶対に問題ありません。フックが追加されるのに間に合うように、クラスが実際にインスタンス化されることを確認してください(コンストラクターにない場合は必要な関数を呼び出してください)。

  • 簡単に言うと、WPはすべてがロードされたとき、すべての投稿が取得されたときなど、テンプレートがロードされる前に起動するフックです。

Cronジョブを登録する最善の方法は、それを activation hook に添付することです。これは、プラグインが最初にアクティブ化されたときにのみ起動されるフックです。そうでなければ、同じジョブを複数回登録するリスクがあります。これには明らかな欠点があります。それがあなたが含むコーデックスからのコードが目的であるものです - それがまだ予定されていないことを確認するために。それはそれをする一つの方法です、これはもう一つの方法です。

メインクラスが始まる前に(例えば、一番上にヘッダ情報があるあなたのベースのplugin.phpファイルの中で)、あなたのコードは以下のようになるはずです。

register_activation_hook( __FILE__, '62565_activate');

function 62565_activate() {
     wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
}

明らかにあなたがプラグインを無効にして再度有効にすると、これはトラブルを引き起こすかもしれません。

0
djb