よく知られているように、Wordpressで公開するように投稿をスケジュールすることは可能です。
また、添付ファイルは実際には投稿です(より内部的な、技術的な意味で)。
ですから、今私を悩ませているのは、添付ファイルをスケジュールすることも可能かということです。例えば、フォトギャラリーは時間とともに成長するのが好きですか?
添付ファイルの投稿日を設定できるというのが私の考えです。これは、UIを表示するためにattachment_fields_to_edit
を使用して行うことができます(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;
}
ギャラリーのショートコード(または好きな場所)に、投稿タイプ引数をWP_Query
に設定する'attachment'
を必ず使用してください。
標準の[gallery]
shortcodeでは、クエリフィルタが抑制されている場所ではget_children
を使用しているのでこれは機能しません。そのため、カスタムショートコードを作成するかデフォルトを上書きする必要があります。
一度に完全なギャラリーを作成し、それにカスタムショートコードハンドラを使用してください。
ショートコードハンドラでは、アドベントカレンダーの添付ファイルを数えるか、添付ファイルの投稿メタを検索します。まだ表示されていない場合は、画像をプレースホルダに置き換えるか、完全に非表示にします。
WordPressは直接ファイル要求に関与していないため、添付ファイルはアップロードされた瞬間に公開されます。