質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

入力済みカスタムフィールド値をタームとしてカスタムタクソノミーに一括登録するには?

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,467

M.Y.

score 29

前提・実現したいこと

蔵書・読書管理サイト「メディアマーカー」が来月サービス終了します。
http://mediamarker.net/news/482
自分の登録したデータはCSV形式でエクスポートできるので、これをWordPressに移行したい。
http://mediamarker.net/u/bookish/
多彩な機能(※)の全ては無理でも、現在自分が使用中の機能だけならデータベースとして再現可能ではないか、とワードプレス初心者ながら愚考しました。
※ http://mediamarker.net/help/function

試したこと

プラグイン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の豊富なパラメーターに近いか?)。
http://mediamarker.net/u/bookish/advanced
http://rocknit.net/digital/wp/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追記)通常ポストでなくカスタム投稿の場合ですが、「カスタム分類のタームはカスタムフィールドの入力値とする」やり方を書いたページが下記に作成されたのを発見。
カスタムフィールドの入力値をタームに保存する設定等

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/12/10 17:28

    現在どのように インポートしているのでしょうか? Filter hook を設定されたりしていますか?

    キャンセル

  • M.Y.

    2018/12/10 17:38

    エクスポートしたcsvデータをGoogleスプレッドシートで開き、先頭の一行の各列名を変更(例、登録日→post_date)、更にpost_typeの列を新たに挿入してから、Really Simple CSV Importerでインポートしました。フィルターフックについては無知でいま検索してみましたが、どう関係するのか、Really Simple CSV Importerではどう設定するのやら、わかりません。

    キャンセル

回答 3

+3

エクスポートしたcsvデータをGoogleスプレッドシートで開き、先頭の一行の各列名を変更(例、登録日→post_date)、更にpost_typeの列を新たに挿入してから、Really Simple CSV Importerでインポートしました。

それはどうやって? カスタムフィールド(の値)をカスタムタクソノミー(のターム)としてテーブルに入れるやり方、そこがわからないので質問したのです。

プラグインの公式情報 Really Simple CSV Importer - WordPress Plugins の 「AVAILABLE COLUMN NAMES AND VALUES:」より

tax_{taxonomy}: (string, comma separated) Any field prefixed with tax_ will be used as a custom taxonomy. Taxonomy must already exist. Entries are names or slugs of terms.

とありますので、tax_カスタムタクソノミー名 を使えば、インポート先として、カスタムタクソノミーが、指定できるようですが...

(string, comma separated)

とも書かれているので、カンマ区切りで複数指定できるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/10 18:01

    有り難うございます。そこを見落してました。
    データをインポートしてからその名に合せて後からカスタムフィールドを作成したら値が反映されたのですが、tax_{taxonomy}は順序が違って「カスタムタクソノミー(カスタム投稿タイプのカテゴリやタグなど)を登録している場合、指定が可能です」とのこと。
    https://www.moco358.com/archives/3744#i-4
    カスタムタクソノミーがカスタム投稿タイプ用なら通常の投稿ページで制作する自分には関係無いかと思ったものの、別にカスタム投稿でなくとも新規投稿の入力に利用できるみたいで。

    キャンセル

+2

「Really Simple CSV Importer」はカスタムタクソノミーにも一括代入できるはずなので、入れなおしてみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/22 12:54

    【追記に対しての回答:】
    > ソートができなくなるみたいです
    そうですね。ソートのためにカスタムフィールドを併用する必要がありますね。

    > クエリーは"?order=ASC&orderby=meta_value&meta_key=pdate"になるから、meta_keyがかぶってしまって
    自分でクエリ文字列を定義して、それを利用するための処理を書く必要があります。条件を何らかの形で組んで、pre_get_postsで受け取った条件で絞込みをします。WordPressは記事の取得にWP_Queryを使用し、pre_get_postsはそのパラメータを操作するフックになっています。WP_Queryは複数の条件や複雑なorder条件に対応するので、要件にあった挙動も多分できるでしょう。

    【WP_Queryの使い方をPHPコードにまとめた便利なコード・スニペット】
    http://notnil-creative.com/blog/archives/1288

    【WordPress4.0から使えるようになった複雑な’oderby’を使ってみる】
    https://geek-memo.com/orderby/

    そこまで組んでしまうならカスタムタクソノミーは不要です。
    ※ WordPressの規定動作として設計されている物を使うほうが維持管理がしやすいとは思ったのでカスタムタクソノミーをお勧めしました。

    キャンセル

  • 2018/12/22 14:31

    >自分でクエリ文字列を定義して、それを利用するための処理を書く
     あゝ、ハードルが高い……。
    >そこまで組んでしまうならカスタムタクソノミーは不要です。
     いえ、まだ不要にはできないみたいで。
     共著や翻訳書など著者フィールドに値の著者名が複数入る場合が問題になります。例、『指輪物語』なら、「トールキン,瀬田貞二」。カスタムフィールドではカンマ区切りの複数の値を区分せず一括で処理するのか、クエリー"?meta_key=authors&meta_value=瀬田貞二"をurlに附加しても該当アイテムを抽出してくれませんでした。複数の値を入力したそのままの形にして"meta_value=トールキン,瀬田貞二"でしか絞り込みが有効になりません。
     これは、やはりカスタム分類にしないと解決できないことなのでは。或いは、カスタムフィールドのmeta_valueでも複数の値を別々に取り扱ってそれぞれの値で絞り込み表示ができるのかもしれませんが、検索した限りではやり方が見つけられませんでした。

    キャンセル

  • 2018/12/22 14:48

    「そこまで組んでしまうなら」は「自分でクエリ文字列を定義して、それを利用するための処理を書く」に対してのコメントです。

    > やはりカスタム分類にしないと解決できないことなのでは。
    WP_Queryのmeta_query で処理すれば出来ます。
    どちらにせよクエリ文字列を制御する方法以外に複数パラメータの自由なソーティングは不可能です。

    もしくは、REST API使って全部JavaScriptで書いてしまうかですね。

    【WP REST API v2 Documentation】
    https://ja.wp-api.org/

    キャンセル

0

回答によれば、カスタムフィールドとしてインポートしてからカスタムタクソノミーに変換するのでなく、「最初からやり直す」、つまり投稿を全て削除し、先に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。

自分は通販サイトのブランドの登録について、カスタムフィールドに登録すればカスタム分類にも適用できるようにならないかと模索中。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 入力済みカスタムフィールド値をタームとしてカスタムタクソノミーに一括登録するには?