WP Cron:将第三方数据保存为用户元

时间:2014-02-28 作者:Mathieu

编者注:推特ID和谷歌分析仅作为示例,可交换

TL;DR

我想每天在用户配置文件中保存一次或两次外部数据。我在我的用户配置文件中添加了两个自定义字段:

Twitter\\u ID(我从仪表板手动输入)

  • test1(通过php函数获得的外部数据)
  • 我希望能够执行以下操作:在test1 对于每个用户配置文件,我从Twitter_ID.

    主要目标:我正在制作一个面板,该面板将显示我的用户网站(外部网站)的统计数据。为此,我使用谷歌分析API。我将Google Analytics配置文件编号保存在自定义配置文件字段中。目前,每当我的用户希望看到他们(在前端)时,我都会运行脚本(统计信息)。生成它们需要几秒钟的时间。我的统计数据大约每天更改一次(不是每小时的统计数据,而是每天的统计数据)。因此,我们的想法是每天将统计数据保存一次到用户配置文件中。因此,就像这样,每次用户加载统计页面时都不需要花费时间来生成它们。

    解决方案:所以,我开始考虑不同的解决方案。但最好的办法是保存数据,而不需要用户采取任何行动。或者,当有人访问该网站时,它会使用wp\\u cron每天为每个人保存一次数据。目前,我唯一成功的事情就是在用户更新其个人资料时保存数据。但这只会保存他的数据,不会为所有人保存,所以这不是我想要的。

    EDIT

    I tried this :

    add_filter(\'cron_schedules\', \'new_interval\');
    
    function new_interval($interval) {
    
        $interval[\'minutes_1\'] = array(\'interval\' => 10*60, \'display\' => \'Once 1 minute\');
    
        return $interval;
    }
    
    
    function InitiateMyCron() {
        if (!wp_next_scheduled(\'MyCronAction\')) {
            wp_schedule_event(time(), \'minutes_1\', \'MyCronAction\');
        }
    }
    
    function MyCronAction( $user_id ) {
        $twitter_id = $_POST[\'twitter_id\'];
        $result = $twitter_id;
        if ( !current_user_can( \'edit_user\', $user_id ) )
        return false;
        update_usermeta( $user_id, \'test1\', $result );
    }
    
    add_action( \'personal_options_update\', \'MyCronAction\' );
    add_action( \'edit_user_profile_update\', \'MyCronAction\' );
    
    但是,当我保存“Twitter\\u id”时,字段“test1”被更新。我不知道它是否每分钟都在更新

    EDIT 2

    if ( ! wp_next_scheduled( \'my_save_statistiques\' ) ) {
      wp_schedule_event( strtotime(\'tomorrow\'), \'daily\', \'my_save_statistiques\' );
    } 
    
    function my_save_statistiques( $user_id ) {
    
    
    "blabla php"  =        
    $ga->requestReportData($num_analytics,array(\'pagePath\'),array(\'visits\'), null, null, $fromDate, $toDate); 
    $visites_totales = $ga->getVisits();
    
    
    
    if ( !current_user_can( \'edit_user\', $user_id ) )
    return false;
    update_usermeta( $user_id, \'visites_totales\', $visites_totales );
    add_action( \'personal_options_update\', \'my_save_statistiques\' );
    add_action( \'edit_user_profile_update\', \'my_save_statistiques\' );
    }
    

    EDIT 3

    我最终以这个结尾,但它不起作用:(我将1周改为30秒,但名称仍然相同)

    add_filter( \'cron_schedules\', \'myprefix_add_weekly_cron_schedule\' );
    function myprefix_add_weekly_cron_schedule( $schedules ) {
        $schedules[\'weekly\'] = array(
            \'interval\' => 30, // 30 seconds
            \'display\'  => __( \'Once Weekly\' ),
        );
    
        return $schedules;
    }
    
    // Schedule an action if it\'s not already scheduled
    if ( ! wp_next_scheduled( \'myprefix_my_cron_action\' ) ) {
        wp_schedule_event( time(), \'weekly\', \'myprefix_my_cron_action\' );
    }
    
    // Hook into that action that\'ll fire weekly
    add_action( \'myprefix_my_cron_action\', \'myprefix_function_to_run\' );
    function myprefix_function_to_run() {
        function my_save_statistiques( $user_id ) { 
                [...]
            $visites_totales = $ga->getVisits();
    
            if ( !current_user_can( \'edit_user\', $user_id ) )
            return false;
            update_usermeta( $user_id, \'visites_totales\', $visites_totales );
        }
        add_action( \'personal_options_update\', \'my_save_statistiques\' );
        add_action( \'edit_user_profile_update\', \'my_save_statistiques\' );
    }
    

    Edit 4:

    我发现add_action( \'personal_options_update\', \'my_save_statistiques\' ); 是指用户更新自己的个人资料,但这不是我想要的。。。因为我想每天为所有用户保存一次数据。这就是为什么(我猜),我认为我以前的代码不起作用。

    Edit 5:

    FIRST STEP : 1/2 SUCCESS

    用户每次访问网站时都会保存数据。主要目标是为每个人更新数据,但它可以这样工作。下一步:Cron

    function my_save_statistiques( $user_id ) { 
        $visites_totales = [myscript];
        if ( !current_user_can( \'edit_user\', $user_id ) )
        return false;
        update_usermeta( $user_id, \'visites_totales\', $visites_totales );
    }
    add_action( \'wp_head\', \'my_save_statistiques\' );
    

    EDIT 6:

    是否正确?

    // Schedule an action if it\'s not already scheduled
    if ( ! wp_next_scheduled( \'wp_head\' ) ) {
    wp_schedule_event( time(), \'hourly\', \'wp_head\' );
    }
    // Hook into that action that\'ll fire weekly
    function my_save_statistiques( $user_id ) { 
    $visites_totales = [myscript];
    update_usermeta( $user_id, \'visites_totales\', $visites_totales );       
    }
    add_action( \'wp_head\', \'my_save_statistiques\' );
    

    I found a different solution

    The solution :

    保存已运行操作的时间,并检查与实际时间的差异:

    function my_save_statistiques( $user_id ) { 
        $user_id = get_current_user_id(); 
        $current_time = time(); 
    
        if (empty($current_time)) {
        update_usermeta( $user_id, \'last_analytics\',  $current_time );
        }
    
        $last_analytics = get_user_meta( $user_id, \'last_analytics\', true );
        $diff = $current_time - $last_analytics;
        $one_day = 86400;
    
        if ($diff > $one_day) {
    
        $visites_totales = [myscript]
    
        update_usermeta( $user_id, \'last_analytics\',  $current_time );
        update_usermeta( $user_id, \'visites_totales\',  $visites_totales );
        }
    }
    
    add_action( \'wp_head\', \'my_save_statistiques\' );
    

    1 个回复
    最合适的回答,由SO网友:Mathieu 整理而成

    做我想做的事的另一种方式:

    保存已运行操作的时间,并检查与实际时间的差异:

    function my_save_statistiques( $user_id ) { 
        $user_id = get_current_user_id(); 
        $current_time = time(); 
    
        if (empty($current_time)) {
        update_usermeta( $user_id, \'last_analytics\',  $current_time );
        }
    
        $last_analytics = get_user_meta( $user_id, \'last_analytics\', true );
        $diff = $current_time - $last_analytics;
        $one_day = 86400;
    
        if ($diff > $one_day) {
    
        $visites_totales = [myscript]
    
        update_usermeta( $user_id, \'last_analytics\',  $current_time );
        update_usermeta( $user_id, \'visites_totales\',  $visites_totales );
        }
    }
    
    add_action( \'wp_head\', \'my_save_statistiques\' );
    
    So, the script will run for a logged user if the time between the last "run" and now is more than 24h, 知道我的网站只有登录用户才能访问

    结束