问题: 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即可。具体做法
- 修改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'就可以了。 - 修改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/发表就好了,只是不想再细究了。
总结: 多 用查找,耐心对比,即可实现修改。