允许WordPress接受1902-2038年之后的日期

时间:2014-08-21 作者:TAH

我正在使用Wordpress 3.9.2、MySQL 5.1.73和;PHP 5.3.27整合了一个基于历史的网站。

正如其他地方的文献(包括多年来StackExchange和WP论坛上的许多问题)所述,由于PHP的限制,不能发布日期超出32位有符号整数的最小值和最大值的帖子。由于我在64位系统上运行,我进一步研究了这个问题,发现this useful research elsewhere on StackExchange.

通过使用这些信息,我能够用很少的代码构建一个解决方案,以克服基本上归结为PHP限制的问题w/strtotime() (但不是MySQL在1000-9999范围内的年限制)。我检查了以下位置,以确认日期是否正确处理:管理中的帖子创建/更新、前端和管理站点中帖子的日期、列表页面上帖子的排序以及RSS提要中的日期。

虽然我有多年的编程经验,但PHP和Wordpress并不是我的强项,所以我将此贴在这里,供有此专长的人使用我提出的解决方案解决2-3个问题。

找不到通过破解内核来实现此目的的方法

(1) 替换wp includes/functions中的mysql2date。php:

function mysql2date( $format, $date, $translate = true ) {
    if ( empty( $date ) )
            return false;

    if ( \'G\' == $format )
            try {
              $i = new DateTime($date . \' +0000\');
              return $i->format(\'G\');
            } catch (Exception $e) {  // This doesn\'t appear to be WP\'s way of handling errors
              echo $e->getMessage();
              exit(1);
            }

    try {
         $i = new DateTime($date);
    } catch (Exception $e) {
         echo $e->getMessage();
         exit(1);
    }

    if ( \'U\' == $format )
            return $i->format(\'U\');

    if ( $translate )
            return $i->format($format); // Not sure how to localize here (had date_i18n before)
    else
            return $i->format($format);
}
(2)在wp admin/includes/meta框中编辑post\\u submit\\u meta\\u box()。php—将第175行替换为以下内容:

    try {
      $date = new DateTime($post->post_date);
    } catch (Exception $e) {
      echo $e->getMessage();
      exit(1);
    }
    $date = $date->format($datef); // Same issue as before -- this date should be localized
提前感谢您展示了实现这些修复的更好方法(或指出这些修复失败的地方)。

Update

我知道我知道不要破解核心。我想将这段代码作为补丁提交给Wordpress,因此我希望确保我的做法是正确的。非常感谢。

1 个回复
SO网友:Justin Carboneau

不建议对核心进行黑客攻击,因为每次更新时都必须重新应用黑客攻击(以及其他一些原因)。

我通常会做的第一件事是检查是否有挂钩或过滤器允许您修改日期。似乎没有。

接下来您可能要检查的是,您想要更改的函数是否在可插入函数列表中(WordPress允许您覆盖的函数)-http://codex.wordpress.org/Pluggable_Functions - 而这个函数似乎不是。

因此,我的建议是创建一个自定义日期字段(高级自定义字段插件非常适合)。然后,如果需要按日期排序,只需将查询设置为按该自定义元字段排序,而不是按标准的发布日期字段排序。

结束

相关推荐

如何在wp_UPDATE_NAV_MENU挂钩中获取菜单位置

我想在wp_update_nav_menu (在菜单保存操作期间) add_action(\'wp_update_nav_menu\', function ($id, $data = NULL) { error_log( var_export($data, true) ); }, 10, 2); 但是,数据仅包含menu-name, 那么我怎样才能知道菜单的位置呢?