web-dev-qa-db-ja.com

Do_actionを実行して戻り値を取得する方法

したがって、次のようなシナリオがあります。

データベースからログを消去するためのアクションを追加します。

add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

今私はこのアクションを定期的に実行したいです。

wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );

手動で実行します。

do_action( 'myplugin_clean_logs' );

メソッドMyPlugin_Logs::clean_logsは、影響を受けた行数を返すか、何か反対の方向に行った場合はfalseを返します。

今、私は削除された行数を表示したいです。私はこのようなものを想像するでしょう:

$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';

do_actionは値を返さないので、戻り値を取得する方法はわかりません。

手動で直接メソッドを実行する必要がありますが、スケジュールイベントでアクションを使用しますか?

10
Aley

クールなのは、フィルタはアクションと同じで、値を返すだけなので、代わりにフィルタとして設定するだけです。

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

それから何か:

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

$affected_rowsclean_logs()に渡し(そしてあなたがmyplugin_clean_logsにフックした他のどんな関数でも)、戻り値を$affected_rowsに戻すべきです。

10
Caspar

この関数を使用したことがなく、これをテストしていませんが、機能する可能性がありますか? do_action_ref_array()

function myplugin_clean_logs_fn() {
    $args = array(
        'param1'        => 'val1',
        'param2'        => 'val2',
        'affected_rows' => 0,
    );
    do_action_ref_array( 'myplugin_clean_logs', &$args );
    return $args['affected_rows'];
}

// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';

// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );

// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
    // Cleaning process
    // For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);

それでもうまくいかない場合は、Casparが提案したようにフィルタリングするだけではどうですか?つまり、これがフィルターの目的であり、この場合、影響を受ける行の数がフィルター処理されます。 (古いMortCoreが懐かしいです。戻り値、参照渡し、引数を3つのパラメータ関数だけで処理した方法を覚えている人はいますか?)

0
Goofball