公開終了日時(閉鎖日時)を設定して自動的に記事を非公開にする方法

WordPressで投稿タイプ「news」に対して、公開終了日時を設定し、終了日時になったら自動的に非公開にしたい場合があります。ここでは、プラグインを使わずに functions.php にコードを追加して「閉鎖日時(表示終了日時)」を設定する方法を紹介します。

メタボックスを追加して閉鎖日時を入力

子テーマの functions.php に以下のコードを追加してください。投稿編集画面に「閉鎖日時(表示終了日時)」欄が表示され、カレンダー付きで日時を選択できます。


/* -------------------------------------------------
 * メタボックス:閉鎖日時(終了日時)
 * 投稿タイプ:ブログ投稿(post)と固定ページ(page)
 * ------------------------------------------------- */
function add_closedatetime_meta_box() {
    $post_types = array('post', 'page'); // 対象投稿タイプ
    foreach ( $post_types as $pt ) {
        add_meta_box(
            'closedatetime',               // ID
            '閉鎖日時(表示終了日時)',   // タイトル
            'display_closedatetime_meta_box', // 表示コールバック
            $pt,
            'side',
            'default'
        );
    }
}
add_action( 'add_meta_boxes', 'add_closedatetime_meta_box' );

/**
 * 入力フィールド表示
 * 保存形式:Y-m-d H:i:s(WP 標準 DATETIME)
 */
function display_closedatetime_meta_box( $post ) {
    $value = get_post_meta( $post->ID, '_closedatetime', true ); // 例: 2025-06-30 18:00:00
    $value_attr = $value ? date( 'Y-m-d\TH:i', strtotime( $value ) ) : '';
	// 入力欄
	echo '<input type="datetime-local" name="closedatetime" value="' . esc_attr( $value_attr ) . '" style="width:80%;">';
	
	// 決定ボタン
	echo ' <button type="button" class="closedatetime-set-btn" onclick="alert(\'保存は投稿も更新してください\')">決定</button>';
}

// 保存処理
function save_closedatetime_meta_box( $post_id ) {
    if ( isset( $_POST['closedatetime'] ) ) {
        $raw = sanitize_text_field( $_POST['closedatetime'] ); // 2025-06-30T18:00
        if ( $raw ) {
            $dt = date( 'Y-m-d H:i:s', strtotime( $raw ) );
            update_post_meta( $post_id, '_closedatetime', $dt );
        } else {
            delete_post_meta( $post_id, '_closedatetime' ); // 空なら削除
        }
    }
}
add_action( 'save_post', 'save_closedatetime_meta_box' );

// 公開終了日時になったら自動で非公開にする
function auto_close_post_page() {
    $args = array(
        'post_type'   => array('post', 'page'), // ブログ投稿と固定ページ
        'post_status' => 'publish',
        'meta_query'  => array(
            array(
                'key'     => '_closedatetime',
                'value'   => current_time('mysql'),
                'compare' => '<=',
                'type'    => 'DATETIME'
            )
        )
    );

    $query = new WP_Query($args);
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            wp_update_post(array(
                'ID'          => get_the_ID(),
                'post_status' => 'private' // 非公開に変更
            ));
        }
        wp_reset_postdata();
    }
}
add_action( 'wp', 'auto_close_post_page' );

補足:
- 「閉鎖日時(表示終了日時)」はカレンダー付きで選択可能
- 設定した日時になると自動で非公開(private)に変更
- 空欄にすると閉鎖日時は削除され、公開状態は維持
- cronやアクセス時にチェックするため、完全リアルタイムではなく数分単位で処理されます

CSSで横並びにする

子テーマの style.css に以下を追加すると、管理画面の閉鎖日時入力欄が横並びになります。


/*公開終了日時(閉鎖日時)を設定して自動的に記事を非公開*/
input.closedatetime-input {
	display: inline-block;
	width: auto;
	min-width: 250px; /* 適宜調整 */
}
  

テーマ別サンプルCSS

Lightning用開


/*Lightning用 公開終了日時(閉鎖日時)を設定して自動的に記事を非公開*/
body.wp-admin.post-type-post input.closedatetime-input,
body.wp-admin.post-type-page input.closedatetime-input {
	padding: 4px;
    border: 1px solid #ddd;
    border-radius: 4px; 
}
  

(例)

Lightning 公開終了日時(閉鎖日時)を設定して自動的に記事を非公開にする

Cocoon用


/*Cocoon用 公開終了日時(閉鎖日時)を設定して自動的に記事を非公開*/
body.wp-admin.post-type-post.cocoon input.closedatetime-input,
body.wp-admin.post-type-page.cocoon input.closedatetime-input {
	padding: 5px;
	border: 1px solid #ccc;
	border-radius: 3px;
	background-color: #f9f9f9;
}
  

(例)

Cocoon 公開終了日時(閉鎖日時)を設定して自動的に記事を非公開にする

まとめ

  • functions.phpにメタボックス追加と保存処理を追加するだけで閉鎖日時を管理可能
  • 投稿タイプ:ブログ投稿(post)と固定ページ(page)に期間限定公開が簡単に設定可能
  • プラグインなしで軽量かつ安全に制御
  • 管理画面で日時を選択できるので操作も簡単

キャンペーンや期間限定ニュースの公開管理に便利な機能です。ぜひ導入してみてください。