在WordPress中为WP Cron安排多个任意事件

时间:2012-09-14 06:44:00

标签: php cron wordpress-plugin wordpress

我尝试使用动态生成的操作名称使用WordPress Cron API安排多个事件。一次只能添加一个事件add_action()但不能超过一个事件。

使用名为Cron View的插件,我可以确认事件已注册,但函数未以某种方式调用。我猜测动态生成的动作名称可能会在下一页加载中消失,因此WordPress无法找到它们。我不知道。

以下代码已准备好作为插件运行并演示此问题。任何解决这个问题的建议都将受到赞赏。

<?php
/* Plugin Name: Sample Cron Scheduler */

add_action('admin_menu', 'sample_cron_menu');
function sample_cron_menu() {
    add_options_page(
        'Sample Cron Scheduler', 
        'Sample Cron Scheduler', 
        'manage_options',
        'sample_cron_scheduler', 
        'sample_cron_scheduler_admin');
}
function sample_cron_scheduler_admin() {
    ?>
    <div class="wrap">
    <?php
        // print the saved values
        echo '<h3>Saved values</h3>';
        print_r(get_option('crontest'));

        // do this ten times, meaning I want to register 10 events 
        $chars = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
        for ($i=1; $i <= 10; $i++) {

            // generate a random string
            shuffle($chars);
            $randomstring = implode($chars);

            // schedule the next event
            // wp_schedule_single_event(time(), 'myeventaction');   // <-- this only runs one job
            add_action(sha1($randomstring),'myevent');              // so I want to add arbitrary multiple events but this doesn't work
            wp_schedule_single_event(time(), sha1($randomstring));                  
        }
    ?>
    </div>
    <?php
}

add_action('myeventaction', 'myevent'); 
function myevent() {    // this function just adds the current time to the option array

    $arr = get_option('crontest') ? get_option('crontest') : array();
    array_push($arr, date("M d Y H:i:s", time()));      // adds the current time at the end of the array
    array_splice($arr, 0, count($arr) - 20);            // reduce the number of elements to 20 to make it short
    update_option('crontest',  $arr);

}

1 个答案:

答案 0 :(得分:0)

我的猜测是正确的。 WordPress不记得add_action()中传递的已注册操作名称。所以我将它们保存在选项中,并在插件加载并将它们全部传递给add_action()时检索它们。

<?php
/* Plugin Name: Sample Cron Scheduler */

add_action('admin_menu', 'sample_cron_menu');
function sample_cron_menu() {
    add_options_page(
        'Sample Cron Scheduler', 
        'Sample Cron Scheduler', 
        'manage_options',
        'sample_cron_scheduler', 
        'sample_cron_scheduler_admin');
}
function sample_cron_scheduler_admin() {
    ?>
    <div class="wrap">
    <?php
        // print the saved values
        echo '<h3>Saved values</h3>';
        echo '<h4>Actions</h4>';
        print_r(get_option('crontest_actions'));
        echo '<h4>Jobs</h4>';
        print_r(get_option('crontest'));

        // do this ten times, meaning I want to register 10 events 
        $arr = get_option('crontest_actions') ? get_option('crontest_actions') : array();
        $chars = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
        for ($i=1; $i <= 10; $i++) {

            // generate a random string
            shuffle($chars);
            $randomstring = implode($chars);

            // schedule the next event
            $actionname = sha1($randomstring);
            array_push($arr, $actionname);
            add_action($actionname,'myevent');              // so I want to add arbitrary multiple events but this doesn't work
            wp_schedule_single_event(time(), $actionname);                  
        }
        update_option('crontest_actions', $arr);
    ?>
    </div>
    <?php
}

$actions = get_option('crontest_actions') ? get_option('crontest_actions') : array();
foreach($actions as $key => $action)    {
    add_action($action, 'myevent'); 
}

function myevent() {

    $arr = get_option('crontest') ? get_option('crontest') : array();
    array_push($arr, date("M d Y H:i:s", time()));      // adds the current time at the end of the array
    array_splice($arr, 0, count($arr) - 20);            // reduce the number of elements to 20 to make it short
    update_option('crontest',  $arr);

    $actions = get_option('crontest_actions') ? get_option('crontest_actions') : array();
    array_splice($actions, 0, 1);   // remove the first element
    update_option('crontest_actions',  $actions);
}

// use this to reset options
// $arr = array();
// update_option('crontest', $arr);
// update_option('crontest_actions', $arr);