TECHSCORE BLOG

クラウドCRMを提供するシナジーマーケティングのエンジニアブログです。

WordPressの公開プレビュー機能プラグインを作ってみた

こんにちは。シナジーマーケティングの松澤和輝です。
FAVTOWNというサービスの開発を担っています。 今回はFAVTOWNのサイトに追加されるページを一般公開前にログイン無しで確認できるプラグインを作成したので、その内容について紹介します。

FAVTOWN について

FAVTOWN とは 「ふるさと(生まれ育った地元や、住んだことのある愛着のある場所)を離れてがんばるひとを応援したい」 というサービスです。 FAVTOWNではWordPressを利用して運営しています。

作成したプラグインの概要

このプラグインは、特定のクエリパラメーター付きでアクセスすることで、通常はログインした編集権限以上のユーザーしか確認できない「未公開状態」のページ(例: 下書き、承認待ち、予約投稿)をプレビュー表示できるようにします。

プラグイン側で大部分を制御していますが、一部の機能実現にはテーマファイルへのコード追加も必要となっています。ただし、プラグインが無効化されてもエラーが発生しないよう、テーマ側のコードには十分な安全策を講じています。

プラグインを作成した背景

標準的なWordPress環境では、未公開投稿のプレビューは「ログインした編集権限以上のユーザー」のみが可能です。そのため、たとえば「お知らせページ」を事前に確認する際には、以下のフローを踏む必要がありました。

  1. 本番環境で新規のお知らせページを「下書き保存」
  2. 上長や依頼元担当者(確認者)がWordPress管理画面へログイン
  3. 確認者がプレビューURLを開き、内容をチェック

この手順では、プレビューのたびにログインが必要となり、確認作業が円滑に進まず手間がかかります。

この問題を解消するため、クエリパラメーターを用いて、ログイン不要で未公開ページをプレビューできる仕組みを導入しようと考えました。当初は既存のプラグインの利用も検討しましたが、以下の理由から断念しています。

  • 独自テーマとの非互換性への懸念:自社独自のテーマを利用している場合、既存プラグインが期待どおりに動作しない可能性が高い。
  • カスタマイズ性の制約:既存プラグインの仕様やコード構成に依存するため、機能拡張や微調整が難しく、将来のメンテナンス性にも不安がある。

これらを考慮した結果、自前でプラグインを開発することにより、要件に合致した柔軟な機能を実現できると判断しました。これにより、ログイン不要で未公開ページをプレビューできる環境が整い、確認作業を大幅に効率化できます。

作成したプラグイン

機能

  1. 未公開投稿のプレビュー機能
    特定のクエリパラメーター付きでアクセスした場合、未公開状態(例: 下書き、承認待ち、公開予約済み)の投稿をプレビュー可能にします。

  2. セキュリティ対策
    未公開情報が流出しないよう、URLに含まれるトークンを検証します。トークンが一致しない場合は、未公開の投稿は表示されません。

  3. トークン管理
    トークンは管理画面から再生成可能です。トークンが外部に漏洩した場合でも再生成することで安全性を保てます。

  4. プレビュー対象の投稿ステータスの設定
    管理画面で、プレビュー可能な投稿ステータス(下書き、承認待ち、公開予約など)を自由に選択できます。

実装内容

  1. クエリパラメーターとトークンの検証
    URLに付与されたクエリパラメーターと独自に発行したトークンを検証します。 トークンが一致し、かつ指定された条件(投稿ステータスなど)を満たしている場合に限り、未公開の投稿をプレビュー表示できます。
  2. 管理画面での設定
    • プレビュー可能な投稿ステータスを選択できる画面を提供。
    • トークンの再生成機能を提供。
  3. 管理画面でのプレビューURLの取得
    • 投稿一覧からプレビューページへのアクセスができるようリンクを表示。
    • アーカイブページのプレビューリンクも管理画面に表示。

プラグインで制御できない部分

一部、投稿一覧ページ(例: お知らせ一覧)のようなカスタムテンプレートにおける投稿の取得処理については、テーマファイル側に変更を加える必要があります。

対応内容

  • WP_Query の引数(配列)に 'post_status' の値を追加し、公開プレビュー用の投稿ステータスを含めるように設定。

プラグイン無効化時の安全性

プラグインが無効化された場合や、読み込めない場合でもエラーが発生しないよう、以下の対応を行っています。

  • ラップ関数の使用

テーマファイル側でラッパー関数を作成し、プラグインが存在しない場合はデフォルトの動作を実行するようにしています。 以下が実装したラップ関数です。

<?php

function apply_public_preview_status($args) {
  if (function_exists('set_public_preview_post_status')) {
      return set_public_preview_post_status($args);
  }
  // プラグインが無効化されている場合のデフォルト動作
  if (!isset($args['post_status'])) {
      $args['post_status'] = 'publish';
  }
  return $args;
}

利用の流れ

  1. プラグインを有効化。
  2. 管理画面の「設定」→「公開プレビュー設定」でプレビュー可能なステータスを選択。
  3. 記事作成後、プレビュー用URLを生成し、確認者に共有。

まとめ

公開プレビューを可能にするプラグインを作成しました。 今回作成したプラグインは新規投稿前にプレビュー表示できる機能ですが、すでに公開済みの投稿を編集した際のプレビューは確認することができません。 今後、その点も改善しさらに運用しやすくしていきます!

松澤 和輝(マツザワ カズキ)

フロントエンドを担当しているエンジニアです。
趣味は写真です。休日はカメラをぶら下げていろいろなところを徘徊しています。


シナジーマーケティング株式会社では一緒に働く仲間を募集しています。