0

我有一个每小时运行一次的 wp_cron。

cron 调用一个迭代自定义帖子类型的函数。然后使用标题和一些元数据从远程服务器上抓取结果。

问题是由于帖子的数量,抓取需要很长时间。我想通过一次仅迭代 25 个帖子将抓取分成块。使用 query_posts 中的 offset 参数很容易,但我如何动态地 add_action() 并传递 offset 变量?

functions.php中

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
         wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'rock_n_roll' );

我的 scraper.php 看起来像这样

function rock_n_roll($offset) {

    query_posts(array(
    'post_type' => 'wine',
    'order' => 'ASC',
    'posts_per_page' => -1,
    'offset' => $offset 
    )); 

    while (have_posts()) : the_post();

    //compare values against scraped results
    //write results to DB with update_post_meta

    endwhile;

}

基本上我需要一种方法来动态地 add_action(),每次将 $offset 的值增加 25。

4

2 回答 2

0

您的 $Offset 是从另一个来源传递给函数的。所以我可以想象,类似:

$Var = $Pre_definedoffset;
$Var = $Pre_definedoffset + 25; 
rock_n_roll($var);

这只是我从您的代码中看到的假设。

在代码将其推送到函数之前,您需要修改包含传递给函数的整数的变量。

于 2013-01-21T01:13:09.203 回答
0

您可以将变量传递给您的add_action()

add_action( $tag, $function_to_add, $arg );

但是您也可以使用do_action()而不是每次运行 cron 时添加操作:

do_action( $tag, $arg )

无论如何,将您的存储在$offset某个地方很好,所以我看到了两个选项:

将您的持久值存储在WP_Object_Cache中。也许阅读本文档,您可以找到另一个优雅的解决方案来提高大型查询结果的性能。

使用add_option()get_option()在数据库中记录您的实际$offset值。

如果您存储your $offset变量,您的 rock_and_roll 函数不再需要接收参数,您只需要在函数内部检索它。

function rock_n_roll() {

    // Retrieve $offset value from WP_Object_Cache
    // or from database with get_option()

    query_posts(array(
    'post_type' => 'wine',
    'order' => 'ASC',
    'posts_per_page' => -1,
    'offset' => $offset 
    )); 

    while (have_posts()) : the_post();

    //compare values against scraped results
    //write results to DB with update_post_meta

    endwhile;

}
于 2013-01-21T01:51:51.563 回答