web-dev-qa-db-ja.com

フィールドタイプの高度なカスタムフィールドupdate_field:分類法

Wp_insert_postで投稿を挿入してから、適切なpost_metaを追加する必要があります - ただし、WP adminは優れたACFでカスタマイズされています。

私は add_post_meta ができることを知っています:

add_post_meta( $post_id, 'q_key_type', $q_key_type );

しかし、ACFを幸せにするためには、 " update_field "関数を使う必要があります。

update_field( "field_52c737a413e07", $q_key_type, $post_id );

このメソッドはうまくいきますが、Taxonomyオブジェクトを正しく登録することができません - add_post_metaを使用して保存する値を取得できます - 新しい投稿を表示するとTaxonomyを認識しません - 値は空ですがpostmetaテーブル値は正しく保存されています - 欠けているのは正しいフィールド認識です。

これら2つの方法を使用して、 "Text"および "User"タイプのフィールドを正しく保存できます。

これはpost_metaテーブルの2行の画像です。最初の2行はacfによって作成され、最後の2行は手動で作成されます。それらは同じ形式になっています。

enter image description here

私はpost_metaテーブルで同じフィールド名への他の参照を1つだけ見つけることができます - それは以下のデータを持つ配列を含みます - これはacfのためにセットアップされたフィールドであるようです:

Array (
    [key] => field_52c737a413e07
    [label] => Type
    [name] => q_key_type
    [type] => taxonomy
    [instructions] => 
    [required] => 0
    [taxonomy] => q_key_type
    [field_type] => select
    [allow_null] => 0
    [load_save_terms] => 1
    [return_format] => object
    [conditional_logic] => Array (
        [status] => 0
        [rules] => Array (
            [0] => Array (
                [field] => null
                [operator] => ==
                [value] => 
            )
        )
        [allorany] => all
    )
[order_no] => 3
)

問題は、ACFが分類データをどこに保存しているかということです。用語テーブルには何も表示されません。

3
Q Studio

両方のpost_metaを追加する必要があります。

add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Q Key Type

そしてACFの場合:

update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Q Key Type

そして、答えの残りはwp_set_object_termsでカバーされるべきです。

wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );

ただし、この機能は必要な時点では完全には使用できません。そのため、答えはこの機能の簡単な代替品を作成することでした。

     /**
     * simple wp_set_object_terms replacement as not available during API call
     * 
     * @since       0.4
     * @global      Object      $wpdb
     * @param       integer     $object_id
     * @param       integer     $tt_id
     * @return      Mixed       Integer of inserted row on success | Boolean false
     */
    public function q_wp_set_object_terms( $object_id = null, $tt_id = null )
    {

        if ( ! $object_id || ! $tt_id ) { return false; }

        global $wpdb; 

        if ( $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => (int)$object_id, 'term_taxonomy_id' => (int)$tt_id ) ) ) {

            return $wpdb->insert_id;

        }

        // if not ##
        return false;

    }

静的メソッドのインスタンスを使用して呼び出すことができます(私の場合はメソッドが別のクラスの一部になっているため)。

Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );
3
Q Studio

私はupdate_field()関数が実際に私のために仕事をしているのを発見しました、それが起こるようにそれが更新されたかどうか私は知りません。注意しなければならないのは、単一の選択(select)フィールドまたは複数の選択を許可するフィールドがある場合です。基本的に、複数の場合は分類IDの配列を通過する必要があります。

例では:

$field_key = 'field_xxxxxxxxxxxxxx';   //the field key of your chosen taxonomy field
$idarray = array("$termid->term_id");  //use an array to pass it multiple term IDs. Note that the term_id is in quotes, as it needs to be a string
$postid = '';                          //your post ID

update_field($field_key, $idarray, $postid);

update_field()関数はフィールド設定に基づいて自動的にシリアライズを処理するので、他に何も心配する必要はありません。

この方法を使用して、同じ投稿レコードの単一および複数の分類フィールドを更新しました。次に、ACFが推奨する方法を使用してこれらの結果をクエリできることをテストしました。 。

編集:心に留めておくべき1つのことは、引用符で囲むことによってterm_idを文字列に変換したことに気づくでしょう - ACFはIDを文字列として直列化された配列に格納します。 (そして将来wp-adminを使ってフィールドを終了しようとすると、とにかく文字列に戻ります)。

0
boboshady