it-swarm.cn

将未来日期的帖子标记为已发布

使用案例:

我有一个与音乐节目有关的帖子类型。 “显示时间”是通过发布日期获取的,该日期设置为将来某个时间。我发现了一个功能,它将采用未来过时的博客文章并保留日期,但将帖子标记为在保存时发布,但无法确定如何为自定义帖子类型自定义。

功能如下。

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
12
curtismchale

令人敬畏的结合Mike和Jan的答案我想出了这个只适用于有问题的帖子类型。我们不需要show的条件,因为'future_show'钩子只抓取show的post类型并更新它。

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_show','_future_post_hook');
        add_action('future_show','publish_future_post_now');
    }

    function publish_future_post_now($id) {
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
6
curtismchale

我无法确定,因为我没有您的网站进行测试,但我相信您只需要从remove_action()add_action()调用中删除'show'wp_publish_post()函数对于帖子类型是不可知的,至少它是从阅读代码时出现的。试试这个:

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>

当然,如果你想限制只做一些节目,你可能想要做这样的事情(虽然如果你需要它来处理其他帖子类型,逻辑会更复杂):

function publish_future_post_now($id) {
    $post = get_post($id);
    if ('show' == $post->post_type)
        wp_publish_post($id);
}

希望这可以帮助?

6
MikeSchinkel

我认为这个动作被 wp_transition_post_status 调用。代码是:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

因此,对于正常的未来帖子,最后一个挂钩将是future_post,但对于您的类型,它将是future_show或任何类型的slug。

3
Jan Fabry

如果您想要做的只是为“显示时间”添加一个额外的日期,可能更容易添加一个完全相同的元框 - 使用发布日期来欺骗它可能会有问题,因为WordPress会将其设置为每当用未来的发布日期(我认为)更新时,“未来”状态,因此每次更新帖子时都必须挂钩以重新设置它。此外,通过这种方式,您可以为其预期保留“发布日期”。

我可能只使用meta_key和自定义元框。虽然这取决于您的查询显示帖子的复杂程度。

如果将meta_value设置为时间戳,则可以按显示时间日期排序,或者在特定日期之前/之后选择:

$events = get_posts( 'post_type=events&meta_key=show_time&meta_value=' . strtotime( '+1 week' ) . '&meta_compare=<&orderby=meta_value' );

所有“事件”都会在当前日期之后的一周内播出。注意:以上是未经测试的,但是 应该 工作:)

1
Joe Hoyle

WP Dev Nacin使用简单的函数覆盖:

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );

function nacin_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}
0
Adam David