• 検索の都合で、カスタム投稿フィールドの管理には Smart Custom Fields を用いています。

    PHPプログラムからカスタム投稿フィールドの管理を行いたいと考えていますが、

    Advanced Custom Fields における update_field() や Custom Field Suite における CFS()->save のような編集用関数は存在しないのでしょうか?

    単純なカスタム投稿フィールドの書き換えは update_post_meta() を用いれば十分な場合が多いですが、
    繰り返しフィールドを用いている場合は難しく。

    (参考: WordPress でカスタムフィールドを簡単に設定できるプラグインを作成していてハマったところ – モンキーレンチ

    何か良い方法があればご協力頂けると嬉しいです。

    よろしくお願い致します。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • > Advanced Custom Fields における update_field() や Custom Field Suite における CFS()->save のような編集用関数は存在しないのでしょうか?

    無いことは無いのですが、基本的には内部で使用する想定でありきちんとドキュメントも無いので面倒だと思います…
    一応テストコードはありますので、興味があられるようでしたらご参照ください。
    https://github.com/inc2734/smart-custom-fields/blob/master/tests/test-smart-custom-fields-meta.php

    > PHPプログラムからカスタム投稿フィールドの管理を行いたいと考えていますが、

    具体的に何をされたいのかがわからなかったので、ずれた回答になってしまうかもしれませんが「カスタムフィールドを管理画面ではなくコードで管理(定義)したい」ということでしたら、そのためのフックは用意してあります。フックをとおしてカスタムフィールドを定義すれば記事編集画面にカスタムフィールドが表示されます。特に save メソッド的な物を自分で発火させる必要はありません。
    http://2inc.org/blog/2015/03/12/4670/

    トピック投稿者 sola

    (@konuma)

    Takashi Kitajima 様

    作者様直々に回答頂きありがとうございます!

    $SCFM = new Smart_Custom_Fields_Meta( get_post( $postId ) );
    $SCFM->add( 'key', 'value' );
    $SCFM->update( 'key', 'value', 'prev_value' );
    $SCFM->delete( 'key', 'value' );
    

    上記のようなコードで追加・更新・削除が出来ること確認致しました。

    ただ、キーと既存値(prev_value)が同一なものに対する操作ができず困っております。何か別のコードが必要でしょうか?
    ご教授頂けるとうれしいです。

    > 「カスタムフィールドを管理画面ではなくコードで管理(定義)したい」ということでしたら

    このような要望ではなく、フィールドの値の管理の事でした。
    (記載内容が分かりにくくすいません。)
    お気遣いありがとうございます。

    • この返信は7年、 10ヶ月前にsolaが編集しました。
    • この返信は7年、 10ヶ月前にsolaが編集しました。
    • この返信は7年、 10ヶ月前にsolaが編集しました。

    > ただ、キーと既存値(prev_value)が同一なものに対する操作ができず困っております。何か別のコードが必要でしょうか?

    すみません、「操作ができない」がどういう意味かピンときていませんので、具体的な内容か、サンプルコードか書き込み頂くことはできますか?

    あと、繰り返しについてはWordPress標準のメタデータの仕組みでは対応できないので、別途管理用のデータを保存しなければいけません。このあたりを参考にしてみてください。
    https://github.com/inc2734/smart-custom-fields/blob/master/tests/test-smart-custom-fields-meta.php#L296-L298

    トピック投稿者 sola

    (@konuma)

    Takashi Kitajima 様

    再度お返事いただきありがとうございます。

    > すみません、「操作ができない」がどういう意味かピンときていません

    表現が抽象的で申し訳ありません。
    やりたい事ですが、Smart Custom Fields の範囲に留まらず全体的な内容をご説明致します。

    ■フロー
    0. WP管理画面よりプラグイン「Custom Post Type Generator」にてカスタム投稿タイプ ‘goods’ を定義し、
     WP管理画面より Smart Custom Fields にて投稿タイプ ‘goods’ にて使用するカスタムフィールドを定義
    1. プログラム上から wp_insert_post() にてカスタム投稿 ‘goods’ を 1件 追加
    2. プログラム上から「1.」の投稿 ‘goods’ 上の Smart Custom Fields にて定義されているカスタムフィールドに対し、情報を追加・更新・削除

    ■補足
    a. 情報の追加や更新は全てのカスタムフィールドに対し一斉に行う形ではなく、
     個別の繰り返しフィールド項目を増減(追加・削除)したり、既存の個別フィールドに対し値を変更(更新)を考えています。
    b. 繰り返しになりますが、 Adovanced Custom Fields にある
     update_field()
      https://www.advancedcustomfields.com/resources/update_field/
     add_row()
      https://www.advancedcustomfields.com/resources/add_row/
     delete_row()
      https://www.advancedcustomfields.com/resources/delete_row/
     のような処理を Smart Custom Fields で行いたいと考えております。
    c. WP管理画面はサイト上のお客様がどういった情報を投稿されているのか確認したり、
     万が一の際の情報のメンテナンスが主な用途であり、
     投稿の作成やカスタムフィールド情報の追加や更新、削除は基本プログラム上から全て行うつもりでおります。

    > サンプルコードか書き込み頂くことはできますか?
    上記の説明でも不十分で、かつ必要な理由が分かれば書き込み致しますので、
    一度、ご確認頂ければ幸いです。

    > あと、繰り返しについてはWordPress標準のメタデータの仕組みでは対応できないので、別途管理用のデータを保存しなければいけません。このあたりを参考にしてみてください。
    DBテーブル「wp_postmeta」上に”smart-cf-repeat-multiple-data”という meta_key を持つレコードが存在しており、
    その値のシリアライズ文字列の作られ方について、おそらく理解する事が出来ました。ありがとうございます。

    カスタムフィールドの繰り返しフィールドを増やす際は、test-smart-custom-fields-meta.php 298行目のような処理を毎度行う必要がある認識でよろしいでしょうか?

    詳しくありがとうございます。ACFのメソッドについてはほとんど知識がないのですが、頂いたURLをざっくり見た感じだとSCFとはちょっとやり方が違うのかなと思いました。

    SCFでは特に行を増やす・減らすみたいなメソッドはなく、繰り返し用のデータがあれば繰り返しとして表示するし、なければ非繰り返しのデータとして表示するだけになっています。そういう意味では、「test-smart-custom-fields-meta.php 298行目のような処理」が行を増やすという処理ということになるのかもしれませんね。なので行を消すときはデータとそのデータの「CF_Config::PREFIX . ‘repeat-multiple-data’」を消せば良いはずです。

    トピック投稿者 sola

    (@konuma)

    Takashi Kitajima 様

    回答ありがとうございます。

    > 行を消すときはデータとそのデータの「CF_Config::PREFIX . ‘repeat-multiple-data’」を消せば良いはずです。

    こちら承知しました。

    ただ、キーと既存値(prev_value)が同一なものを区別し、編集(更新・削除)する方法が分かりかねています。
    何度もすいませんが、方法があれば教えて頂けると助かります。

    よろしくお願い致します。

    すみません、お返事遅くなりました。

    ただ、キーと既存値(prev_value)が同一なものを区別し、編集(更新・削除)する方法が分かりかねています。

    SCF_Config::PREFIX . 'repeat-multiple-data'の中に、キーごとに繰り返しの数が入っていますので、ポストされてきたデータとSCF_Config::PREFIX . 'repeat-multiple-data'を比較して編集するべきデータを導き出す…という感じでしょうか。かなり苦しい感じはしますが…。

    トピック投稿者 sola

    (@konuma)

    Takashi Kitajima 様

    お返事いただき大変ありがとうございます。

    SCF_Config::PREFIX . 'repeat-multiple-data'の中のキーごとの繰り返しの数で比較するとの事ですが、
    繰り返しの数で区別し編集(更新・削除)する方法がピンと来ておりません。
    見方があれば出来る限りで構いませんので教えて頂けませんでしょうか?

    時期的にお忙しいかと思いますので、可能な時で構いません。
    よろしくお願い致します。

    • この返信は7年、 9ヶ月前にsolaが編集しました。

    実際の更新処理をどういうふうに行われているのかがちょっとわかっていないので的外れである可能性はありますが、プログラム上から、定義したカスタムフィールドに対しデータをポストする時に「何番目のフィールドである」という情報は送信されないのですかね? Smart Custom Fields が出力するフォームじゃなくて何らかの独自フォームが存在するのかなと思っていたのですが。それとも REST API 的な感じで特定の URI にアクセスしたら更新するとかなのですかね?

    もし「何番目のフィールドである」という情報も送信されるのであれば、SCF_Config::PREFIX . 'repeat-multiple-data'にはarray( array( 'repeat-checkbox' => array( 1, 1 ) ) )のような情報が入っているはずですので(実際にvar_dump()か何かで確認されてください)、$Meta->get('repeat-checkbox')で返ってきた値に対してarray_slice()するとかでどうでしょう?

    「何番目のフィールドである」という情報が送信されないのであれば識別する情報がないということでどうしようもないので、独自処理側で情報を送信するように修正が必要なのではないでしょうか?

    トピック投稿者 sola

    (@konuma)

    Takashi Kitajima 様

    お忙しい中返事頂きありがとうございます。

    > 実際の更新処理をどういうふうに行われているのかがちょっとわかっていない

    REST API ではないですが、 WP Ajax を用いて カスタムフィールド値を JSON にて吐き出し、
    それをフロント側で jQuery にて取得しデータとフォームを表示しています。

    また、データ(行)の編集(追加・更新・削除)を上記同様 WP Ajax を用いて行うコードを作成途中でした。

    > プログラム上から、定義したカスタムフィールドに対しデータをポストする時に「何番目のフィールドである」という情報は送信されないのですかね?
    現在は未送信ですが、必要であれば処理を追加致します。

    > Smart Custom Fields が出力するフォームじゃなくて何らかの独自フォームが存在するのかなと思っていたのですが。

    こちらについてはおっしゃる通りです。

    > $Meta->get(‘repeat-checkbox’)で返ってきた値に対してarray_slice()するとかでどうでしょう?
    「何番目のフィールドである」という情報を元に特定の値が得られるかと思いますが、
    その値を個別に更新・削除するイメージが湧いておりません。
    値を何かしら更新・削除する際は、個別の値の内容の変化の有無に関わらず$Meta->get('repeat-checkbox')で得られる全ての値を全て同時に更新する必要があるという事でしょうか?

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「Smart Custom Fields で管理された項目の編集について」には新たに返信することはできません。