自定义日期更改器POST_DATE=>将来-错过计划错误

时间:2012-04-27 作者:Caleb

我正在为我的网站开发一个定制的事件调度器,让人们可以轻松地进入并设置文章在将来发布。我之所以要覆盖正常的Wordpress功能,是因为我想让选择日期变得非常容易,因为布道应该只在周日发布。因此,我有一个自定义下拉日历,只允许您选择一个月的星期日。

无论如何,我的问题是,我所有的帖子在管理面板中都给出了一个“错过时间表”的错误。我可以通过使用“post\\u status”=>“future”在页面上列出帖子来绕过这个问题,但这有点“黑客”。。。

为什么这段代码会给我那个“错过计划”的错误?

function cfc_reset_sermondate( $data ) {

if($data[\'post_type\'] == \'sermon_post\') {
    if($_POST[\'cfc_sermon_date\']) {
        $date = $_POST[\'cfc_sermon_date\'];
       // $date = DateTime::createFromFormat(\'D - M j, Y\', $date);
       // $date = $date->format(\'Y-m-d\');
        $date = createFromFormat($date);


        $postDate = strtotime($date);

        $data[\'post_date\'] = $date;

        $todaysDate = strtotime( date( \'Y-m-d\' ) );
        if ( $postDate > $todaysDate ) {
            $data[\'post_status\'] = \'future\';
        }
    }
}
return $data;
}

add_filter( \'wp_insert_post_data\', \'cfc_reset_sermondate\', \'99\', 1);
以下是createFromFormat函数:

function createFromFormat($date_ugly) {
   $schedule = \'Sunday - Sep 15, 2000\';
    // %Y, %m and %d correspond to date()\'s Y m and d.
    // %I corresponds to H, %M to i and %p to a
    $ugly = strptime($date_ugly, \'%A - %b %e, %Y\');
    $ymd = sprintf(
        // This is a format string that takes six total decimal
        // arguments, then left-pads them with zeros to either
        // 4 or 2 characters, as needed
        \'%04d-%02d-%02d\',
        $ugly[\'tm_year\'] + 1900,  // This will be "111", so we need to add 1900.
        $ugly[\'tm_mon\'] + 1,      // This will be the month minus one, so we add one.
        $ugly[\'tm_mday\'], 
        $ugly[\'tm_hour\'], 
        $ugly[\'tm_min\'], 
        $ugly[\'tm_sec\']
    );
    $new_schedule = new DateTime($ymd);
    return $new_schedule->format(\'Y-m-d\');
}
Custom Date Calendar

Missed Schedule Error

1 个回复
SO网友:Stephen Harris

WordPress具有以下功能:通过在WordPress“publish”框中将发布日期设置为将来,文章将被授予“future”状态,并计划在该日期发布。

我的猜测是,问题的出现是因为您没有设置GMT时间,而这正是WordPress用来安排出版物的时间。或者在日程安排完成后,你就加入了。

“简单”的方式(但留给您两个“发布日期肉盒子”——从UI的角度来看,这并不好)。

Keep in mind that WP expects the date in the Y-m-d H:i:s format

add_action(\'save_post\', \'wpse50448_schedule_sermon\');

function wpse50448_schedule_sermon($post_id) {

    //Perform checks, nonces etc

    $date=\'\';//set date
    $date_gmt=\'\';//set date in GMT (UTC)

    // unhook this function so it doesn\'t loop infinitely
    remove_action(\'save_post\', \'wpse50448_schedule_sermon\');

    // update the post, which calls save_post again
    wp_update_post(array(\'ID\' => $post_id, \'post_date\' => $date,\'post_date_gmt\' => $date_gmt));

    // re-hook this function
    add_action(\'save_post\', \'wpse50448_schedule_sermon\');
}
这应该可以,但没有经过测试

或者,您可以取消注册publish metabox,并使用完全相同的标记重新注册它(但更改了一些ID标记,以便WP的javascript忽略它,然后对其应用您自己的javascript)。从UI的角度来看,这要好得多,但要涉及更多。

这个first part is outlined in this post 另一个metabox。

结束