web-dev-qa-db-ja.com

Add_post_metaとupdate_post_metaを使うとき、個々の配列にキーを与える方法はありますか?

Add_post_metaを使用してpost metaに配列を追加すると、新しいサブ配列が追加されます。それらの部分配列に名前をつける方法があるかどうか疑問に思いました。

で終わる代わりに

array([0](2,3), [1](4,5))

私はなるだろう

array ([meaningful_name](2,3),[meaningful_name2](4,5))
4
George Kendros

同じメタキーに複数のメタ値が使用されている場合、WordPressは異なるデータベース行に値を保存します。したがって、すべての配列は1行に格納されます。

初期データ

次のような配列があると仮定しましょう。

$family = [
  'father'  => [ 'John', 'Doe', 40 ],
  'mother'  => [ 'Jane', 'White', 39 ],
  'child_1' => [ 'Luke', 'Doe', 5 ]
];

各サブ配列を異なるメタ行として保存する場合、その行の唯一の識別子はmeta_idですが、実際には意味がなく、WordPress関数を使用して取得するのは困難です。

"map"アプローチ

回避策は、値/メタIDのマップを別のポストメタに保存することです。

これは、update_post_meta()add_post_meta()の両方が追加されたばかりのメタIDを返すためです。

データを保存する

そのため、次のようなことができます。

$map = [];
foreach( $family as $who => $person ) {
  // update_post_meta returns the meta ID
  $map[ $who ] = update_post_meta( $postId, 'family_member', $person );
}
// we store the map of family "role" to meta IDs in a separate meta
update_post_meta( $postId, 'family_members_map', $map );

データを取得する

値を取得するとき、例えば.

$family = get_post_meta( $postId, 'family_member' );

次のような2次元のキーなし配列を取得します。

[
  [ 'John', 'Doe', 40 ],
  [ 'Jane', 'White', 39 ],
  [ 'Luke', 'Doe', 5 ],
]

要するに、サブ配列キーを失います。

ただし、保存したマップと関数 get_post_meta_by_id を使用して、元のデータを再作成できます。

$map = get_post_meta( $postId, 'family_members_map', true );
$family = array_combine( array_keys( $map ), array_map( 'get_post_meta_by_id', $map ) );

そして、家族は元のデータと等しくなります:

[
  'father'  => [ 'John Doe', 40 ],
  'mother'  => [ 'Jane White', 39 ],
  'child_1' => [ 'Luke Doe', 5 ]
]

データを更新する

データを更新します。それほど難しくありません。

$justBorn = [ 'Anna', 'Doe', 0 ];

// current map
$map = get_post_meta( $postId, 'family_members_map', true);

// add both new sub array and new meta ID to map
$map['child_2'] = update_post_meta( $postId, 'family_member', $justBorn );

// update the map
update_post_meta( $postId, 'family_members_map', $map );

別の方法: "all in one place"アプローチ

上記のアプローチは機能しますが、最も簡単な方法ではありません。

実際には、初期連想配列全体($family配列)を保存する方が簡単です。異なるサブ配列ではなく、単一のメタです。

// store data
update_post_meta( $postId, 'family_members', $family );

// retrieve data (please note the `true` as 3rd argument)
$family = get_post_meta( $postId, 'family_members', true );

// update data
$family = get_post_meta( $postId, 'family_members', true );
$family['child_2'] = [ 'Anna', 'Doe', 0 ];
update_post_meta( $postId, 'family_members', $family );

データの保存、取得、更新は非常に簡単で、追加のオーバーヘッドはありません。

"map"アプローチの利点

ほとんどの場合、「すべて1か所」アプローチが最も便利です。

しかし、数百または数千のサブ配列がある場合、それらすべてを格納するために一意のメタ値を使用すると、データのフェッチおよび解析に使用されるメモリが非常に多くなります。異なる行と generators のような最新のPHP機能を使用すると、そのメモリ量を劇的に削減できます。

さらに、既存のデータ(古いバージョンのウェブサイトから継承される可能性があります)を扱う場合、このアプローチは古いデータを変換せずに意味のある情報を取得するのに役立ちます。

最後に、異なるDB行に格納されたより小さくより特徴付けられたサブ配列を使用して、メタクエリとメタ値のシリアル化された配列に対するLIKEを使用した投稿のクエリができます実際の信頼性がデータの構造に大きく依存している場合でも、より簡単で信頼性が高くなります。

9
gmazzap

Add_post_metaを使用するためのいくつかの可能な方法:

詳細についてはリンクをたどってください

add_post_meta($post_id, $meta_key, $meta_value, $unique);
update_post_meta($post_id, $meta_key, $meta_value, $prev_value);
$meta_values = get_post_meta( $post_id, $key, $single );



 update_post_meta($post_ID, {key}, {array of vals})

 $data = Array(
    'url' => $url,
    'name' => $name,
    'description' => $desc,
 );

 //Update inserts a new entry if it doesn't exist, updates otherwise
  update_post_meta($post_ID, 'yourkey', $data);

 //To Fetch
 $yourdata = get_post_meta($post_ID, 'yourkey');

詳細についてはCodexリンク

ありがとうございます。

0
jas