根据帖子数量动态add_action()

时间:2013-01-21 00:28:58

标签: php wordpress

我有一个wp_cron,我每小时都会跑。

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

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

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。

2 个答案:

答案 0 :(得分:0)

你的$ Offset从另一个源传递给函数..所以我可以想象,像:

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

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

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

答案 1 :(得分: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;

}