期限付きで投稿を表示する方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

はじめに

プラグイン「Post Expirator」などを使用せずに、記事に公開期限を実装します。

公開期限を過ぎた場合、投稿ステータスを「非公開」に変更し、表示対象から除外します。

この記事では、この方法について説明します。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// メタボックスを追加
add_action('add_meta_boxes', function () {
  add_meta_box(
    'draft_datetime',
    '非公開にする日時',
    'render_draft_datetime',
    'post',
    'side',
    'high'
  );
});


/**
 * メタボックスの入力フォームを出力
 *
 * @param WP_Post $post 現在の投稿オブジェクト
 * @return void
 */
if (!function_exists('render_draft_datetime')):
function render_draft_datetime($post) {
  // 現在のカスタムフィールドの値を取得
  $draft_datetime = get_post_meta($post->ID, 'my_draft_datetime', true);

  // UNIXタイムスタンプの形式を変換
  $draft_datetime_display = $draft_datetime ? date('Y-m-d\TH:i', $draft_datetime) : '';

  wp_nonce_field('draft_datetime_action', 'draft_datetime_nonce');
  ?>
  <label for="my_draft_datetime">非公開にする日時:</label>
  <input type="datetime-local" id="my_draft_datetime" name="my_draft_datetime" value="<?= esc_attr($draft_datetime_display); ?>" />
  <?php
}
endif;


// 投稿データを保存
add_action('save_post', function ($post_id) {
  // nonceチェック
  if (!isset($_POST['draft_datetime_nonce']) || !wp_verify_nonce($_POST['draft_datetime_nonce'], 'draft_datetime_action')) {
    return;
  }

  // 自動保存チェック
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }

  // リビジョンは除外
  if (wp_is_post_revision($post_id)) {
    return;
  }

  // 権限チェック
  if (!current_user_can('edit_post', $post_id)) {
    return;
  }

  // 入力値が存在し、かつ空ではない場合のみタイムスタンプを保存
  if (!empty($_POST['my_draft_datetime'])) {
    $draft_datetime_input = sanitize_text_field($_POST['my_draft_datetime']);

    // 入力値が正しい日付形式かチェック
    if ($timestamp = strtotime($draft_datetime_input)) {
      // UNIXタイムスタンプとして保存
      update_post_meta($post_id, 'my_draft_datetime', $timestamp);
      return;
    }
  }

  // 入力かフィールドが空の場合はカスタムフィールドを削除
  delete_post_meta($post_id, 'my_draft_datetime');
});


// 対象の処理を実行
add_action('init', function () {
  // 現在の時間を取得
  $now = current_time('timestamp');

  $args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'meta_query' => [
      [
        'key' => 'my_draft_datetime',
        'value' => $now,
        'compare' => '<=',
        'type' => 'NUMERIC',
      ],
    ],
    'posts_per_page' => -1,
  ];

  $posts = get_posts($args);

  // 該当する投稿を非公開に変更
  foreach ($posts as $post) {
    wp_update_post([
      'ID' => $post->ID,
      'post_status' => 'private',
    ]);
  }
});

さいごに

今回紹介した方法を使えば、公開期限付きの記事を実装することができます。
この方法では、プラグインを使わずに、独自に記事の公開期限を設定し、期限を過ぎた投稿を自動的に「非公開」に変更することができます。

タイトルとURLをコピーしました