【WordPress】ログイン不要で非公開投稿を一時的に共有するURLを生成する方法

【WordPress】ログイン不要で非公開投稿を一時的に共有するURLを生成する方法 WordPress

WordPressでは「非公開投稿」はログインユーザーしか閲覧できません。しかし、外部のクライアントや確認者にログインなしで一時的に非公開投稿を共有したいケースもあります。

この記事では、非公開投稿に対して「一時的に有効な共有リンク」を生成し、ログイン不要で閲覧できる仕組みを実装する方法を紹介します。

仕組みの概要

– 非公開投稿に専用の一時公開トークンを発行
– そのトークン付きURL(例:`/?p=123&token=abc123`)にアクセスがあれば、ログインしていなくても表示許可
– トークンはランダム生成&投稿ごとに保存

1. 投稿に一時トークンを保存するカスタムフィールドを追加

以下のコードを functions.php に追加して、投稿保存時にトークンが未設定なら自動生成します。


function add_share_token_on_save($post_id) {
  if (get_post_status($post_id) !== 'private') return;

  if (!get_post_meta($post_id, '_share_token', true)) {
    $token = bin2hex(random_bytes(8));
    update_post_meta($post_id, '_share_token', $token);
  }
}
add_action('save_post', 'add_share_token_on_save');

2. 非ログインでもトークン付きアクセスなら表示許可

次に、投稿ページにアクセスがあった際、トークン一致で表示許可する処理を追加します。


function allow_private_post_with_token($posts) {
  if (is_admin() || !is_main_query()) return $posts;
  if (empty($posts)) return $posts;

  $post = $posts[0];

  if ($post->post_status !== 'private') return $posts;

  $token = get_post_meta($post->ID, '_share_token', true);
  $url_token = isset($_GET['token']) ? sanitize_text_field($_GET['token']) : '';

  if ($token && $token === $url_token) {
    $post->post_status = 'publish';
    return [$post];
  }

  return [];
}
add_filter('the_posts', 'allow_private_post_with_token');

3. 共有URLの取得方法

投稿編集画面で以下のような関数を呼び出して、共有URLを表示するカスタムメタボックスなどを作成できます。


function get_private_share_url($post_id) {
  $token = get_post_meta($post_id, '_share_token', true);
  return get_permalink($post_id) . '?token=' . $token;
}

4. 有効期限付きの実装(オプション)

トークンの発行日時も保存して、一定時間後に無効化することも可能です。たとえば、有効期限を48時間に設定したい場合:


// 保存時に発行日時も記録
update_post_meta($post_id, '_share_token_date', current_time('timestamp'));

その後、`allow_private_post_with_token` フィルター内で時間チェックを追加してください。

まとめ

非公開投稿でもトークン付きURLを使えば、ログイン不要で一時的に共有することが可能です。この仕組みは、クライアント確認やレビュー時の投稿共有に非常に便利です。適切なセキュリティ対策(ランダム性・有効期限・SSLなど)とあわせて活用しましょう。