web-dev-qa-db-ja.com

Wordpressで添付ファイルをスケジュールすることは可能ですか?

よく知られているように、Wordpressで公開するように投稿をスケジュールすることは可能です。

また、添付ファイルは実際には投稿です(より内部的な、技術的な意味で)。

ですから、今私を悩ませているのは、添付ファイルをスケジュールすることも可能かということです。例えば、フォトギャラリーは時間とともに成長するのが好きですか?

6
hakre

添付ファイルの投稿日を設定できるというのが私の考えです。これは、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;
}

添付ファイルのページには、次のように表示されます。

Attachments date

それでは、添付ファイルの保存時に投稿日を設定しましょう。

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を使用しているのでこれは機能しません。そのため、カスタムショートコードを作成するかデフォルトを上書きする必要があります。

3
gmazzap

一度に完全なギャラリーを作成し、それにカスタムショートコードハンドラを使用してください。

ショートコードハンドラでは、アドベントカレンダーの添付ファイルを数えるか、添付ファイルの投稿メタを検索します。まだ表示されていない場合は、画像をプレースホルダに置き換えるか、完全に非表示にします。

WordPressは直接ファイル要求に関与していないため、添付ファイルはアップロードされた瞬間に公開されます。

1
fuxia