質問: ### 前提・実現したいこと 蔵書・読書管理サイト「メディアマーカー」が来月サービス終了します。 自分の登録したデータはCSV形式でエクスポートできるので、これをWordPressに移行したい。 http://mediamarker.net/u/bookish/ 多彩な機能(※)の全ては無理でも、現在自分が使用中の機能だけならデータベースとして再現可能ではないか、とワードプレス初心者ながら愚考しました。 ※ ### 試したこと プラグインReally Simple CSV Importerでインポートはできました。 出力項目は以下の通り。 タイトル リンクURL アマゾンID(アフィリエイトID) ※リンクURLにアマゾンIDを含める場合 イメージ画像URL(小) イメージ画像URL(中) カテゴリ ジャンル 著者 出版社(発売元) 出版日(発売日) ISBN/JAN ※ISBN番号またはJANコード 例) 9784862761002など 定価 アマゾン価格 ASIN(アマゾン商品コード) ※10桁の英数字。例) B000COQC9C、475691084X など 登録日 更新日 タグ コメント 評価 0:評価なし、1~5まで ウィッシュ 1:アイコンあり 所有 1:アイコンあり お気に入り 購入日 購入金額 状態 読了日 公開・非公開 0:公開、1:非公開 以上27項目のうち、「タイトル」「登録日」「カテゴリー」「タグ」「コメント」(記事本文)以外は、WordPressではカスタムフィールドになります。 各種キーによるソートとキーを組み合せた絞り込み検索が、ブクログ等のウェブ本棚サービスの中でメディアマーカーならではの長所でしたので、カスタムフィールドの活用は必須です(プラグインList category postsの豊富なパラメーターに近いか?)。 特に「著者」「出版社」はメディアマーカーのウェブページではリンク表示され、クリックすると同じ著者・同じ出版社の一覧が表示されます。つまりブログのタグ同様ですが、既に「タグ」は別項目として登録済なので、Wordpressではカスタムタクソノミーとして扱ったら良いかと。 そこで、カスタムフィールド値をタームとしてカスタムタクソノミーに一括登録する方法が知りたく、質問する次第です。 カスタムフィールドはプラグインAdvanced Custom Fieldsにて、カスタムタクソノミーはCustom Post Type UIにて作成できましたが、既に投稿にインポートされたフィールドの入力値をタクソノミーへ移すか紐づけるかするやり方が、どうにも解りません。 Yahoo!知恵袋に類似の問題で良いプラグインはないかとの質問がありましたが、WP Taxonomy Importでは駄目みたいで、まともな回答もありませんでした。プラグイン無しでphpプログラムを組むのでも(あまりに難解でなければ)結構です。 Cf. タクソノミーのタームにカスタムフィールドの値をcsv一括で登録したい また、共著や翻訳書など「著者」が複数ある本の場合は一つの欄内にカンマ区切りで入力してあるのですが、これをどう処理すればよいかも問題になります。 御教示戴ければ幸甚です。 追記 -- 回答によれば、カスタムフィールドとしてインポートしてからカスタムタクソノミーに変換するのでなく、「最初からやり直す」、つまり投稿を全て削除し、先にWordPressの方でカスタムタクソノミーとして「著者」「出版社」を登録してからCSVデータをインポートし直せとのことでした。 さてその場合、別の問題が生じます。 再現したかったMediaMarkerの機能では「登録日、更新日、ランク、タイトル、読了日、購入日、著者、出版社、ユーザー数、出版日で並べ替え可」でした(ユーザー数は不要)。 メディアマーカー - 機能一覧 しかし「著者」「出版社」をカスタム分類とした場合、このソートができなくなるみたいです。カスタムフィールドによるソートの方法は検索すれば幾らも出てくる一方で、カスタムタクソノミーの場合は絞り込み(フィルタリング)の方法は紹介が多いけどorderbyで排列順序を変更する方法が見つからない。そもそも「著者」みたいにコンマ区切りで複数の値が入ったタクソノミーだとどの値でその投稿の順序を決めればよいやら、カスタムフィールドみたいに`orderby=meta_value&meta_key=authors`とかやっても順列が指示できないわけなのかと察せられます。 著者名・出版社名をクリックすると同じ著者・同じ出版社のアイテム一覧が表示される仕組みにするにはカスタムタクソノミーにする方がいいかと思ってのことでしたが、では、この絞り込み機能をカスタムフィールドのまま実現させればカスタムタクソノミーに変換せずとも済むのでは? WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する それをやるとURLでのクエリーは`?meta_key=authors&meta_value=著者名`となりますが、このカスタムフィールドの値による絞り込み結果を更に「並べ替え」したい時、困ります。ソート順序にカスタムフィールドを使用する場合、例として出版日(pdate)ならクエリーは`?order=ASC&orderby=meta_value&meta_key=pdate`になるから、meta_keyがかぶってしまって、全投稿のソートにはなっても先の抽出結果のソートにならないのです。クエリーでのパラメーターmeta_keyの重複衝突の問題は、逆に全投稿を指定したソート順序のままカスタムフィールド値で絞り込みしたい時にも、起きるはず。あちらを立てればこちらが立たず、です。 ならば、元のCSVで「著者」の列をコピーしておいて、カスタムフィールドとカスタムタクソノミーのそれぞれにインポートし、どちらも並立させる手でどうか? ちょっと無駄な重複みたいですけど......。まあ既存の登録をインポートする分にはそれでも済むかしれませんが、今後投稿を新規作成する際に難儀です。編集入力欄に「著者」が二つできるし、しかもそれが不一致になるミスに気をつけなければならない。できればそんな手間を省き、一度入力すればカスタムフィールド「著者」とカスタムタクソノミー「著者」の双方に値が入る感じの設定が望ましい。 結局、カスタムフィールドの入力値をタクソノミーへ移すか紐づけるかするやり方が、求められます。逆方向で、或るカスタムタクソノミー(のターム)を或るカスタムフィールド(の値)へ、でもいいわけですけども、とにかくどうにかして両者を連動させる方法は、ありませんか。 (2019-01-20追記)通常ポストでなくカスタム投稿の場合ですが、「カスタム分類のタームはカスタムフィールドの入力値とする」やり方を書いたページが下記に作成されたのを発見。 カスタムフィールドの入力値をタームに保存する設定等
回答: > > 回答によれば、カスタムフィールドとしてインポートしてからカスタムタクソノミーに変換するのでなく、「最初からやり直す」、つまり投稿を全て削除し、先にWordPressの方でカスタムタクソノミーとして「著者」「出版社」を登録してからCSVデータをインポートし直せとのことでした。 > > > 投稿の数によりけりじゃないですかね。 カスタム分類だけとりあえず問題にすると、 とりあえず、出版社と著者の一覧をつくる(データベースでいうところの正規化?)。 wp_termテーブルにそれぞれの一覧を書き込む(SQLとか)。term_idと名前の紐付け。 出版社と著者それぞれのカスタム分類設定する。wp_term_taxonomyテーブルでterm_idとカスタム分類を紐づけ。それぞれにterm_taxonomy_idが設定される。 最後にwp_term_relationshipテーブルで、term_taxonomy_idと投稿id(たぶんobject_idだったような)を紐づける。 ちなみにカスタムフィールドはwp_postmetaテーブルに保存される。 具体的なコードは素人なので書けません。 カスタムフィールドについてはwordpressのコーデックスのadd_meta_box。 分類の登録についてはwp_set_object_terms。 保存についてはsave_post。 自分は通販サイトのブランドの登録について、カスタムフィールドに登録すればカスタム分類にも適用できるようにならないかと模索中。