使用函数根据其他帖子元更新帖子元

时间:2012-05-30 作者:Pollux Khafra

不知道如何命名,所以请随意编辑。我开始为我的帖子创建一个“热点”,为此我使用了$ratings_score 它存储为post\\u meta,数字+/-和几天前的文章,我将其缩减为几天。我将ratings\\u得分除以天数,得到一个反映帖子热度的数字。我在循环中运行此函数以获得结果。。。

$time_ago = human_time_diff( get_the_time(\'U\'), current_time(\'timestamp\') );
if (strtotime($time_ago) <  strtotime(\'1 day\')) {
 $time_ago = "1";
}
$days_ago = preg_replace("/[^0-9 ]/", \'\', $time_ago);
$days_ago;
$ratings_score = get_post_meta($post->ID,\'ratings_score\',true);
$hotness = $ratings_score / $days_ago;
echo $hotness;
这很好,但我真正需要做的是把它变成函数中的一个函数。php和存储$hotness 作为post\\u meta。我需要它根据前几天的变化不断更新自己$ratings_score. 这样我就可以按$hotness meta\\u键。我该怎么做?

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

以下是两种简单的方法:

一是使用the_content-过滤以更新帖子“热度”,或者您可以安排每天运行的事件,并每天更新一次“热度”。

第一种方法:the_content-筛选将代码转入“可调用”函数:

function update_hotness( $post_id, $echo = false ) {
    $time_ago = human_time_diff( get_the_time( \'U\', $post_id ), current_time(\'timestamp\') );
    if ( strtotime($time_ago) <  strtotime(\'1 day\') ) {
        $time_ago = "1";
    }

    $days_ago = preg_replace( "/[^0-9 ]/", \'\', $time_ago );
    $days_ago;
    $ratings_score = get_post_meta( $post_id, \'ratings_score\', true );
    $hotness = $ratings_score / $days_ago;
    // Here you store the "hotness" as post meta
    update_post_meta( $post_id, \'hotness\', $hotness );
    if ( $echo )
        echo $hotness;
    return $hotness;
}
因此,您现在可以通过此函数获取并更新帖子“hotness”,只需将帖子id传递给它即可。

接下来创建一个挂钩函数the_content-每次更新帖子“热门度”的过滤器the_content 被称为:

add_filter( \'the_content\',\'update_hotness_filter\' );
function update_hotness_filter( $content ) {
    global $post;
    update_hotness( $post->ID );
    return $content;
}
第二种方法:安排事件首先,创建一个函数来检查事件是否已安排,然后相应地更新:

add_action( \'wp\', \'hotness_update_activation\' );
function hotness_update_activation() {
    if ( ! wp_next_scheduled( \'daily_hotness_update\' ) ) {
        wp_schedule_event( current_time( \'timestamp\' ), \'daily\', \'daily_hotness_update\' );
    }
}
最后,请确保向事件和每天运行的函数添加一个动作挂钩:

add_action( \'daily_hotness_update\', \'daily_hotness_update_callback\' );
function daily_hotness_update_callback() {
    // Here you get a list of posts to update the "hotness" for.
    // Then you just call `update_hotness()` for each one ex:
    foreach ( $posts as $p ) {
        update_hotness( $p->ID );
    }
}
就是这样:)

如果你问我,你应该用更简单的方法,这是第一种方法。

结束