どうも、タカフです。
WordPress案件やっていると、「実際の表示内容はページテンプレートの方でやるからとりあえず、スラッグ名・ページタイトル・本文空文字での固定ページをさくっと挿入したいんだけどな」みたいな事ありませんでしょうか?
例えば企業サイトなんか作っている時に、
- 会社概要
- お問い合わせ
- 利用規約
あたりは結構当たり前のように作るページなので、そういう時にサクッと作りたいわけであります。
あとは開発環境で作った固定ページを本番環境にも欲しいっていう時もそういうケースがあると思います。
ということで、そんな時にサクッと空の特定固定ページを挿入するスクリプトを作りました。
ご丁寧にも親子関係にも対応してます笑
insert_page.php
require_once( 'path/to/your/wp-load.php' );
$posts_ary = [
[
'post_title' => 'お問い合わせ', // 固定ページタイトル
'post_name' => 'contact', // スラッグ名
'post_content' => '', // 空contentでいいなら空文字をセット(なくてもいい)
],
[
'post_title' => '会社概要',
'post_name' => 'company',
],
[
'post_title' => 'アクセス',
'post_name' => 'access',
'post_parent' => 'company', // 親投稿指定したい場合は親投稿のスラッグ名
],
/// 他にもあればここに配列を追加していく...
];
foreach ($posts_ary as $p) {
// 固定ページの検索はスラッグのところがnameというキーになるので検索用パラメータとして整える
// 参考URL<https://codex.wordpress.org/Template_Tags/get_posts#Get_a_post_by_its_slug>
$searchParam = [
'post_type' => 'page',
"name" => $p["post_name"],
"post_status" => 'publish',
"post_per_page" => 1,
];
// 検索して既に存在するならスキップ
$existPost = get_posts($searchParam);
if (is_array($existPost) && count($existPost) > 0) {
echo "「{$p['post_title']}」は既に存在する投稿です。" . PHP_EOL;
continue;
}
$insertPost = [
'post_type' => 'page',
'post_title' => $p["post_title"],
'post_name' => $p["post_name"],
'post_status' => 'publish',
'post_author' => 1,
'post_content' => (isset($p["post_content"])) ? $p["post_content"] : "",
];
// 親投稿の指定の有無チェック
if (!array_key_exists("post_parent", $p)) {
// 親投稿の指定がない場合はそのままデータベースに追加
$_postId = wp_insert_post($insertPost);
if ($_postId) {
echo "「{$p['post_title']}」の投稿を挿入しました。(投稿ID:{$_postId})" . PHP_EOL;
} else {
echo "「{$p['post_title']}」の投稿に失敗しました。" . PHP_EOL;
}
} else {
// 親投稿の指定がある場合は、親投稿のIDを検索する
$searchParam["name"] = $p["post_parent"];
// 検索して既に存在するならスキップ
$parentPost = get_posts($searchParam);
if (is_array($existPost) && count($existPost) > 0) {
echo "親指定の{$p["post_parent"]}の投稿が見つかりません" . PHP_EOL;
continue;
}
$parentId = $parentPost[0]->ID;
$insertPost["post_parent"] = $parentId; // 親投稿スラッグを投稿IDに変更
// 親投稿の指定がない場合はそのままデータベースに追加
$_postId = wp_insert_post($insertPost);
if ($_postId) {
echo "「{$p['post_title']}」の投稿を挿入しました。(投稿ID:{$_postId})" . PHP_EOL;
} else {
echo "「{$p['post_title']}」の投稿に失敗しました。" . PHP_EOL;
}
}
}
このスクリプトをphpから叩けば空の特定固定ページを挿入してくれます。ページが増えたなら配列を増やしてまた叩けば存在しないページだけ挿入してくれます。
よかったら活用してみてください!
現場からは以上です。