我的想法是,您可以为附件设置发布日期。这可以使用attachment_fields_to_edit
要显示UI(可以使用touch_time
内部功能)。
之后,您可以过滤所有附件查询,以仅显示具有过去或当前日期的附件。
所以
add_action(\'load-post.php\', \'setup_attachment_fields\');
function setup_attachment_fields() {
$scr = get_current_screen();
if ( $scr->post_type === \'attachment\' ) {
add_filter("attachment_fields_to_edit", "add_date_to_attachments", null, 2);
}
}
function add_date_to_attachments( $form_fields, $post = NULL ) {
printf(\'<label for="content"><strong>%s</strong></label>\', __(\'Date\'));
touch_time( 1, 1, 0, 1 );
return $form_fields;
}
现在,在附件页面上,您将看到如下内容:
现在,让我们在附件保存时设置发布日期:
add_filter("attachment_fields_to_save", "save_date_to_attachments");
function save_date_to_attachments( $post ) {
foreach ( array(\'mm\', \'jj\', \'aa\', \'hh\', \'mn\') as $f ) {
$$f = (int) filter_input(INPUT_POST, $f, FILTER_SANITIZE_NUMBER_INT);
}
if ( ! checkdate ( $mm, $jj, $aa ) ) return; // bad data, man
if ( ($hh < 0 || $hh > 24) ) $hh = 0;
if ( ($mn < 0 || $mn > 60) ) $mn = 0;
$ts = mktime($hh, $mn, 0, $mm, $jj, $aa);
$date = date( \'Y-m-d H:i:s\', $ts );
$date_gmt = date( \'Y-m-d H:i:s\', ( $ts + ( get_option( \'gmt_offset\' ) * HOUR_IN_SECONDS ) ) );
$modified = current_time( \'mysql\');
$modified_gmt = current_time( \'mysql\', true);
global $wpdb;
$data = array(
\'post_date\' => $date,
\'post_date_gmt\' => $date_gmt,
\'post_modified\' => $modified,
\'post_modified_gmt\' => $modified_gmt,
);
$wpdb->update( $wpdb->posts, $data, array( \'ID\' => $post[\'ID\'] ), \'%s\', \'%d\' );
}
保存附件后,发布日期将设置为您在日期字段中设置的任何日期。
但是,无论日期如何,附件都是可见的,因为WordPress不会在附件查询中检查日期。让我们在where子句中添加一个过滤器:
add_filter( \'posts_where\', \'not_future_attachment\', 9999, 2 );
function not_future_attachment( $where, $query ) {
if ( is_admin() ) return $where;
if ( $query->get(\'post_type\') === \'attachment\' ) {
global $wpdb;
$where .= $wpdb->prepare(
" AND ($wpdb->posts.post_date <= %s)", current_time( \'mysql\')
);
}
return $where;
}
现在,在gallery(或任何您想要的地方)的快捷代码中,请确保使用
WP_Query
将post类型参数设置为
\'attachment\'
.
按标准[gallery]
快捷码由于使用get_children
如果查询过滤器被抑制,则必须创建自定义快捷码或覆盖默认值。