はじめに
プラグイン「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',
]);
}
});
さいごに
今回紹介した方法を使えば、公開期限付きの記事を実装することができます。
この方法では、プラグインを使わずに、独自に記事の公開期限を設定し、期限を過ぎた投稿を自動的に「非公開」に変更することができます。
