web-dev-qa-db-ja.com

Meta_keyとmeta_valueと共にmeta_idを取得します。

どういうわけか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を知る必要があるということです。

3
ragulka

この関数は私のために働いた:

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
        )
)
5
harmputman

キーでpost metaを取得するためのコア関数/メソッドがわかりません。それが決定的に一つではないと言うことではありません。あるかもしれません。私はWordPressについてすべてを知っているわけではない、私はただふりをする:)または多分それはちょうど今ちょうど私の心を滑らせた。

ただし、 update_post_meta の4番目のパラメータは、複数のキーがある場合に更新したい値のみを確実に更新することです。

$ prev_value
(混合)(オプション)変更したいカスタムフィールドの古い値。これは、同じキーを持つ複数のフィールドを区別するためです。省略した場合、およびこの投稿キーとメタキーに複数の行があると、すべてのメタ値が更新されます。

その4番目のパラメータに以前に保存した値を送信してから、そのエントリだけを更新します。

delete_post_meta は同様に動作しますが、3番目のパラメータは4番目ではありません。

3
s_ha_dum

このコードを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' );
2
Anjum

基本的な考え方は、同じ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操作で十分です。

1
hakre

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()とは異なり、この実装ではメタ値のシリアル化は解除されません。
  • これらの関数は、post_id/user_id、メタキー、メタ値、またはそれらの組み合わせによってメタデータを選択することを可能にします。
0