親カテゴリーを追加する

親カテゴリーとは

親カテゴリーとはカテゴリーのカテゴリーである。ただのカテゴリーなんで、要するに親や子などの機能は既にある。

仮に 「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

投稿前 (戦車はありません)

投稿!

確認

 

上手くいってます。

おわり

お疲れさまでした。

コメント

タイトルとURLをコピーしました