WordPress 同时显示文章创建和修改日期

问题: WordPress默认发表的每篇文章标题下只显示创建日期和作者,而我想修改成同时显示创建日期和最后更新日期,查看了下设置里没有这个选项,只好自己搜索源码,查找并修改实现了,这里简单记录一下思路,以后遇到类似问题,都可以采用类似方法解决。

首先查看HTML源码,可以发现这个日期包括在一个div里,类是entry-meta

<div class="entry-meta">
	<time class="entry-time" datetime="..." itemprop="datePublished" title="...">...</time>
</div>

尝试搜索这个类名,就发现了wp-content/themes/../partials/entrypbyline.php这个文件:

$ find . -name '*.php' -exec grep -Hn "entry-meta" {} \;
./entry-byline.php:1:<div class="entry-meta">

打开此文件,果然就是负责生成这个HTML div的,因此只要修改这里就好了:

<div class="entry-meta">
        <time <?php omega_attr( 'entry-published' ); ?>><?php echo get_the_date(); ?></time>
        <span <?php omega_attr( 'entry-author' ); ?>><?php echo __('by', 'omega');?> <?php the_author_posts_link(); ?></span>
        <?php echo omega_post_comments( ); ?>
        <?php edit_post_link( __('Edit', 'omega'), ' | ' ); ?>
</div><!-- .entry-meta -->

看代码,应该就是get_the_date() 这个函数负责读取并填充日期了, 继续搜索:

$ find . -name "*.php" -exec grep -Hn "function get_the_date" {} \;
./wp-includes/general-template.php:2523:function get_the_date( $format = '', $post = null ) {

打开这个文件,就可以发现这个函数的实现里调用了另一个函数get_post_time:

function get_the_date( $format = '', $post = null ) {
       ...
        $the_date = get_post_time( $_format, false, $post, true );
       ...
}

而这个函数get_post_time()的实现也在同一个文件内:

function get_post_time( $format = 'U', $gmt = false, $post = null, $translate = false ) {
   ...
        $datetime = get_post_datetime( $post, 'date', $source ); //default is date, change to 'modified' by Chuantao

继续追踪里面的这个get_post_datetime,就发现了这里有个$field参数控制着 时间选择,默认date是创建日期,modified就是修改日期:

 /*
 * @param string      $field  Optional. Published or modified time to use from database. Accepts 'date' or 'modified'. Default 'date'.           
 ...
 */
function get_post_datetime( $post = null, $field = 'date', $source = 'local' ) {
     
      $time     = ( 'modified' === $field ) ? $post->post_modified_gmt : $post->post_date_gmt;
                $timezone = new DateTimeZone( 'UTC' );
        } else {
                $time     = ( 'modified' === $field ) ? $post->post_modified : $post->post_date;
                $timezone = $wp_timezone;
        }


至此,找到解决方案了,把上面的两个函数依次复制改名实现一番,最终调用函数里改成调用modified即可。具体做法

  1. 修改wp-includes/general-template.php:
    1.1. 基于get_the_date 添加函数get_the_date_modified_CT(), 内部调用从get_post_time改为get_post_time_modified_CT()。
    1.2. 基于get_post_time添加函数get_post_time_modified_CT(), 内部调用get_post_datetime函数时,把第2个参数从 'date'修改为'modified'就可以了。
  2. 修改wp-content/themes/omega/partials/entry-byline.php:
<div class="entry-meta">
        <time <?php omega_attr( 'entry-published' ); ?>><?php echo "Created/发表: ".get_the_date().", updated/更新: ".get_the_date_modified_CT(); ?></time>

至此,修改结束。由于我用了翻译插件polylang,所以这里最好是能自动根据语言显示Create/发表就好了,只是不想再细究了。

总结: 多 用查找,耐心对比,即可实现修改。