如何做_动作并获得返回值?

时间:2016-04-21 作者:Aley

因此,有以下情况。

我添加了一个操作来清除数据库中的日志:

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 不会返回任何值,我不知道如何获取返回值。

我是否应该在手动运行时直接执行该方法,但对计划事件使用该操作?

3 个回复
SO网友:Caspar

最酷的是过滤器与动作相同,只是它返回一个值,所以只需将其设置为过滤器即可:

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.

SO网友:WPExplorer

这是一个非常古老的问题,但要回答原来的问题;如何执行\\u操作并获取返回值"E;对于任何正在查找的人,都可以使用输出缓冲来完成此操作。

ob_start();
    do_action( \'myplugin_clean_logs\' );
$action_data = ob_get_clean();
这样,您可以将do\\u操作内容存储在变量中。

SO网友:Goofball

从未使用过此功能,也没有测试过此功能,但它是否可以工作?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);
如果这样不行,为什么不像卡斯帕建议的那样过滤掉呢?我的意思是,这就是过滤器的目的,在这种情况下,受影响的行数就是要过滤的内容。(我怀念旧的MortCore。有人记得它是如何处理返回值、按引用传递和仅使用一个三参数函数的参数的吗?)

相关推荐

自定义发布类型的POST_ROW_ACTIONS

我正在使用this 在WordPress Admin中具有重复post函数的代码。但是,当我为自定义帖子类型添加过滤器时,如下所示:add_filter( \'directory_row_actions\', \'rd_duplicate_post_link\', 10, 2 ); (自定义帖子类型的注册名称为directory) - 它不会将其添加到条目标题下的操作行中。当我为帖子或页面执行此操作时,如下所示:add_filter( \'post_row_actions\', \'rd_dup