PowerShellで子テーマの「使われていないファイル・コード」を一括検索する方法
WordPressの子テーマを長く使っていると、昔入れたカスタマイズの残骸がたまってきます。「このファイル、まだどこかで使ってる?」「この関数、本体はどこにあるの?」と気になっても、ファイルを1つずつ開いて探すのは大変です。
そこで今回は、Windows標準のPowerShellだけで、フォルダ内のファイルを一括検索する方法を紹介します。子テーマの大そうじをした時に実際に使った手順です。
準備:サーバーの子テーマをPCにダウンロードする
検索はPC上のファイルに対して行います。FTPソフト(WinSCPなど)で、サーバーの子テーマフォルダを丸ごとPCにダウンロードしておきます。
整理する前のバックアップと、整理した後のファイルは別フォルダに分けておくのがポイントです。混ざると、消したはずのファイルが検索に引っかかって混乱します。
基本のコマンド
まずPowerShellを開いて、調べたいフォルダに移動します。
cd "D:\作業フォルダ\サイト一覧\サイトA\cocoon-child-master"そして、探したい文字を含むファイルを一覧表示します。
Get-ChildItem -Recurse -File | Select-String -Pattern "文字1","文字2","文字3" | Select-Object Path -Uniqueこのコマンドは3つの部品をパイプ(|)でつないでいます。
| 部品 | 意味 |
|---|---|
| Get-ChildItem -Recurse -File | 今いるフォルダ以下のファイルを、サブフォルダも含めて全部拾う |
| Select-String -Pattern “…” | その中から、指定した文字のどれかを含む行を探す(大文字小文字は区別しない) |
| Select-Object Path -Unique | 見つかったファイルの場所だけを、重複なしで表示する |
何も表示されずにプロンプトが戻ってきたら「どこにも使われていない」という意味です。
使い方1:古い広告ファイルがまだ使われているか調べる
子テーマの中に、昔作った広告用のPHPファイルがいくつも残っていました。消していいか判断するため、ファイル名で検索します。
PS D:\作業フォルダ\サイト一覧\サイトB\cocoon-child-master> Get-ChildItem -Recurse -File | Select-String -Pattern "ad-old1","ad-old2","ad-old3" | Select-Object Path -Unique
PS D:\作業フォルダ\サイト一覧\サイトB\cocoon-child-master>何も出てこなかったので、どのファイルからも読み込まれていないことが分かり、安心して削除できました。
使い方2:何行目にどう書いてあるかまで表示する
ファイル名だけでなく、中身も確認したい時は最後を変えます。
Get-ChildItem -Recurse -File -Include *.php | Select-String -Pattern "tmp/content","tmp/single-contents","tmp/entry-card" | Select-Object Path, LineNumber, Line| 変更点 | 効果 |
|---|---|
| -Include *.php | PHPファイルだけに絞る(画像などのバイナリを検索対象から外す) |
| Select-Object Path, LineNumber, Line | ファイルの場所・行番号・その行の中身を表示する |
これは、子テーマから削除したテンプレートファイル(tmp/content.php など)を、自作の固定ページテンプレートが呼んでいないかを確認した時のコマンドです。
結果、引っかかったのは整理用に新しく作ったファイルの「どこから移したか」を書いたコメント行だけでした。コメントやフック名に同じ文字が入っていることもあるので、Lineの中身まで見て判断するのが大事です。
使い方3:関数の本体がどこにあるか探す
functions.php に、こんな1行だけが残っていました。
add_shortcode("getCategoryArticle", "getCatItems");ショートコードの登録だけがあって、呼び出し先の getCatItems という関数が見当たりません。子テーマ全体を検索します。
Get-ChildItem -Recurse -File -Include *.php | Select-String -Pattern "getCatItems" | Select-Object Path, LineNumber, Line出てきたのは functions.php の登録の1行だけ。つまり関数の本体はどこにも無く、登録だけが残っている状態でした。
ちなみにWordPressは、関数が存在しないショートコードを見つけてもエラーにはせず、[getCategoryArticle] の文字をそのまま表示するだけです。投稿一覧・固定ページ一覧で「getCategoryArticle」を検索して0件だったので、この1行は削除しました。
使い方4:全サイトのバックアップから横断検索する
「この関数、元々はどこで使っていたんだろう?」と気になったので、全サイトのバックアップが入っているフォルダで検索してみました。
cd "D:\作業フォルダ\サイト一覧"
Get-ChildItem -Recurse -File -Include *.php | Select-String -Pattern "function getCatItems" | Select-Object Path, LineNumber結果はこうなりました。
Path LineNumber
---- ----------
D:\作業フォルダ\サイト一覧\サイトC\simplicity2-child\functions.php 43
D:\作業フォルダ\サイト一覧\サイトD\simplicity2-child\functions.php 43
D:\作業フォルダ\サイト一覧\サイトE\child\functions.php 11Cocoonの前身であるSimplicity2時代の子テーマに、本体が残っていました。当時の functions.php を別サイトにコピーしていくうちに、登録の1行だけが引き継がれていたようです。
発掘した元のコードはこれです。
// 一覧記事取得関数
// "num" = 表示記事数, "cat" = カテゴリ番号
// 呼び出し元での指定も可能 -> [getCategoryArticle num="x" cat="y"]
function getCatItems($atts, $content = null) {
extract(shortcode_atts(array(
"num" => '2',
"cat" => '12'
), $atts));
// 処理中のpost変数をoldpost変数に退避
global $post;
$oldpost = $post;
// カテゴリーの記事データ取得
$myposts = get_posts('numberposts='.$num.'&order=DESC&orderby=post_date&category='.$cat);
if($myposts) {
$retHtml = '<div class="getPostDispArea">';
foreach($myposts as $post) :
$retHtml .= '<div class="getPost">';
setup_postdata($post);
if ( has_post_thumbnail() ) {
$retHtml .= '<div class="getPostImgArea">' . get_the_post_thumbnail($page->ID, 'thumbnail') . '</div>';
}
$retHtml .= '<div class="getPostStringArea">';
$retHtml .= '<h4 class="getPostTitle">';
$retHtml .= '<a href="' . get_permalink() . '">' . the_title("","",false) . '</a>';
$retHtml .= '</h4>';
$retHtml .= '<div class="getPostContent">' . get_the_excerpt() . '</div>';
$retHtml .= '</div></div>';
endforeach;
$retHtml .= '</div>';
} else {
$retHtml = '<p>記事がありません。</p>';
}
// oldpost変数をpost変数に戻す
$post = $oldpost;
return $retHtml;
}
add_shortcode("getCategoryArticle", "getCatItems");記事の中に [getCategoryArticle num=”5″ cat=”12″] と書くと、指定カテゴリの新着記事をサムネイル付きで並べる、というショートコードでした。
ただし今のWordPressで使うには、存在しない変数($page)を参照していたり、後片付けの wp_reset_postdata() が無かったりと問題があります。Cocoonなら標準の で同じことができるので、復活させる必要はありませんでした。
使う時の注意点
| 注意点 | 対処 |
|---|---|
| フォルダが大きいと時間がかかる | 最後に「PS …>」のプロンプトが戻るまで待つ。止めたい時は Ctrl + C |
| 画像などのファイルまで検索して遅くなる | -Include *.php,*.css,*.js のように種類を絞る |
| functions.php だけ探したい | -Include functions.php でファイル名を指定する |
| コメントにも同じ文字が引っかかる | Path, LineNumber, Line で中身まで表示して判断する |
| 記事本文や設定の中身は探せない | データベースに入っているものは、管理画面の検索で別途確認する |
まとめ
PowerShellの Get-ChildItem と Select-String を組み合わせるだけで、特別なソフトを入れなくても子テーマの中身を一括検索できます。
- 消していいか迷うファイルは、ファイル名で検索して「どこからも呼ばれていないか」を確認
- 本体が見当たらない関数は、関数名で検索して「残骸かどうか」を確認
- 全サイトのバックアップを横断検索すれば、昔のコードの出どころも分かる
何も表示されない=どこにも使われていない。この一点を覚えておくだけで、子テーマの大そうじがかなり安心して進められます。






コメント