見出し画像

WordPressでCSVインポート機能の実装(自作プラグイン) | アダルトアフィリエイト

前回は記事投稿を楽にするAdvanced Custom Fields(ACF)の使い方を説明しました。
今回はこのACFで作成した記事構成を元にWordPressにCSVデータをインポートして予約投稿できる自作プラグインの作り方を解説しようかと思います。

CSVインポートは既存のプラグインが存在してますが、あまりプラグインを入れたくないのと、今回は勉強も兼ねて自作でCSVインポートを作ってみました。


前提として

今回は自分のサイトの記事構成を例にするので、CSVの順番は下記のようになります。

  1. タイトル

  2. ジャンルタグ

  3. 動画説明

  4. 出演女優

  5. サムネイル

  6. 動画

  7. 動画リンク

  8. 関連動画リンク

  9. 画像グループ

WPにおける自作プラグインの作り方

WordPressでの自作プラグインを作る手順は以下です。

フォルダとファイルの作成

  • wp-content/plugins/ディレクトリに新しいフォルダを作成します。このフォルダがプラグインの名前になります。今回はcsv-importer-pluginとします。

  • フォルダ内にPHPファイルを作成します。今回はcsv-importer-plugin.phpになります。

プラグインのヘッダー情報

csv-importer-plugin.phpには先頭に以下のようなコメントでヘッダー情報が必要になります。

<?php
/**
 * Plugin Name: CSV Importer Plugin
 * Description: CSVファイルをインポートして、投稿、カスタムフィールド、カスタムタクソノミーを作成するプラグイン
 * Version: 1.0
 */

管理画面に「CSVインポート」メニューを追加

<?php

// ...

// セキュリティのため、直接アクセスを防ぐ
if (!defined('ABSPATH')) {
  exit; // ABSPATHが定義されていない場合、スクリプトを終了する
}

// 管理画面にメニューを追加するアクションフック
add_action('admin_menu', 'csv_importer_menu');

// 管理画面に「CSVインポート」メニューを追加
function csv_importer_menu() {
  add_menu_page(
    'CSVインポート',      // ページのタイトル
    'CSVインポート',      // メニューに表示される名前
    'manage_options',     // アクセス権限(管理者のみ)
    'csv-importer',       // メニューのスラッグ(URLに使われる識別子)
    'csv_importer_page'   // メニューをクリックしたときに表示する関数
  );
}

上記コードを書くと管理画面に「CSVインポート」メニューが追加されます。

add_menu_pageのコールバック関数(csv_importer_page())

add_menu_page()の5番目の引数はコールバック関数になりメニューページを表示します(ここではcsv_importer_page)
コードは下記のようになります。

// 「CSVインポート」ページの内容
function csv_importer_page() {
  ?>
  <div class="wrap">
    <h1>CSVインポート</h1>
    <form method="post" enctype="multipart/form-data">
      <!-- 予約投稿日時を指定するための入力フォーム -->
      <label for="post_date">予約投稿日時を設定:</label><br>
      <input type="datetime-local" name="post_date" required><br><br>

      <!-- CSVファイルをアップロードするための入力フォーム -->
      <label for="post_date">CSVファイルをアップロード:</label><br>
      <input type="file" name="csv_file" required>
      <input type="submit" name="import_csv" value="インポート" class="button button-primary">
    </form>
  </div>
  <?php
  // フォームが送信された場合
  if (isset($_POST['import_csv'])) {
    // 入力された予約投稿日時をサニタイズ(安全な形に整形)
    $post_date = sanitize_text_field($_POST['post_date']);

    // CSVファイルが正しくアップロードされ、予約投稿日時が設定されている場合
    if (!empty($_FILES['csv_file']['tmp_name']) && !empty($post_date)) {
      // インポート処理を実行
      csv_importer_process($_FILES['csv_file']['tmp_name'], $post_date);
    }
  }
}

ここでは「CSVインポート」ページの内容を記載してます。
予約投稿ができるようにinputのtypeでdatetime-localを指定しカレンダーで楽に選べるようにしてます。

次にフォームが送信されCSVファイルが正しくアップロードされてからのインポート処理の関数csv_importer_process()を見てみましょう。

CSVファイルを処理

// CSVファイルを処理して、投稿を作成する関数
function csv_importer_process($file, $post_date) {
  // CSVファイルを開く
  if (($handle = fopen($file, 'r')) !== FALSE) {
    // ファイルの各行を処理
    while (($data = fgetcsv($handle)) !== FALSE) {
      // 各行のデータを投稿情報として準備
      $post_data = array(
        'post_date' => $post_date,   // 投稿の予約日時
        'title' => $data[0],         // 投稿タイトル(CSVの1列目)
        'tags' => $data[1],          // 投稿タグ(CSVの2列目)
        'taxonomies' => array(       // カスタムタクソノミー(actorを設定)
          'actor' => explode(',', $data[3]),  // カンマ区切りの値を配列に変換
        ),
        'acf_fields' => array(       // ACFカスタムフィールド(CSVの各列)
          'description' => $data[2],
          'external_thumbnail_url' => $data[4],
          'movie' => $data[5],
          'full_movie_link' => $data[6],
          'related_movie_link' => $data[7],
          'image_group' => array(    // 画像グループフィールド
            'image_01' => $data[8],
            'image_02' => $data[9],
            'image_03' => $data[10],
          )
        ),
      );

      // 投稿を作成する関数を呼び出し
      create_post_from_csv($post_data);
    }
    // CSVファイルを閉じる
    fclose($handle);
    // インポート完了メッセージを表示
    echo '<div class="updated"><p>インポートが完了しました</p></div>';
  } else {
    // ファイルの読み込みに失敗した場合のエラーメッセージ
    echo '<div class="error"><p>CSVファイルの読み込みに失敗しました。</p></div>';
  }
}

ここで各行のデータを変数$post_dataに配列で投稿情報として入れときます。また、$data[0]の0などは先ほどのCSVで準備した順番となります。
紛らわしいですが、csv_importer_process()関数の第2引数の$post_dateは予約投稿日となります。
最後に投稿を作成する関数を見てみましょう。

WordPressに予約投稿を作成する

// CSVから投稿を作成する関数
function create_post_from_csv($post_data) {
  // 投稿データを準備
  $post_arr = array(
    'post_title' => $post_data['title'],       // 投稿タイトル
    'post_status' => 'future',                 // ステータスは予約投稿
    'post_date' => $post_data['post_date'],    // 予約日時
    'post_type' => 'post',                     // 投稿タイプ
    'tags_input' => explode(',', $post_data['tags']),  // タグをカンマ区切りで配列に変換
  );

  // 投稿を作成し、投稿IDを取得
  $post_id = wp_insert_post($post_arr);

  // 投稿IDが正常に生成された場合
  if ($post_id) {
    // ACFフィールドがある場合、それぞれのフィールドを更新
    if (isset($post_data['acf_fields'])) {
      foreach ($post_data['acf_fields'] as $field_key => $field_value) {
        update_field($field_key, $field_value, $post_id);
      }
    }

    // カスタムタクソノミーがある場合、設定を更新
    if (isset($post_data['taxonomies'])) {
      foreach ($post_data['taxonomies'] as $taxonomy => $terms) {
        wp_set_object_terms($post_id, $terms, $taxonomy);
      }
    }
  }
}

詳しくはコメントに書いてある通りになります。

投稿を作成したらcsv_importer_process()の最後にあるようにfclose()でCSVを閉じ「インポートが完了しました」と表示されます

まとめ

今回はWordPressでCSVをインポートするプラグインを自作しました。
WordPressでの自作プラグインは割と簡単に作れることが分かり良かったです。

この記事が参考になれば幸いです☘️

それでは良いWordPressライフを!

この記事が気に入ったらサポートをしてみませんか?