2026年メンテナンス注記:ページ末尾の日付付きアーカイブに、行末空白だけを正規化して2019年の完全な本文を保存しています。旧文には「Code Sinppets」とありますが、URL、提供元、バージョン、コード、復旧方法がありません。この記録だけで現在のプラグインを特定したり推奨したりはできません。メンテナンス版では、すべてのスニペットを実行可能なアプリケーションコードとして扱います。先にバックアップまたはステージング環境を用意し、ロールバック経路を確保し、レビューしていないPHPを本番へ貼り付けないでください。
Table of Contents
2019年の記録が示したこと、示さなかったこと
旧文は、サイト固有の変更をテーマのソースへ混ぜる必要はないという有用な設計方針に気づいていました。しかし具体的な助言は不完全で、現在の安全な操作手順にはなりません。
| アーカイブの考え | 2026年の分類 | メンテナンス版での扱い |
|---|---|---|
functions.phpまたは別のソースファイルを編集する | 文脈依存で、多くの場合テーマ結合 | そのテーマに依存する表示上の挙動だけを子テーマに置く。親テーマやWordPress Coreを直接編集しない |
| 小さな変更を「プラグイン化」する | 通常は妥当な方向 | テーマ変更後も残す挙動には、バージョン管理された小さなサイト専用プラグインを優先する |
| プラグインをインストールしてコードを貼る | 文脈依存 | スニペット管理ツールは保存と有効化の方法を変えるが、未知のコードを互換、安全、可逆にはしない |
| 「Code Sinppets」 | 未検証の歴史的表記 | 証拠として綴りを保存し、現在の製品、バージョン、インストールURLを推測しない |
1. 入れ物を選ぶ前に変更を分類する
手軽さより先に、コードの所有境界を決めます。
| 変更 | 推奨する置き場所 | 理由 |
|---|---|---|
| 特定テーマに結び付くテンプレート、テーマ資産、表示上の挙動 | 子テーマ | 更新される親テーマから変更を分離しつつ、テーマ依存を明示できる |
| テーマを切り替えても必要なサイトの挙動 | 小さなサイト専用プラグイン | 明確な識別、アクティベーション境界、バージョン管理されたファイルを持てる |
| 短期の診断実験 | ローカルまたはステージングだけに置き、その後削除 | デバッグ補助を残すと、情報漏えい、負荷、挙動変更を招く可能性がある |
| 設定画面、データ書き込み、REST/AJAXエンドポイント、定期処理、外部連携 | 設計とテストを備えた正式なプラグイン | 認可、リクエスト検証、ライフサイクル、データ移行、ロールバック判断が必要 |
| WordPress Coreまたは親テーマのファイル | カスタマイズ先にしない | 更新で変更が消え、出所追跡と復旧も難しくなる |
小さく隔離された実験で、スニペット管理ツールの正確なバージョン、適用範囲の規則、エクスポート形式、緊急無効化手順を確認済みなら、利用を検討できます。本ガイドは、すべての管理ツールが同じ方法でコードを保存、実行、復旧するとは仮定しません。
2. 推奨する基準:小さなサイト専用プラグイン
サイトの挙動には、開発用チェックアウト内に1つのディレクトリとPHPファイルを作ります。
wp-content/plugins/lazyingart-site-tweaks/
└── lazyingart-site-tweaks.php
Plugin Nameヘッダーにより、WordPressはファイルをプラグインとして検出できます。次の例は短コードを1つ登録するだけで、データベース書き込み、管理権限、外部リクエスト、グローバル状態を意図的に避けています。
<?php
/**
* Plugin Name: LazyingArt Site Tweaks
* Description: Small, reviewed site-specific customizations.
* Version: 1.0.0
*/
defined( 'ABSPATH' ) || exit;
function lazyingart_1887_notice_shortcode( $attributes, $content = null ) {
$attributes = shortcode_atts(
array(
'type' => 'info',
),
(array) $attributes,
'lazyingart_notice'
);
$allowed_types = array( 'info', 'warning', 'success' );
$type = sanitize_key( $attributes['type'] );
if ( ! in_array( $type, $allowed_types, true ) ) {
$type = 'info';
}
$message = wp_kses_post( (string) $content );
return sprintf(
'<aside class="site-notice site-notice--%1$s">%2$s</aside>',
esc_attr( $type ),
$message
);
}
function lazyingart_1887_register_shortcodes() {
add_shortcode( 'lazyingart_notice', 'lazyingart_1887_notice_shortcode' );
}
add_action( 'init', 'lazyingart_1887_register_shortcodes' );
コンテンツでは次のように使います。
[lazyingart_notice type="warning"]Planned <strong>maintenance</strong> tonight.[/lazyingart_notice]
Shortcode APIの要件に従い、コールバックはマークアップを表示せず返します。属性を正規化して小さな許可リストで検証し、囲まれた内容には投稿で許可される安全なHTMLだけを残し、出力時にCSSクラス値をエスケープします。一意な接頭辞は名前衝突を減らします。
この例には実際のライフサイクル上のコストがあります。短コードを使う投稿はプラグインに依存し、無効化すると短コード文字列が本文に残ります。公開前にその劣化が許容できるか判断してください。長期機能なら、カスタムブロックなど、別の設計されたコンテンツモデルが適する場合があります。
3. テーマ依存の挙動だけに子テーマを使う
子テーマはテンプレートや表示上の変更を親テーマから分離するため、親テーマの更新で上書きされません。子テーマのfunctions.phpは親のファイルに加えて読み込まれ、置き換えるものではありません。親テーマの関数を丸ごとコピーすると、重複宣言と致命的エラーを起こす可能性があります。
変更が有効テーマのテンプレート、フック、CSS、デザイン契約に依存するときは子テーマを使います。テーマ変更後も必要な挙動にはプラグインを使います。どちらの場合もWordPress Coreを編集せず、文書化されたactionとfilterに処理を接続します。
ブロックテーマとクラシックテーマは同じテンプレート・スタイル境界を公開しません。クラシックPHPテンプレート、特定のHTMLセレクター、テーマ専用フックを前提とするスニペットはテーマ結合であり、親テーマが変わるたびに再テストが必要です。
4. チュートリアルのスニペットをコピーする前に監査する
関係しそうな1行だけでなく、コールバック全体と実行文脈を確認します。
- 出所:ソースURL、取得日、作者、判明しているライセンス、対象WordPress/PHPバージョン、ローカルのレビュアーを記録する。
- フック契約:公式リファレンスでaction/filter、引数、戻り値、タイミング、フロントエンド、管理画面、REST、AJAX、cron、CLIのどこで動くかを確認する。
- 入力境界:短コード属性、リクエスト値、オプション、投稿フィールド、外部レスポンス、ファイル値を列挙する。無効値はできるだけ拒否し、受理する入力は意図する型に合わせてサニタイズする。
- 出力境界:可能な限り遅く、正確な文脈向けにエスケープする。HTMLテキスト、属性、URL、JavaScript、許可HTMLは交換できない。
- 権限:状態変更前に適切なcapabilityを確認する。nonceはリクエスト偽造に対する意図確認に役立つが、WordPressが明記するように認証や認可ではない。
- 名前と依存:一意な接頭辞または名前空間を使い、必要なプラグイン、テーマ、PHP拡張、オプション、フック優先度を記録する。
- 副作用:書き込み、外部リクエスト、メール、定期イベント、キャッシュ無効化、プライバシー影響、最悪実行時間を特定する。
よくあるチュートリアルのパターンは次のように扱います。
| パターン | ラベル | 判断 |
|---|---|---|
| 現在のCode Referenceでdeprecatedとされた、または存在しない関数・フックを使う | 旧式 | 公式の代替と移行時の挙動を理解するまで有効化しない |
| 親テーマのDOM、テンプレート名、独自フックに依存する | テーマ結合 | 子テーマに置き、親テーマのバージョンを記録し、更新後に再テストする |
$_GET、$_POST、オプション、外部レスポンスをHTMLへ直接出力する | 安全でない | 拒否し、検証/サニタイズと文脈別エスケープを使って再設計する |
| capabilityと意図を確認せずオプション、ユーザー、ファイル、DB行を変更する | 安全でない | 拒否し、認可、必要なnonce、検証、監査したWordPress APIを追加する |
| リクエストやクエリ文脈を確認せず広範なコールバックを実行する | 文脈依存 | 明示的なガードを追加し、必要に応じてフロント、管理、REST、AJAX、cron、CLI経路をテストする |
| 更新、RESTアクセス、XML-RPC、認証挙動、セキュリティヘッダーを全体で無効にする | 文脈依存かつセキュリティ重要 | 文書化した脅威モデル、互換性レビュー、監視、ロールバック計画を必須にする |
「自分のページが直った」ことは、別のリクエスト、権限、テーマ、プラグイン、将来の更新でも安全だという証拠にはなりません。
5. 再現可能な方法でステージング、構文確認、テスト、配備する
WordPressのデバッグ手引きは、変更前にステージング環境または適切なバックアップを用意するよう求めています。有用なバックアップはファイルとデータベースの両方を含み、保管場所と保持方針が明確で、単に作っただけでなくテスト環境で復元済みです。
サイトプラグインのディレクトリをバージョン管理します。想定するWordPress/PHPバージョン、有効テーマ、関係プラグインのバージョン、正確なテストケースを記録します。有効化前に実行します。
php -l wp-content/plugins/lazyingart-site-tweaks/lazyingart-site-tweaks.php
wp plugin activate lazyingart-site-tweaks
WP_DEBUGとログはローカル開発またはステージングだけで有効にし、ページ上のエラー表示は隠します。各テスト後にログを確認し、公開しないでください。パス、クエリなど運用情報が含まれる場合があります。
破棄可能なステージングコピーでは、WP-CLIで例の出力を再現確認できます。
wp eval 'echo do_shortcode( "[lazyingart_notice type="warning"]Planned <strong>maintenance</strong> tonight.[/lazyingart_notice]" );'
期待する出力:
<aside class="site-notice site-notice--warning">Planned <strong>maintenance</strong> tonight.</aside>
無効なtype、空の内容、許可・拒否されるマークアップ、ログアウト・特権セッション、関係テンプレート、代表的なキャッシュ構成もテストします。コマンドラインの結果は、ブラウザー、アクセシビリティ、統合、認可のテストを代替しません。
6. ロールバックを有効化手順に含める
移行を伴わないファイルだけのサイトプラグインでは、最初のロールバックは無効化です。
wp plugin deactivate lazyingart-site-tweaks
プラグイン自体が通常のWP-CLI起動を妨げる場合、グローバルskipオプションでそのプラグインを読み込まずに無効化できます。
wp --skip-plugins=lazyingart-site-tweaks plugin deactivate lazyingart-site-tweaks
次に、最後の既知正常なファイル版を配備して構文確認とステージングテストを再実行し、原因を理解してから再び有効にします。診断に必要な版とエラー証拠を保存する前に、不具合コードを削除しないでください。
無効化はデータのロールバックではありません。スニペットがオプション、メタデータ、ユーザー、投稿、テーブル、ファイル、キュー、外部状態を書き換えるなら、配備前に順方向・逆方向の移行、バックアップ復元条件、担当者、許容停止時間を定義します。
7. 再現可能なテストマトリクスを使う
| ケース | 期待する証拠 |
|---|---|
| プラグイン無効 | サイトが読み込める。短コード文字列の表示など既知の依存挙動が記録されている |
| プラグイン有効化 | PHPのfatal、warning、notice、予期しないDB書き込みがない |
| 有効な短コード | 正確な許可クラスと許可マークアップが出る |
| 無効な属性 | infoへフォールバックし、生HTMLや任意クラスにならない |
| 信頼できないマークアップ | wp_kses_post()が許可されないマークアップを除く |
| ログアウト・特権リクエスト | 権限差を明示設計していない限り出力が一貫する |
| 管理、REST、AJAX、cron、CLI | 該当文脈で予期しない出力や副作用がない |
| テーマ切替・親テーマ更新 | サイトプラグインの挙動が残り、表示依存が記録・確認されている |
| ロールバック演習 | 担当者が合意時間内に無効化し、既知正常版を復元できる |
コマンド、期待結果、WordPress/PHPバージョン、テスト対象リビジョンを変更と一緒に保存します。ケースと期待結果のない「手動確認済み」は再現可能な証拠ではありません。
簡潔な判断・リリースチェックリスト
- [ ] 変更をテーマ表示、サイト挙動、診断コード、大きなプラグイン機能のいずれかに分類した。
- [ ] WordPress Coreや親テーマのファイルを編集していない。
- [ ] 出所、バージョン、フック契約、依存、レビュアーを記録した。
- [ ] 入力を検証またはサニタイズし、出力を正確な文脈向けにエスケープした。
- [ ] 状態変更でcapability、意図、失敗経路を確認する。
- [ ] 関数/クラス名に一意な接頭辞または名前空間を使った。
- [ ] ファイルとDBをバックアップし、非本番環境で復元を演習した。
- [ ] PHP構文、ステージング、ログ、ブラウザー経路、該当するリクエスト文脈の確認が通った。
- [ ] 有効化とロールバックのコマンドを記録し、テストした。
- [ ] コード、テスト証拠、既知正常リビジョンをバージョン管理した。
---
2019年の原エクスポート(出典アーカイブ)
アーカイブ境界:以下のコードブロック内は
out/posts/2019-04-23-use-code-snippets-to-modify-your-wordpress-site-1887/index.mdにあるpost 1887の完全な本文で、エクスポート内容の日付は2019年4月23日です。言葉遣い、綴り、大文字小文字、主張は変更せず、行末空白だけを正規化しています。これは出所資料であり、現在の推奨ではありません。
Sometimes, I found some tutorials for some wordpress problem. And it often ask you to change your functions.php or other source code.
I was wondering if there exists a method that I can pluginize those code. Actually, one can simply install a plugin to implement those modifications.
Code Sinppets
---
WordPress公式開発者資料
- WordPress Code Reference
- プラグインハンドブック:入門
- プラグインハンドブック:ヘッダー要件
- プラグインハンドブック:ベストプラクティス
- プラグインハンドブック:actionとfilter
- Common APIs Handbook:Shortcode API
- テーマハンドブック:子テーマ
- Common APIs Handbook:セキュリティ
- Common APIs Handbook:データのサニタイズ
- Common APIs Handbook:データのエスケープ
- Common APIs Handbook:nonce
- プラグインハンドブック:ユーザーcapabilityの確認
- 高度な管理ハンドブック:WordPressのデバッグ
- WP-CLI:`wp plugin activate`
- WP-CLI:`wp plugin deactivate`
- WP-CLI:`wp eval`
