WordPressでPDFの領収書を動的に出力する

会員サイトで商品を販売している場合など、ユーザーがマイページで領収書をダウンロードできるようにしたいケースがあると思います。
WordPressとTCPDFライブラリを使うと、内容を動的に変更してPDFを出力することができます。
今回は、WordPressで定員と申込期限のあるフォームを作るで作成したイベントに「受講料」のカスタムフィールドを追加して、動的な領収書ダウンロード機能を実装したいと思います(会員機能は割愛します)。

デモページはこちら

TCPDFのダウンロード

ライブラリはGitHubで公開されています。
https://github.com/tecnickcom/tcpdf

ダウンロードしてテーマ内の任意の場所にアップロードします。

イベント参加履歴ページの作成

イベントの一覧を取得して、それぞれに領収書ダウンロードのフォームを用意します。
ダウンロードページへのアクセスを制限するため、Nonceを使いましょう。

<?php
  $args = array(
    'post_type' => 'event-demo',
    'posts_per_page' => -1,
  );
  $the_query = new WP_Query($args);
  if ( $the_query->have_posts() ) :
?>
<table>
  <thead>
    <tr>
      <th>イベント</th>
      <th>受講料</th>
      <th>領収書</th>      
    </tr>
  </thead>
  <tbody>
<?php
    while ( $the_query->have_posts() ) :
      $the_query->the_post();
?>
    <tr>
      <td><?php the_title(); ?></td>
      <td><?php echo number_format(get_field('fee')); ?>円</td>
      <td>
        <form method="post" action="<?php echo esc_url(get_permalink(get_page_by_path('receipt-pdf-demo')->ID)); ?>">
          <?php wp_nonce_field('my_receipt_' . get_the_ID()); ?>
          <input type="hidden" name="event_id" value="<?php the_ID(); ?>" />
          <input type="submit" value="発行する">
        </form>
      </td>
    </tr>
<?php
    endwhile;
    wp_reset_postdata();
?>
  </tbody>
</table>
<?php
  endif;
?>

PDFの出力

ヒアドキュメント内で{$変数名}と記述することで、発行日や金額などを動的に変更することができます。

$should_redirect = TRUE;

do {
  /* セキュリティチェック */
  if ( !isset($_POST['_wpnonce']) ) break;
  if ( !isset($_POST['event_id']) || is_array($_POST['event_id']) || !is_numeric($_POST['event_id']) ) break;
  $event_id = sanitize_text_field($_POST['event_id']);
  if ( !wp_verify_nonce($_POST['_wpnonce'], 'my_receipt_' . $event_id) ) break;
  
  /* イベント情報を取得 */
  $title = get_the_title($event_id);
  $fee = number_format(get_field('fee', $event_id));
  $date = wp_date("Y年m月d日");
  
  $should_redirect = FALSE;
  
  /* TCPDFクラスのインスタンスを生成 */
  require_once(dirname(__FILE__) . '/my_lib/tcpdf/tcpdf.php');
  $pdf = new TCPDF();
  
  $pdf->setPrintHeader(false);  // ヘッダー非表示
  $pdf->setPrintFooter(false);  // フッター非表示
  $pdf->SetFont('kozgopromedium', '', 10);  // フォントを指定
  $pdf->SetTitle('領収書'); // タイトルを設定
  $pdf->AddPage();  // ページを追加
  
  /* 出力する内容をHTMLで記述 */
  $html = <<< EOF
  <style>
  h1 {
    text-align: center;
    text-decoration: underline;
    font-size: 24px;
  }
  table {
    width: 100%;
  }
  </style>
  <h1>領収書</h1>
  <table>
    <tr>
      <td colspan="5">山田太郎 様</td>
    </tr>
    <tr>
      <td colspan="5" style="text-align: right">発行日 {$date}</td>
    </tr>
    
/* (中略) */
    
  </table>
  
  EOF;
  
  /* PDFを出力 */
  $pdf->writeHTML($html);
  $pdf->Output('receipt.pdf', 'I');
}
while ( FALSE ) ;

/* 不正なアクセスの場合はリダイレクト */
if ( $should_redirect ) {
  wp_safe_redirect(get_permalink(get_page_by_path('receipt-demo')->ID));
  exit;
}

以上で実装完了です。

最後に

TCPDFで使えるHTMLやCSSプロパティは限られているので、体裁を整えるには工夫が必要です。
imgタグは使えるので、電子印鑑を組み込むことはできそうですね。

コメント