0

我正在尝试使用具有动态生成的操作名称的 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);

}
4

1 回答 1

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);
于 2012-09-14T07:56:11.883 回答