どういうわけかget_post_meta
またはget_post_custom
を実行して、meta_idをmeta_value
と共に返すことはできますか?例えば:
$data = get_post_meta( $post_id, 'my_key' );
// returns this:
array( 0 => array('myvalue1', 1002 ), 1 => array( 'myvalue2', 1003 ));
基本的な考え方は、同じmeta_key
に対して複数のmeta_valuesが存在する可能性があるので、post metaを確実に更新/削除するためにはmeta_id
を知る必要があるということです。
この関数は私のために働いた:
function get_complete_meta( $post_id, $meta_key ) {
global $wpdb;
$mid = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $meta_key) );
if( $mid != '' )
return $mid;
return false;
}
次のようなオブジェクトの配列を返します。
Array
(
[0] => stdClass Object
(
[meta_id] => 1002
[post_id] => 1
[meta_key] => my_key
[meta_value] => my_value
)
[1] => stdClass Object
(
[meta_id] => 1003
[post_id] => 668
[meta_key] => my_key
[meta_value] => another value
)
)
キーでpost metaを取得するためのコア関数/メソッドがわかりません。それが決定的に一つではないと言うことではありません。あるかもしれません。私はWordPressについてすべてを知っているわけではない、私はただふりをする:)または多分それはちょうど今ちょうど私の心を滑らせた。
ただし、 update_post_meta
の4番目のパラメータは、複数のキーがある場合に更新したい値のみを確実に更新することです。
$ prev_value
(混合)(オプション)変更したいカスタムフィールドの古い値。これは、同じキーを持つ複数のフィールドを区別するためです。省略した場合、およびこの投稿キーとメタキーに複数の行があると、すべてのメタ値が更新されます。
その4番目のパラメータに以前に保存した値を送信してから、そのエントリだけを更新します。
delete_post_meta
は同様に動作しますが、3番目のパラメータは4番目ではありません。
このコードをfunctions.phpに追加してください。
function get_mid_by_key( $post_id, $meta_key ) {
global $wpdb;
$mid = $wpdb->get_var( $wpdb->prepare("SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $meta_key) );
if( $mid != '' )
return (int) $mid;
return false;
}
それからあなたが好きな場所に電話をかける
$meta_id = get_mid_by_key( your_post_id, 'your_meta_key' );
基本的な考え方は、同じ
meta_key
に対して複数のmeta_valuesがある可能性があるので、確実にpost metaを更新/削除するためにはmeta_id
を知る必要があるでしょう。
ここでmeta_id
と呼ぶことを技術的にはWordpressにはありません。 post_id
があり、それはすべてのメタのIDでもあります(メタsprakではこれはobject_id
です)。
その隣にはmeta_key
がありますが、正しいmeta_key
の各object_id
ごとに複数の値がある可能性があるので、データベースがここに値を表示する順序がすべてであるため、あいまいさがありますメタ値にもキャッシュ、つまりオブジェクトキャッシュがあるため、間接的なものにすぎません。
そのため、データベース内にmeta_id
が表示されていても、db内に主キーを持つためだけには使用されません。
WordPress PHPユーザーランドコード内で使用されているのはデータベース結果のnot部分であり、メタキャッシュの一部ではないため、メタAPI関数に変換されることはありません(メタキャッシュAPIを介してデータベースにアクセスするためです。
これが最終的な結論につながります。
meta_id
について話し、それがデータベース(dbprefix_postmeta
テーブル)にしか存在しない場合、あなたの質問はそのテーブルのエントリを削除/更新することを意味するだけです。通常のSQL操作で十分です。
Wordpressがv3.3以降、meta_idを介してmetaを取得、更新、削除する関数を提供しているのは奇妙ですが、v3.7以降はmeta idを返す関数を持っていません。そのため、meta.phpのコア関数を参照として使用して、値と共にメタIDを取得できるように、以下の関数を実装しました。
メタキーのIDと値を取得するにはget_post_meta_db()
の下のカスタム関数を使用し、それからpost metaを操作するにはWordpressの update_meta()
と delete_meta()
を使用します。
例えば:
$meta = get_post_meta_db( $post_id, 'my_key', true ); // Returns array(
// 'post_id' => 5,
// 'meta_id' = 33,
// 'meta_key' => 'my_key',
// 'meta_value' => 'the_value_for_my_key' );
update_meta( $meta['meta_id'], $meta['meta_key'], 'new_value' );
これがカスタム関数の定義です。
/**
* Alternative to get_post_meta(), to retrieve meta_ids. @see get_meta_db()
*/
function get_post_meta_db( $post_id, $meta_key = null, $single = false, $meta_val = null, $output = OBJECT ){
return get_meta_db( 'post', $post_id, $meta_key, $meta_val, $single, $output );
}
/**
* Alternative to get_metadata(). Differences:
* - returns every meta field (instead of only meta_values)
* - bypasses meta filters/actions
* - queries database, bypassing cache
* - returns raw meta_values (instead of unserializing arrays)
*
* @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)
* @param int $object_id ID of the object metadata is for
* @param string $meta_key Optional. Metadata key to retrieve. By default, returns all metadata for specified object.
* @param mixed $meta_val Optional. If specified, will only return rows with this meta_value.
* @param bool $single Optional. If true, returns single row, else returns array of rows.
* @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. @see wpdb::get_results()
*
* @return array Single metadata row, array of rows, empty array if no matches, or false if there was an error.
*/
function get_meta_db( $meta_type, $object_id = null, $meta_key = null, $meta_val = null, $single = false, $output = OBJECT ){
if( !$meta_type || !$table = _get_meta_table( $meta_type ) )
return false;
// Build query
global $wpdb;
$query = $wpdb->prepare( "SELECT * FROM $table", $object_id );
// Add passed conditions to query
$where = array();
if( $object_id = absint( $object_id ) )
$where[] = $wpdb->prepare( sanitize_key( $meta_type.'_id' ).' = %d', $object_id );
if( !empty($meta_key) )
$where[] = $wpdb->prepare( 'meta_key = %s', wp_unslash( $meta_key ) );
if( null !== $meta_val )
$where[] = $wpdb->prepare( 'meta_value = %s', maybe_serialize(wp_unslash($meta_val)));
if( !empty($where) )
$query .= ' WHERE '.implode(' AND ', $where );
if( $single )
$query .= ' LIMIT 1';
$rows = $wpdb->get_results( $query, $output );
if( empty( $rows ) )
return ( $single ? null : array() );
/*
Uncomment this section to have this function unserialize values (like get_metadata())
NOTE: This can be implemented more efficiently using array_map
// Unserialize serialized meta_values
foreach( $rows as &$r ){
$v =& ($output==ARRAY_A ? $r['meta_value'] : $output==ARRAY_N ? $r[3] : $r->meta_value );
$v = maybe_unserialize( $v );
} */
return ( $single ? reset( $rows ) : $rows );
}
"get_post_metadata"
/"get_user_metadata"
プレフィルタを使用せず、キャッシュを更新しないことで、get_metadata_by_mid()
に見られる規約に従います。get_metadata_by_mid()
とは異なり、この実装ではメタ値のシリアル化は解除されません。