親カテゴリーとは
親カテゴリーとはカテゴリーのカテゴリーである。ただのカテゴリーなんで、要するに親や子などの機能は既にある。
仮に 「A -> B」を A カテゴリーが B カテゴリーの親であるとし、
- A -> B
- B -> C
のとき、C は A の孫カテゴリーであるという。A は祖父カテゴリーなどはいわないか。(笑) こうなると家系図と同様にツリー状に構造をつくることが出来る。
目的
カテゴリーを分類したい
記事をカテゴリーで分類したいように、カテゴリーをカテゴリーで分類したいこともある。例えば、
- 3P
- 4P
- 5P
- ハーレム
は全て乱交である。そしてカテゴリーページをつくるとき
乱交 |
---|
3P |
4P |
5P |
ハーレム |
と列挙したいこともある。このとき、もし
- 乱交 -> 3P
- 乱交 -> 4P
- 乱交 -> 5P
- 乱交 -> ハーレム
と親カテゴリーを設定していると
<?php $data=get_category_by_slug("乱交"); $args=array( "child_of" => $data->term_id; ) $res=get_categories($args); foreach($res as $category){ //処理 } ?>
という感じで書ける。他のやり方もあるかもしれない。筆者は最初、タクソノミーというものを使わないとカテゴリーの分類は出来ないと思い、必死にコードを書いて記事も書いたのだが、普通にカテゴリーのみで出来ることに気づいて無駄な苦労した。(笑) まあもっと良いやり方もあるかもしれないが、これは王道だと思う。
構想
もっと合理的に
ではいかに親カテゴリーを追加するか。まずは Google 先生に訊いてみよう!😀
参考サイト : https://www.javadrive.jp/wordpress/category/index5.html
どうやらダッシュボードからちまちまと追加できるらしい。しかしもっとバーっと入れたくないだろうか?複雑なツリー構造をつくるには、ある程度のデータが必要だと思うので、効率的に入れたい。
CSVファイルから読み込む
もし CSVファイルから読み込めたら、他のプログラムなどで CSVファイルをつくって読み込めそうである。もちろんやり方は色々あるだろうが、今回は CSVファイルを読み込みたい。つまりCSVファイルを読み込むためのページをつくる。
親カテゴリーを追加する
CSVファイルを読み込んだら、親カテゴリーを追加する。wordpress には便利な関数があるので簡単に実装できる。具体的には wp_update_term を使う。これは update なんでカテゴリーを追加しないと使えない。それは wp_insert_term を使う。本当は wp_create_category という関数もあるのだが、どうも僕の環境では使えなかったので、今回はこちらでやる。つまり
- カテゴリーがなかったら wp_insert_term
- wp_update_term
となる。
実際に
では実際にコードを書いていく。しかし普通のエディタでは PHPコードは書けないようになっている。なので今回はPHPファイルを読み込む関数をつくり、そのショートコードを登録する。そしたらエディタからショートコードでファイルを読み込める。
ショートコードでPHPファイルを読み込む
では早速!
function loadExternalPHP($args) { //$fileに引数をセット extract(shortcode_atts(array('file' => 'nothing.php'), $args)); //外部PHPを実行 //require ABSPATH . "extra/" . "$file"; $url=realpath(STYLESHEETPATH . "/$file"); if(!$url) return; require $url; } add_shortcode( 'loadPHP', 'loadExternalPHP' );
参考サイト : https://mat0401.info/blog/php-in-wp-article/
参考サイトでは
require ABSPATH . "extra/" . "$file";
となっているが、
$url=realpath(STYLESHEETPATH . "/$file"); if(!$url) return; require $url;
としてみた。 これは STYLESEETPATH がテーマのディレクトリのパスで、基本的にテーマ内のディレクトリで書く方が良いのですが、テーマ内にファイルを追加すると変な挙動でダメだったので、 ../<my theme>/<fname> と別テーマにアクセスするため realpath を使いました。なんで基本的に既に在るテーマのディレクトリには、ファイルを入れない方が良いと思います。
これをコピペ、コピペ、……
これで、もし ../mytheme/xxx.php を読み込みたいなら
[loadPHP file="../mytheme/xxx.php"]
で読み込める。
CSVから親カテゴリーを追加する関数
次は CSV データから親カテゴリーを追加する。まず CSV データは
カテゴリー | 親カテゴリー |
とする。そしてコード!
function get_or_create_category($name){ $data=get_category_by_slug($name); if(is_wp_error($data)) return null; if(!$data){ $res=wp_insert_term($name,"category"); if(is_wp_error($res)) return null; return $res["term_id"]; } //echo "XXX".$name." ".json_encode($res->errors,_UNESCAPED_UNICODE); return $data->term_id; } function insert_parent_by_csv($fname){ if (($handle = fopen($fname, "r")) == FALSE) return false; // 1行ずつfgetcsv()関数を使って読み込む $row=0; while (($data = fgetcsv($handle))) { $name=$data[0]; $parent_name=get_or_create_category($data[1]); $data=get_category_by_slug($name); if(!$data||is_wp_error($data)) continue; $name_id=$data->term_id; wp_update_term($name_id,"category",array("parent" => $parent_name)); sleep(0.5); echo "Appended ${name} : ${parent_name}<br>"; } fclose($handle); }
関数名 | 機能 |
---|---|
get_or_create_category | カテゴリーがなければ追加し、そして返す |
insert_parent_by_csv | CSVを読み込みカテゴリーの親を追加または更新する |
このコードを functions.php に貼る。多分、関数はfunctions.php に貼った方が良いと思います。
この関数はカテゴリーがない場合はとばす。記事のないカテゴリーをつくっても仕方ないと思うので。追加したいときは insert_parent_by_csv 内 8行目の
$data=get_category_by_slug($name);
を
$data=get_or_create_category($name);
に変えれば良いです。
ページをつくる
では実際にページをつくる。以下コード
<?php //function x(){}; if(array_key_exists("csvfile",$_FILES)){ $csvfile=$_FILES["csvfile"]; //echo "csvfile ${csvfile}"; $fname=$csvfile["tmp_name"]; echo "csvfile : ".json_encode($csvfile); insert_parent_by_csv($fname); } $INPUT_HTML= <<<HTML <p> name,slug,taxonomy_name<br> :<br> :<br> :<br> </p> <form action="" method="post" enctype="multipart/form-data"> <label>CSV : </label> <input name="csvfile" type="file"></input> <input type="submit" name="submit" value="送信"></input> </form> HTML; echo $INPUT_HTML; ?>
デザインはないです。機能派なんで。(笑) CSVファイルを投稿し、insert_parent_by_csv に渡します。そして例えば、 今のテーマから見て ../mytheme/insert_parent_category.php に追加したなら、新しい固定ページを開き
[loadPHP file="../mytheme/insert_parent_category.php"]
と書けば完成です!(他人に追加されると困るので非公開にしてください)
試してみる
では実際に試してみましょう!まずはデータを用意。
カテゴリー | 親カテゴリー |
---|---|
M4 | 戦車 |
T34 | 戦車 |
Tiger | 戦車 |
a.csv
投稿前 (戦車はありません)
投稿!
確認
上手くいってます。
おわり
お疲れさまでした。
コメント