WordPressテーマで保守性の高いCSS管理を行うとなると、乗り越えなければならない課題がいくつもあります。CSSプリプロセッサとして Sass (Syntactically Awesome Style Sheets) を使用することで、スタイルを効率的に整理、維持、拡張することができます。

とはいえ、WordPressの開発にマッチする効率的なSassワークフローを実現するには、綿密な計画と技術的なノウハウが必要になります。

今回の記事では、WordPressテーマ開発をする上で役に立つ、プロフェッショナルなSassワークフローの設定方法をご紹介します。最新のビルドツール、スマートなファイル構成、生産性を引き上げスタイルの保守を簡単にするデプロイの実践方法を扱います。

WordPress開発にSassを使用する背景

WordPressの開発では、プラットフォーム内蔵の機能を超えたツールやワークフローに依存することが珍しくありません。Sassは、変数、ネスティング、ミックスイン、インポート、組み込み関数などの機能により、CSSの複雑さを管理する上で重要な役割を果たします。

Sassプログラミング言語の公式サイトトップページには、ピンク色のSassロゴ、ナビゲーションメニュー、および「CSSにスーパーパワーを」というキャッチコピー、そして、その下にはSassの説明文が記載されている。ティール色のキャッツアイメガネのイラストと、Sassの機能とメリットを説明したセクションも。
Sassのウェブサイト

Sassはテーマ開発にいくつものメリットをもたらします。一般的なWordPressのテーマには、数多くのコンポーネントやテンプレートパーツスタイルが含まれています。すべてを単一の扱いにくいスタイルシートで管理する代わりに、Sassを使用することで、保守性と拡張性を促進するモジュラーアーキテクチャが実現します。

この構造的アプローチは、標準的なCSSの垣根を超え、WordPressならではのスタイル要件とうまく合致します。WordPressでstyle.cssを使用するのとは異なり、Sassではモジュールに基づいた目的別のスタイルシートを作成し、簡単なワークフローを使用して最適化されたCSSファイルにコンパイルすることができます。

  1. SassファイルをCSSにコンパイルするビルドプロセス
  2. 維持可能な方法でスタイルを整理するためのファイル構造
  3. ローカルテストと品質保証のための開発ツール
  4. ステージング環境と本番環境に変更をプッシュするためのデプロイメント戦略

このワークフローをどのように実装するかは、チームのツールの好み、技術的なスタック、プロジェクトの複雑さによって異なります。しかし、ほとんどのSassベースのWordPressセットアップは、デバッグのためのソースマップの設定、開発中のファイルの監視、本番環境へのアウトプットの最適化など、一般的なプラクティスに従います。

典型的なセットアップでは、Sassソースファイルとコンパイルされたアセットを分離し、コードベースのメンテナンスとブラウザへのクリーンな出力が容易になります。

WordPressサイト開発でSassをコンパイルする3つの方法

Sassワークフローの基本として、Sassファイルをブラウザで利用可能なCSSに変換するビルドプロセスを経ることになります。WordPressでこれを実装するにはいくつかの方法があります。

1. プラグインの使用─シンプルなアプローチ

WordPressテーマでSassを使用する最も身近な方法はプラグインの使用です。この方法は、開発を始めたばかりであったり、完全なビルドパイプラインを必要としない小さなプロジェクトに向いています。

例えば、WP-Sassで、wp-config.php 、テーマのSassディレクトリの変更を監視しながら、WordPressのネイティブアクションフックを通してコンパイルを処理することができます。

<?php

// クラスを含める(スクリプトをプラグインとして使用する場合を除く)
require_once( 'wp-sass/wp-sass.php' );

// .lessスタイルシートをキューに追加
if ( ! is_admin() )
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.scss' );
else
    wp_enqueue_style( 'admin', get_stylesheet_directory_uri() . '/admin.sass.php' );

// .lessファイルをMCEエディターのスタイルシートとして使用することも可
add_editor_style( 'editor-style.sass' );

?>

もう一つの選択肢であるSassifyは少し古く、アプローチが少々異なります。Sassのコンパイル、出力パス、圧縮設定の管理のために、WordPress APIにフックすることになります。

プラグインベースのソリューションはシンプルですが、ある程度の制限があります。

  • パフォーマンスのオーバーヘッド:このようなプラグインはサーバー上でSassをコンパイルするため、リソースを大幅に消費するデメリットがあります。
  • 限られたビルドオプション:ほとんどのSassプラグインで基本的なコンパイルが可能ですが、重要な機能が欠けています。例えば、ソースマップのサポートが制限されていたり、オートプレフィックス機能がなかったりするのが典型的です。
  • セキュリティへの配慮:特にプラグインが定期的なメンテナンスを受けていない場合、本番サーバー上でコンパイラを実行すると、潜在的な脆弱性が増える可能性があります。
  • バージョン管理の問題:コンパイル後のCSSファイルはテーマディレクトリに置かれることが多く、Gitのワークフローが複雑になります。理想的には、コンパイルしたアセットはリポジトリに置かないようにすべきです。

このような制限がありつつも、特定の用途ではプラグインは便利な選択肢となります。例えば、最小限のスタイリングしか必要としない小規模なサイトや、Sassを深く扱う技術的な専門知識を持たないクライアントにプロジェクトを引き渡す場合、開発リソースの制約がある場合などです。

2. NPMスクリプト─バランスの取れた選択肢

より多くのコントロールと柔軟性を求めるのであれば、NPMスクリプトはプラグインに代わる確かな選択肢です。Sassのコンパイルは、シンプルさと機能のバランスが取れており、NPMにぴったりの作業です。完全なタスクランナーの複雑さを伴うことなく、テーマ開発においてプラグインを大幅に改善することができます。

  • コンパイルをWordPressの実行から切り離すことで、サーバーパフォーマンスのオーバーヘッドを排除
  • コンパイルプロセスの各ステップを細かく指定可能
  • package.jsonファイルにより、すべてのチームメンバーが同じビルドプロセスを使用できる
  • npmスクリプトがCI/CD パイプラインとシームレスに統合できる

このアプローチではプラグインよりも初期設定が必要になりますが、プロフェッショナルなテーマ開発をする上で、より信頼できるスケーラブルなソリューションです。

NPMによるSassコンパイルの設定

package.jsonファイルを作成することから始めます。以下を実行します。

npm init -y

次にDart Sassをインストールします。

npm install sass --save-dev

次に、以下のスクリプトをpackage.jsonに追加します。

{
  "name": "your-theme-name",
  "version": "1.0.0",
  "description": "A WordPress theme with Sass",
  "scripts": {
    "sass": "sass src/sass/main.scss:assets/css/main.css",
    "sass:watch": "sass --watch src/sass/main.scss:assets/css/main.css",
    "build": "sass src/sass/main.scss:assets/css/main.css --style=compressed"
  },
  "devDependencies": {
    "sass": "^1.58.3"
  }
}

このセットアップにより、3つの便利なスクリプトが手に入ります。

  • npm run sass:Sassファイルを一度コンパイル
  • sass:watch:変更を監視し、必要に応じて再コンパイル
  • build:Sassファイルを圧縮して本番用にコンパイル

古いブラウザをサポートするには、PostCSS経由でAutoprefixerを追加します。

npm install postcss postcss-cli autoprefixer --save-dev

package.jsonスクリプトを更新します。

{
  "scripts": {
    "sass": "sass src/sass/main.scss:assets/css/main.css",
    "prefix": "postcss assets/css/main.css --use autoprefixer -o assets/css/main.css",
    "build": "npm run sass && npm run prefix"
  },
  "devDependencies": {
    "autoprefixer": "^10.4.13",
    "postcss": "^8.4.21",
    "postcss-cli": "^10.1.0",
    "sass": "^1.58.3"
  },
  "browserslist": [
    "last 2 versions",
    "> 1%"
  ]
}

デバッグを助けるために、ソースマップを追加します。

{
  "scripts": {
    "sass": "sass src/sass/main.scss:assets/css/main.css --source-map",
    "sass:watch": "sass --watch src/sass/main.scss:assets/css/main.css --source-map"
  }
}

最後に、コンパイルしたCSSをWordPressで使用するにはfunctions.phpでコンパイルしたCSSをエンキューします。

function theme_enqueue_styles() {
    $style_path = '/assets/css/main.css';
    $full_path = get_template_directory() . $style_path;
    
    wp_enqueue_style(
        'theme-styles',
        get_template_directory_uri() . $style_path,
        array(),
        file_exists($full_path) ? filemtime($full_path) : false
    );
}
add_action('wp_enqueue_scripts', 'theme_enqueue_styles');

この関数は、コンパイルしたCSSを読み込み、ファイルの更新時刻をバージョン番号として使用することで、自動キャッシュバストを追加します。

3. Gulp─包括的なソリューション

Gulpは、複雑なビルドプロセスの自動化を得意とする強力なタスクランナーです。広範なスタイリングを必要とするWordPressテーマ開発にとって、Gulpは最も包括的なソリューションとなります。

Sassのコンパイル、ブラウザの同期、そしてその間のすべてを処理することができます。Gulpを使うメリットは以下の通りです。

  • コンパイル、最適化、デプロイなど、ビルドプロセスのほぼすべての側面を管理できる
  • 複数のタスクを同時に実行できるので、ビルド時間を短縮可能
  • 事実上あらゆるビルド要件に対応
  • BrowserSyncの統合により開発中の即時フィードバックが可能に

Gulpは他のアプローチよりも学習負荷が高いですが、その利点から多くの人に好まれています。

WordPressテーマ用のGulpのセットアップ

Gulpを使い始めるには、特定のタスクを処理する複数プラグインとあわせてインストールする必要があります。

# プロジェクトを初期化
npm init -y

# Gulpと関連パッケージをインストール
npm install --save-dev gulp gulp-sass sass gulp-autoprefixer gulp-sourcemaps browser-sync gulp-cssnano

また、テーマのルートディレクトリにgulpfile.js を作成する必要があります(複数のステップを処理するためのもの)。以下の部位で、必要なすべてのツールをインポートします。

// 1. 依存関係をインポート
const { src, dest, watch, series, parallel } = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const autoprefixer = require('gulp-autoprefixer');
const sourcemaps = require('gulp-sourcemaps');
const browserSync = require('browser-sync').create();
const cssnano = require('gulp-cssnano');

各パッケージには特定の目的があります。

  • gulp:コアタスクランナー
  • gulp-sasssass:SassをCSSにコンパイル
  • gulp-autoprefixer:ブラウザ互換性のためにベンダープレフィックスを追加
  • gulp-sourcemaps:デバッグ用ソースマップを生成
  • browser-sync:開発中にブラウザをリフレッシュ
  • gulp-cssnano:本番環境用にCSSを圧縮

ソースファイルとデスティネーションファイルへのパスを定義し、Sassをコンパイルする関数を作成します。

// 2. ファイルパスを定義
const files = {
  sassPath: './src/sass/**/*.scss',
  cssPath: './assets/css/'
}

// 3. Sass開発タスク(ソースマップ対応)
function scssTask() {
  return src(files.sassPath)
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(sourcemaps.write('./'))
    .pipe(dest(files.cssPath))
    .pipe(browserSync.stream());
}

この関数は、基本的にすべてのSassファイルを見つけ、デバッグ用にソースマップを初期化し、SassをCSSにコンパイルします(エラー処理も行う)。また、ブラウザ互換性のためにベンダープレフィックスを追加、ソースマップを記述し、コンパイルしたCSSを保存し、ブラウザの変更内容を保存します。全体的に多くの作業が行われます。

また、以下のように本番環境に対応したビルド機能、タスクウォッチャー、エクスポート機能の作成も検討する必要があります。

// 4. Sassの生成タスク(圧縮あり)
function scssBuildTask() {
  return src(files.sassPath)
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(cssnano())
    .pipe(dest(files.cssPath));
}

// 5. 開発タスクの監視
function watchTask() {
  browserSync.init({
    proxy: 'localhost:8888' // この部分をローカル開発URLに一致するように変更
  });
  
  watch(files.sassPath, scssTask);
  watch('./**/*.php').on('change', browserSync.reload);
}

// 6. タスクのエクスポート
exports.default = series(scssTask, watchTask);
exports.build = scssBuildTask;

この本番環境版では、ソースマップを省略しファイルサイズを最適化しています。全体として、このセットアップにより、開発用にnpx gulp(ファイルウォッチングとブラウザのリフレッシュあり)、そして本番ビルド用にnpx gulp buildを実行できるようになっています。

Gulpワークフローの強化

大規模なプロジェクトでは、目的別にスタイルを分けたいところです。以下がその実装例です。

// スタイルの種類ごとにパスを定義
const paths = {
  scss: {
    src: './src/sass/**/*.scss',
    dest: './assets/css/'
  },
  editorScss: {
    src: './src/sass/editor/**/*.scss',
    dest: './assets/css/'
  }
}

// 主要スタイルのタスク
function mainStyles() {
  return src('./src/sass/main.scss')
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(sourcemaps.write('./'))
    .pipe(dest(paths.scss.dest))
    .pipe(browserSync.stream());
}

// 編集スタイルのタスク
function editorStyles() {
  return src('./src/sass/editor-style.scss')
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(sourcemaps.write('./'))
    .pipe(dest(paths.scss.dest))
    .pipe(browserSync.stream());
}

多くのSassファイルを含む複雑なテーマでは、不要な再コンパイルを避けるために処理されたファイルをキャッシュしたり、影響を受けるファイルのみを再コンパイルするためにSassの依存関係を追跡したりするなどして、ビルドのパフォーマンスを最適化する必要もあります(今回の記事の対象外ですので割愛します)。

その他のビルドツール

ほとんどの開発者がNPMスクリプトやGulpを使用していますが、WordPressテーマ開発を助けるツールは他にもあります。ViteやWebpackが有力な候補となるはずです。

WebpackはJavaScriptとアセットのバンドルに優れており、テーマがコンポーネントベースのアーキテクチャやJavaScriptフレームワークを使用している場合に便利です。その強みは、コード分割と「ツリーシェイク」によって最適化されたバンドルを作成する能力にあり、複雑でJavaScriptを多用するテーマで重宝します。

対照的に、Viteは比較的新しいビルドツールであり、モジュールロードへの革新的なアプローチにより開発速度に重きを置いています。その開発サーバーは、ほぼ瞬時にホットモジュールの置き換えを可能にします。反復的な開発を実装する手段として優れています。WordPressのワークフローとの統合は進化を続けており、個別のテーマ開発に活用できるのであれば注目の選択肢です。

よりシンプルなプロジェクトであれば、Sass CLIという選択肢も考えられます。追加のツールを必要としないシンプルなアプローチです。

# Sassをグローバルにインストール
npm install -g sass

# Sassファイルをコンパイル
sass --watch src/sass/main.scss:assets/css/main.css

手動コンパイルには、専用のビルドツールのような自動化や統合機能はありませんが、そのシンプルさは注目に値します。簡潔なテーマでスタイリングが必要な場合や、素早くプロトタイプを作成する場合など、小規模なプロジェクトに適しています。またツールを最小限に抑えたい人にもおすすめです。

Sassを使ったWordPress開発プロジェクトの構成とまとめ方

Sassファイルを効果的に整理することは、保守性とコラボレーションに不可欠です。構造をよく計画することで、コードの全体的な理解やメンテナンスが容易になり、テーマの成長に合わせて拡張することができます。

7-1パターン─複雑なテーマのモジュール構造

7-1 パターンは、大規模なプロジェクトでSassファイルを整理するのに便利です。スタイリングコードを7つのテーマフォルダと、すべてをインポートする1つのメインファイル (main.scss) に分割します。

このパターンによって論理的な分離が行われ、特定のスタイルを見つけたり、変更を加えたりするのが簡単になります。以下に構造の概要を示します。

  • アブストラクト:CSSを直接出力しないヘルパー、色、タイポグラフィ、スペーシングのための変数、計算やロジックのための関数、再利用可能なスタイルパターンのためのミックスイン、拡張可能なスタイルのためのプレースホルダーがこれに含まれます。
  • ベース:基本スタイルとデフォルト、タイポグラフィルール、ユーティリティクラス、要素セレクタ(クラスなし)など。CSSをリセットまたは正規化することもできます。
  • コンポーネント:ボタン、フォーム、カードなどの再利用可能なUIコンポーネント、ナビゲーションメニュー、ウィジェット、サイドバー、メディアフォーマット(画像、ビデオなど)が含まれます。
  • レイアウト:ヘッダーやフッター、グリッドシステム、コンテナ構造、サイドバーの配置など、構造的な要素を定義します。
  • ページ:ページ固有のスタイル、トップページの特殊化、単一記事のレイアウト、アーカイブページのバリエーション、特別なランディングページなどが含まれます。
  • テーマ:このセクションで複数のビジュアルテーマまたはモードを保持します。ライトテーマ、ダークテーマ、季節ごとのバリエーション、管理エリアのカスタマイズ、ブランド固有のテーマなどがこれに該当します。
  • ベンダー:最後のセクションで、サードパーティのスタイル、プラグインのオーバーライド、フレームワークのカスタマイズ、外部コンポーネントのスタイルを保存します。

メインファイル(通常はmain.scss)がすべてのパーシャルを特定の順序でインポートします。

// アブストラクト
@import 'abstracts/variables';
@import 'abstracts/mixins';
// ベンダー(早期に設定し上書きを許可)
@import 'vendors/normalize';
// 基本スタイル
@import 'base/reset';
@import 'base/typography';
// レイアウト
@import 'layouts/header';
@import 'layouts/grid';
// コンポーネント
@import 'components/buttons';
@import 'components/forms';
// ページ固有のスタイル
@import 'pages/home';
@import 'pages/blog';
// テーマ
@import 'themes/admin';

このモジュラーアプローチにより、大規模なプロジェクトでしばしば発生するCSSの煩雑化を防ぐことができます。テーマの複雑さに合わせて拡張できる、メンテナンスしやすいシステムです。

ブロック/サイトエディターに適した構成

テーマがブロックエディターに重点を置いている場合、そのコンポーネントを優先させるのが理にかなっています。これにより、Sassの構成をWordPressのブロックベースのコンテンツモデルに合わせることができます。

7-1パターンと比較すると、よりわかりやすい構造になっています。

  • コア:変数、ミックスイン、ヘルパー、基本要素のスタイリング、WordPressのコアとなるブロックなど、基本となるスタイルや設定がここに位置します。
  • ブロック: カスタムブロックのバリエーション、拡張コアブロックスタイル、ブロックパターンのスタイルがここに格納されます。
  • テンプレート:投稿テンプレート、アーカイブテンプレート、カスタムページテンプレートがここに追加されます。
  • ユーティリティ:スペーシングユーティリティ、タイポグラフィクラス、色や背景のユーティリティなどのヘルパークラスやツールを扱います。

この構造は、ブロックを使った開発のモジュール性をサポートするもので、バリエーションやテンプレートの一貫性を保つのが容易になります。

Sass構成に関するWordPress特有の注意点

WordPressのテーマでSassを整理する場合、プラットフォーム特有の注意点がいくつかあります。WordPressのテンプレート階層は、異なるコンテンツタイプに対してどのPHPファイルを使用するかを決定します。

この階層をSassの構成に反映させることで、PHPテンプレートと関連するスタイルの間に直感的なつながりを持たせることができます。そのため、WordPressのテンプレート構造に合わせてページ固有のスタイルを整理するのが得策です。

// _archive.scss
.archive {
    // 基本のアーカイブのスタイル
  
  &.category {
    // カテゴリーアーカイブのスタイル
  }
    
  &.tag {
    // タグアーカイブのスタイル
  }
    
  &.author {
    // 作者アーカイブのスタイル
  }
}

この方法によって、どのスタイルが特定のテンプレートコンテキストに適用されるかが一目瞭然となり、メンテナンスと更新が簡単になります。

プラグイン互換性の整理

プラグインにより独自のスタイルが適用されることがあります。テーマでそれを上書きすることが必要になるかもしれません。オーバーライドを基本ファイル全体に分散させる代わりに分離するのが効果的です。

例えば、WooCommerce統合の構造は以下のようになります。

vendors/woocommerce/
├── _general.scss          // 基本的なWooCommerceのスタイル
├── _buttons.scss          // WooCommerceのボタンのスタイル
├── _forms.scss            // WooCommerceのフォームのスタイル
├── _shop.scss             // ショップページのスタイル
└── _single-product.scss   // 個別の商品ページのスタイル

この構成により、プラグインのアップデートに際しプラグイン互換スタイルを簡単に更新でき、テーマとプラグインのスタイルの分離を維持しながら、特定のプラグイン関連のスタイルを素早く見つけることができます。

また、スタイルの衝突を避けるために、オーバーライドでは常に名前空間を使用してください。

// _woocommerce.scss
.woocommerce {
  .products {
    // カスタム商品グリッドスタイル
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
    gap: 2rem;
  }
    
  .single-product {
    // 個別商品ページのデザイン
    .price {
      font-size: 1.5rem;
      color: $price-color;
    }
  }
}

このアプローチでは、プラグインのスタイルがテーマのコアデザインに漏れるのを防ぐと同時に、必要な場所に明確なオーバーライドを適用することができます。

エディターと管理画面のスタイル

フロントエンドとブロックエディターインターフェースの両方のスタイリングが必要になることがよくあります。管理者専用のスタイルを以下のように作成することができます。

admin/
├── _editor.scss         // ブロックエディターのスタイル
├── _login.scss          // ログイン画面のカスタマイズ
└── _dashboard.scss      // 管理画面のカスタマイズ

ブロックエディターに対応するには、別のスタイルシートをコンパイルし次のようにエンキューします。

function theme_editor_styles() {
  add_theme_support('editor-styles');
  add_editor_style('assets/css/editor.css');
}
add_action('after_setup_theme', 'theme_editor_styles');

こうすることで、エディターのコンテキストをすっきりさせ、一貫性を保ち、フロントエンドと視覚的に一致させることができます。

レスポンシブデザインの実装

WordPressテーマは様々なデバイスサイズで動作する必要があるため、レスポンシブデザインには体系的なアプローチが必要です。Sass mixinを使用することで、一貫性のある保守可能なシステムを構築することができます。

// ブレークポイントのミックスイン
@mixin respond-to($breakpoint) {
  @if $breakpoint == "sm" {
    @media (min-width: 576px) { @content; }
  }
  @else if $breakpoint == "md" {
    @media (min-width: 768px) { @content; }
  }
  @else if $breakpoint == "lg" {
    @media (min-width: 992px) { @content; }
  }
}

レスポンシブスタイルを基本定義に近いコンテキストに保つと、ブレークポイントを超えてコンポーネントがどのように適応するかを明確に示す、保守性の高いコードベースを作成できます。

ローカル開発環境のセットアップ

ローカル開発は WordPress のワークフローの中核をなす要素であり、Sass のようなツールを使用する場合は一層重要になります。適切なセットアップにより、迅速な反復、リアルタイムのフィードバック、SassビルドプロセスとWordPressサイト間のシームレスな接続が可能になります。

DevKinstaを使うことで、個別のプロジェクトの要件に合わせてローカル開発環境を手間なくセットアップすることができます。インストールと利用開始も簡単です。

青を基調としたスタイリッシュなデジタルイラスト。コンピュータを使用する手を描いた作品。一方の手はキーボードでタイピングしており、もう一方の手はコンピュータのモニターの方を指さしている。モニターには青色の背景に白い文字の「K」が表示されている。イラストは現代的グラフィックデザインを採用し、背景には抽象的な形状が配置されている。
DevKinstaの公式イメージ

テーマディレクトリ内でSassコンパイルをセットアップするためにGulpを使用するのがお手軽です。まず、テーマディレクトリに移動し、先ほど説明したようにNPMを初期化して依存関係をインストールします。

次にgulpfile.jsを作成し、BrowserSyncを用いてDevKinstaサイト用に設定を指定します。

const { src, dest, watch, series } = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const autoprefixer = require('gulp-autoprefixer');
const sourcemaps = require('gulp-sourcemaps');
const browserSync = require('browser-sync').create();

// ダッシュボードからDevKinstaサイトのURLを取得
const siteURL = 'your-site-name.local';

function scssTask() {
  return src('./src/sass/**/*.scss')
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(sourcemaps.write('./'))
    .pipe(dest('./assets/css/'))
    .pipe(browserSync.stream());
}

function watchTask() {
  browserSync.init({
    proxy: siteURL,
    notify: false
  });
  
  watch('./src/sass/**/*.scss', scssTask);
  watch('./**/*.php').on('change', browserSync.reload);
}

exports.default = series(scssTask, watchTask);

次に、ファイル構造を設定します。

mkdir -p src/sass/{abstracts,base,components,layouts,pages,themes,vendors}
touch src/sass/main.scss

これでnpx gulp を実行する準備ができました。SassまたはPHPファイルの内容が変更されるたびに、スタイルのコンパイル、ブラウザへの挿入、必要に応じた更新が行われます。

開発から本番への移行

ローカル環境でテーマを開発したら、ステージング環境や本番環境にデプロイするための戦略が必要です。

MyKinstaインターフェース上部には、[別の環境に反映する]、[WP管理画面を開く]、[サイトに移動する]ボタンが表示されている。その下にはベージュのセクションがあり、[次に反映する→]のテキストと、[Live]とラベル付けされた緑色のボタンがある。
コントロールパネル「MyKinsta」での同期操作(ステージング環境から本番環境への同期)
DevKinstaからKinstaへは、組み込みのステージング環境で直接同期することができます。ものの数回クリックするだけで、ローカル環境からステージング環境にテーマを移行可能です。

これにより、コンパイルしたCSSとSassソースファイルの両方がステージング環境に安全に移行します。より複雑なデプロイメントであれば、Gulpを使用してステージングデプロイメントを自動化できます。以下がその例です。

const { src, parallel, series } = require('gulp');
const rsync = require('gulp-rsync');

// 以前に定義したクリーンとビルドタスクの実行

// デプロイメントタスク
function deployToStaging() {
  return src('dist/**')
    .pipe(rsync({
      root: 'dist/',
      hostname: 'your-kinsta-sftp-host',
      destination: 'public/wp-content/themes/your-theme/',
      archive: true,
      silent: false,
      compress: true
    }));
}

// デプロイメントタスクのエクスポート
exports.deploy = series(
  parallel(cleanStyles, cleanScripts),
  parallel(styles, scripts),
  deployToStaging
);

ステージング環境にデプロイした後も、SassでコンパイルしたCSSが正しく動作することを確認するために、徹底的なテストを行う必要があります。例えば以下の通りです。

  1. ビジュアルテスト:すべてのスタイルがページ間で期待通りに適用されることを確認
  2. レスポンシブテスト:すべてのブレークポイントが正しく機能することを確認
  3. パフォーマンステストGoogle PageSpeed Insights、Lighthouse、その他のツールでCSSの読み込みをテスト
  4. クロスブラウザ検証:互換性の問題を発見するために、異なるブラウザでのテストを忘れずに

テスト中は、パス、キャッシュ設定、ファイルパーミッションに特に注意してください。次に、テーマを本番環境にデプロイします。Kinstaの選択的プッシュにより、デプロイ対象をコントロールできます。

MyKinsta内のステージング環境からデプロイすると表示される「Liveへの反映」ダイアログボックス。モーダルウィンドウには、ステージングからライブ環境にプッシュする設定オプションが表示され、ファイル、データベース、検索と置換の実行のチェックボックスがある。ドロップダウンメニューでは「すべてのファイルとフォルダ」が選択されており、MyKinsta がライブ環境の自動バックアップを作成するという注記がある。
Kinstaの選択的プッシュ機能

デプロイ前にもCSSが適切に最適化されていることを確認する必要があります。これを行うには、圧縮、ファイル整理、キャッシュの破棄などいくつかの方法があります。

効果的なブロックエディター統合の作成

最新のWordPress開発はブロックエディターを中心に行われており、優れたスタイリングは編集とフロントエンドの一貫性を保証します。

たとえば、純粋にページテンプレートごとにスタイルを整理するのではなく、ブロック中心の整理をするのがおすすめです。ブロックの種類ごとに専用のSassの各部位を作成することから始めましょう。

blocks/
├── _paragraph.scss      // 段落ブロックのスタイル
├── _heading.scss        // 見出しブロックのスタイル
├── _image.scss          // 画像ブロックのスタイル
├── _gallery.scss        // ギャラリーブロックのスタイル
└── _custom-block.scss   // カスタムブロックのスタイル

こうすることで、WordPressのコアが変化しテーマのブロックライブラリが大きくなっても、スタイルを維持しやすくなります。各ブロックのスタイルが独立し整理され、変更が簡単に行えます。

各ブロックファイル内で、WordPressのブロッククラスに沿った明確な命名規則を確立します。

// _paragraph.scss
.wp-block-paragraph {
  // 基本的なパラグラフブロックのスタイル
  font-family: $body-font;
  line-height: 1.6;
  
  // ブロックのバリエーション
  &.is-style-lead {
    font-size: 1.2em;
    font-weight: 300;
  }
  
  &.has-background {
    padding: 1.5rem;
  }
}

これにより、ブロックエディターのコントロールと、その結果生成されるスタイルとの間に直接的な関係が生まれ、 テーマの予測可能性と保守性が高まります。

編集内容をフロントエンドと同期させるために、スタイルシートを別々にコンパイルし変数を共有します。

// gulpfile.js内
function themeStyles() {
  return src('./src/sass/main.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(dest('./assets/css/'));
}

function editorStyles() {
  return src('./src/sass/editor.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(dest('./assets/css/'));
}

これらのエディタースタイルをブロックエディターコンテキスト専用にエンキューします。

function theme_editor_styles() {
  add_theme_support('editor-styles');
  add_editor_style('assets/css/editor.css');
}
add_action('after_setup_theme', 'theme_editor_styles');

視覚的な一貫性を保つために、両方のスタイルシートで共有変数とミックスインを使用することができます。

// abstracts/_variables.scss
$primary-color: #0073aa;
$secondary-color: #23282d;
$heading-font: 'Helvetica Neue', Helvetica, Arial, sans-serif;
$body-font: 'Georgia', serif;
// main.scssとeditor.scssの両方でインポート

このアプローチにより、編集時と閲覧時の色、タイポグラフィ、スペーシングの一貫性が保たれます。

theme.jsonとの統合

theme.jsonファイルで、ブロックテーマがエディターとフロントエンドの両方に影響するグローバル設定を定義します。Sass変数をtheme.json設定に合わせることで、まとまりのあるシステムを作ることができます。例えば以下の通りです。

{
  "version": 2,
  "settings": {
    "color": {
      "palette": [
        {
          "name": "Primary",
          "slug": "primary",
          "color": "#0073aa"
        }
      ]
    }
  }
}

Sassファイルでこのように調整することができます。

// theme.jsonの値と一致させる
$color-primary: #0073aa;

// 一致するカスタムプロパティを生成
:root {
  --wp--preset--color--primary: #{$color-primary};
}

この簡単な同期により、カスタムスタイルがブロックエディターの組み込みコントロールやグローバルスタイルシステムと調和して動作するようになります。

Sassによるパフォーマンスの最適化

パフォーマンス最適化は、WordPressテーマにとって重要な検討事項です。基本的なコンパイルだけでなく、Sassワークフローに読み込み速度とユーザーエクスペリエンス(UX)を改善するテクニックを取り入れることができます。

クリティカルCSS実装による読み込み高速化

クリティカルCSSは、コンテンツの「アバブ・ザ・フォールド」をレンダリングするためにサイトが必要とする最小限のCSSを抽出し、インライン化する最適化テクニックです。クリティカルCSS最適化で、レンダリングをブロックするCSSを減らし、体感読み込み速度を改善することができます。

クリティカルCSSを記述すること自体が一種のスキルであり、Sassを追加することで難易度が上がります。まず、クリティカルなスタイル専用のSassファイルを作成し、このファイルを個別にコンパイルするようにビルドプロセスを設定します。

// critical.scss - 画面の上部(above-the-fold)に表示されるコンテンツのスタイルのみを含める
@import 'abstracts/variables';
@import 'abstracts/mixins';

// 必須のスタイルのみ
@import 'base/reset';
@import 'layouts/header';
@import 'components/navigation';

function criticalStyles() {
  return src('./src/sass/critical.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(cssnano())
    .pipe(dest('./assets/css/'));
}

このクリティカルCSSをテーマに実装するには、headタグ内にインラインで記述し、CSSの読み込みを非同期化します。

function add_critical_css() {
  $critical_css = file_get_contents(get_template_directory() . 
    '/assets/css/critical.css');
  echo '' . $critical_css . '';
  
  // 非同期でCSSを完全に読み込む
  echo '';
}
add_action('wp_head', 'add_critical_css', 1);

このテクニックを使えば、バックグラウンドで残りのスタイルを読み込んでいる間に、コンテンツを迅速に表示できます。しかし、すべてのページにテーマのすべてのスタイルが必要なわけではありません。テンプレートまたはコンテンツタイプに基づく条件付き読み込みでパフォーマンスをさらに引き上げることができます。

実際には、テーマのfunctions.php内でテンプレート固有のCSSを読み込むことが可能です。

function load_template_specific_css() {
  // すべてのページの基本スタイル
  wp_enqueue_style('main-styles', 
    get_template_directory_uri() . '/assets/css/main.css');
    
  // 商品ページ固有のスタイル
  if (is_singular('product')) {
    wp_enqueue_style('product-styles', 
      get_template_directory_uri() . '/assets/css/product.css');
  } 
  // アーカイブページ固有のスタイル
  elseif (is_archive()) {
    wp_enqueue_style('archive-styles', 
      get_template_directory_uri() . '/assets/css/archive.css');
  }
}
add_action('wp_enqueue_scripts', 'load_template_specific_css');

この方法は、各ページのCSSペイロードを減らし、読み込み時間を改善し、高いデザイン品質を維持します。

スマートなキャッシュ制御の実装

キャッシュを管理することで、最新のスタイルを取得しながら、同時に変更されていないアセットのキャッシュを活用することができます。Sassでの自動キャッシュ破棄は、テーマのスタイルエンキューイング内で行われます。

function enqueue_styles_with_cache_busting() {
  $css_file = get_template_directory() . '/assets/css/main.css';
  $version = filemtime($css_file);
  
  wp_enqueue_style('main-styles', 
    get_template_directory_uri() . '/assets/css/main.css', 
    array(), $version);
}
add_action('wp_enqueue_scripts', 'enqueue_styles_with_cache_busting');

この技術ではファイルの更新時刻をバージョン番号として使用、ブラウザがCSSを変更するまでキャッシュし、変更後のバージョンを自動的にダウンロードします。

ソースマップの安全な管理

ソースマップは開発時には非常に貴重なものですが、運用時にはSassのソースコードが公開される可能性があります。そこで、環境固有のソースマップ処理を実装するのが得策です。

// gulpfile.js内
const isProduction = process.env.NODE_ENV === 'production';

function styles() {
  return src('./src/sass/main.scss')
    .pipe(gulpif(!isProduction, sourcemaps.init()))
    .pipe(sass().on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(gulpif(!isProduction, sourcemaps.write('./')))
    .pipe(dest('./assets/css/'));
}

本番環境でのデバッグを管理するために、管理者だけにソースマップを提供することができます。

function conditional_source_maps() {
  // 管理者専用(デバッグパラメータを設定)
  if (current_user_can('manage_options') && isset($_GET['debug_css'])) {
    wp_enqueue_style('debug-maps', 
      get_template_directory_uri() . '/assets/css/main.css.map');
  }
}
add_action('wp_enqueue_scripts', 'conditional_source_maps', 999);

これによりデバッグのためのソースマップの利点が維持され、不必要な露出からソースコードを保護できます。

効率的なチームワークフローの構築

Sassを使用してWordPressテーマを制作するチームにとって、一貫したワークフローと標準は不可欠です。Sass特有のワークフローについては、明確な標準を確立する必要があります。

例えば、変数、ミックスイン、クラスの一貫した命名規則とパターン定義です。

// 変数名:ケバブケースを使用し説明的な接頭辞を付ける
$color-primary: #0073aa;
$font-heading: 'Helvetica Neue', sans-serif;
$spacing-base: 1rem;

// ミックスイン:動詞に基づいた命名
@mixin create-gradient($start, $end) {
  background: linear-gradient(to bottom, $start, $end);
}

// クラス:BEM命名規則
.card {
  &__header { /* header styles */ }
  &__body { /* body styles */ }
  &--featured { /* featured variant */ }
}

また、新しいファイルがプロジェクトに加わる方法も標準化するのがおすすめです。例えば以下のような決まりを作ることができます。

  • 新しいコンポーネントはcomponentsディレクトリに置く
  • 各コンポーネントに固有のファイルを割り当てる
  • すべてのファイルで同じインポート順序を使う
  • パーシャルは常にアンダースコアで始める

さらに、コードコメントとドキュメンテーションの要件も定義します。.stylelintrc設定ファイルに「成文化」して、実施を自動化することができます。

{
  "extends": "stylelint-config-standard-scss",
  "rules": {
    "indentation": 2,
    "selector-class-pattern": "^[a-z][a-z0-9-]*$",
    "max-nesting-depth": 3,
    "selector-max-compound-selectors": 4
  }
}

コードレビューはSassにとって重要な意味を持ちます。小さな変更がテーマの外観に大きな影響を与える可能性があります。いくつかの観点からスタイリングに対処するのが効果的です。

  • スタイルガイドへの準拠:新しいスタイルがプロジェクトの既存のデザインシステムに準拠していることを確認
  • パフォーマンスの考慮:すべてのCSS出力をレビューし、最適化の機会を探る
  • クロスブラウザ互換性:作成したスタイルが必要なすべてのブラウザで動作することを確認

もちろん、コードベース全体で高い水準を維持するために、チームのコードレビューチェックリストにこれらのSass特有の注意点を含める必要があります。

Sassプロジェクトのバージョン管理戦略

バージョン管理には、Sass特有の注意事項がいくつかあります。コンパイルしたCSSをコミットするかどうかを決定する必要があります。この選択には2つの考え方があります。

  • CSSをコミットしない場合、リポジトリはクリーンな状態に保たれるがデプロイ時にビルドが必要
  • CSSをコミットすると、リポジトリのサイズは大きくなるものの、デプロイするファイルがテストしたものと完全に一致する

コンパイル済みファイルをコミットしないことを選択した場合には、.gitignoreファイル内で適切に除外されるように設定しましょう。

# .gitignore
.sass-cache/
*.css.map
*.scss.map
node_modules/
/assets/css/

最後に、スタイル作業用のブランチ構造に目を通し、新しいコンポーネント(機能ブランチなど)、ビジュアルのバリエーション(テーマブランチなど)、主要なデザインの調整(スタイル固有のブランチなど)といったスタイルの変更点をどのように管理するかを検討してみてください。

まとめ

適切なSassワークフローは、WordPressテーマ開発を困難なものから、構造化された保守可能なプロセスに変えることができます。

効率的にSassワークフローを確立するには、シンプルかつ優れたビルドプロセス、熟考を伴うファイル構成、パフォーマンスの最適化、強固なチームワークなどが欠かせません。ブロックエディターが進化を続けても、柔軟で堅牢なSassの実装により、高い質を維持しながら適応することができます。

SSHアクセスWP-CLI、そしてワンクリックのステージング環境まで、効率的なワークフローをサポートするWordPress専用マネージドクラウドサーバーをお探しであればKinstaがおすすめです。最新のツールを数多く取り入れ、開発者に優しいプラットフォームを提供しています。

Jeremy Holcombe Kinsta

Kinstaのコンテンツ&マーケティングエディター、WordPress開発者、コンテンツライター。WordPress以外の趣味は、ビーチでのんびりすること、ゴルフ、映画。高身長が特徴。