目的

カスタムテーマを適用すると同時に、必要な固定ページなどを一括で登録する

背景

  1. 企業向けサイトを作成するときに、いつでもコンテンツをリセットできるような環境を作りたいから
  2. 他の環境に移行するなどしたときでも簡単にセットアップできるようにしたいから

解決策

1. 初期コンテンツの作成

下記のようにテーマディレクトリの下にinitializeディレクトリ配下に初期コンテンツを配置する

mytheme/initialize/index.page.html
mytheme/initialize/contact.page.html
mytheme/initialize/form.wpcf7_contact_form.html
...

ここではタイトルとページ情報(固定なのかcontact-formなのか)をファイル名に付与してある
実際のコンテンツには色々種類があるため、それらの情報をファイル名にドット区切りで持たせておく

なおここでは省略するが.htaccessやパーミッションの設定をしないと公開状態になるので注意

2. functions.phpの編集

主に、after_switch_themeトリガを利用して初期コンテンツを登録する

add_action('after_switch_theme', 'my_setup_content');

続いてコンテンツの初期化を行う関数の追加する
やっていることはinitialize配下のhtmlファイルを取り、パースして登録
最後に全体のオプションの初期化をしている(これは要件によって違うので外してもいい)

function my_setup_content () {

  foreach (glob(get_theme_file_path() . "/initialize/*.html") as $filename) {
    if(is_file($filename)) {
      list($title, $type, $format) = explode('.', $filename);
      my_buildInitialPage(basename($title), file_get_contents($filename), $type);
    }
  }

  $index = get_page_by_title('index');
  update_option('page_on_front', $index->ID);
  update_option('show_on_front', 'page');
  update_option('permalink_structure', '/%postname%/');
}

最後にページを登録する関数を追加する
ページタイトルとコンテンツ本体、そして種類を取って、適切に登録していく


function my_buildInitialPage($title, $content, $type) {
  if($type == 'wpcf7_contact_form') {
    require_once(WP_PLUGIN_DIR . '/contact-form-7/wp-contact-form-7.php');
    $contact_form = WPCF7_ContactForm::get_template( array(
      'title' => $title ) );
    $contact_form->set_properties( array( 'form' => $content ) );
    $contact_form->save();
    return;
  }
  $template = '';
  $page_check = get_page_by_title($title);
  $new_page = array(
    'post_type' => $type,
    'post_title' => $title,
    'post_content' => $content,
    'post_status' => 'publish',
    'post_author' => 1,
  );
  if(!isset($page_check->ID)){
    $new_page_id = wp_insert_post($new_page);
    if(!empty($template)){
      update_post_meta($new_page_id, '_wp_page_template', $template);
    }
  }
}

課題

ぶっちゃけWP-CLIを使えばこんな面倒なことをしなくて済むはずなのだが、現実にはCLIを使えない人や使わせたくない人、そもそも環境的にNGなどがあって辛い