将过时的帖子标记为已发布


13

用例:

我的帖子类型与音乐节目有关。“显示时间”是在发布后的日期中获取的,该日期设置为将来的某个时间。我发现了一个功能,该功能可以获取以后标有日期的博客帖子,并保留日期,但是将帖子标记为已保存,但是还无法确定如何针对自定义帖子类型对其进行自定义。

该功能如下。

<?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');
?>

1
remove_actionadd_action通话中是否可能有错误?您的第二个参数是'show',但是它不应该是您要添加或删除的函数吗?
Jan Fabry

Answers:


7

将Mike和Jan的答案结合起来真棒,我想出了这个选项,仅适用于相关帖子类型。我们不需要show的条件,因为'future_show'钩子仅获取show的帖子类型并对其进行更新。

<?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');
?>

7

我不确定,因为我没有可供您测试的网站,但我相信您只需'show'要从remove_action()add_action()通话中删除即可。该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);
}

希望这可以帮助?


是的,第一部分代码是我开始使用的代码,它可用于普通的WordPress帖子,但如果添加条件“显示”,则它对任何内容均无效。即使没有条件,它也不适用于自定义帖子类型。
curtismchale

我已经读过几次您的问题,但是如果我们忽略建议的无效代码,我仍然不清楚您要完成什么。您能说明您要完成的目标吗?您要在post_date中的日期/时间发布帖子,还是其他?还是已经解决了?
MikeSchinkel

它已经解决了(我在下面提供了代码)。我只是想发布自定义帖子类型的帖子,即使将来也是如此。
curtismchale 2010年

4

我认为此操作被调用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或者无论您的类型是什么。


1

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

我可能只会使用meta_key和自定义的meta框。尽管这取决于显示帖子的查询的复杂程度。

如果将meta_value设置为时间戳,则可以按显示时间日期排序,也可以选择某个日期之前/之后:

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

距当前日期不超过一周,将获得所有带有放映时间的“事件”。注意:上面未经​​测试,但应该可以工作:)


我对此100%表示同意-使用元框比使用发布日期作为事件日期的技巧要好得多。
特拉维斯·诺斯卡特

是的,meta_box可以工作,但是我发现很难添加漂亮的jQuery日期和时间选择器。股票WP比我能想到的要好得多。
curtismchale 2010年

WP Easy Post Types插件提供了一个自定义日期字段,并提供了一个简单的日期选择器,我自己将其用于事件列表功能。
里克·柯兰

0

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;
}

请添加一些解释这是如何工作的。
Nicolai 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.