wake-up-neo.com

Holen Sie sich meta_id zusammen mit meta_key und meta_value

Ist es irgendwie möglich, get_post_meta oder get_post_custom und hat meta_id zusammen mit dem meta_value zurückgegeben? Zum Beispiel:

$data = get_post_meta( $post_id, 'my_key' );
// returns this:
array( 0 => array('myvalue1', 1002 ), 1 => array( 'myvalue2', 1003 ));

Die Grundidee ist, dass ich den meta_key kennen muss, um das Post-Meta zuverlässig zu aktualisieren/löschen, da es möglicherweise mehrere Meta-Werte für denselben meta_id gibt.

3
ragulka

Diese Funktion hat bei mir funktioniert:

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;
}

es wird ein Array von Objekten zurückgeben wie:

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

Ich kenne keine Kernfunktion methode zum Abrufen von Post-Meta mit der Taste. Das soll nicht heißen, dass es definitiv keinen gibt. Es kann sein. Ich weiß nicht alles über WordPress, ich tue nur so :) Oder vielleicht ist es mir gerade durch den Kopf gegangen.

Der vierte Parameter von/- update_post_meta stellt jedoch sicher, dass Sie den zu aktualisierenden Wert nur in Fällen aktualisieren, in denen mehrere Schlüssel vorhanden sind.

$ prev_value
(gemischt) (optional) Der alte Wert des benutzerdefinierten Felds, das Sie ändern möchten. Dies dient zur Unterscheidung mehrerer Felder mit demselben Schlüssel. Wenn diese Option weggelassen wird und für diesen Beitrag und diesen Metaschlüssel mehrere Zeilen vorhanden sind, werden alle Metawerte aktualisiert.

Sie senden den zuvor gespeicherten Wert in diesem vierten Parameter und dann wird nur dieser Eintrag aktualisiert.

delete_post_meta funktioniert ähnlich, aber mit dem dritten Parameter nicht dem vierten.

3
s_ha_dum

füge diesen Code in deine functions.php ein

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;
}

und dann anrufen, wo immer Sie möchten

$meta_id = get_mid_by_key( your_post_id, 'your_meta_key' );
2
Anjum

Die Grundidee ist, dass ich den meta_key kennen muss, um das Post-Meta zuverlässig zu aktualisieren/löschen, da es möglicherweise mehrere Meta-Werte für denselben meta_id gibt.

Was Sie hier meta_id nennen, gibt es in Wordpress technisch nicht. Es gibt den post_id und das ist auch die ID für alle Metas (in meta sprak ist dies der object_id).

Daneben gibt es den meta_key und wie Sie zu Recht schreiben, gibt es Mehrdeutigkeiten, da es auf demselben meta_key mehr als einen Wert pro object_id geben kann, da alles davon abhängt, in welcher Reihenfolge die Datenbank Werte hier anzeigt - und das nur indirekt, da Meta-Werte auch ihren Cache haben, den Objekt-Cache.

Selbst wenn Sie einen meta_id in der Datenbank sehen, wird er nicht weiter verwendet, um nur einen Primärschlüssel in der Datenbank zu haben.

Es ist nicht Teil des Datenbankergebnisses, das in Wordpress PHP Userland-Code verwendet wird, und daher ist es nicht Teil des Meta-Caches und schafft es daher nie in die Meta-API-Funktionen (weil sie Zugriff auf die Datenbank über die Meta-Cache-API).

Was zur endgültigen Schlussfolgerung führt:

Wenn Sie von meta_id sprechen und dieser nur in der Datenbank (dbprefix_postmeta-Tabelle) vorhanden ist, kann Ihre Frage nur das Löschen/Aktualisieren eines Eintrags in dieser Tabelle bedeuten. Nur normale SQL-Operationen sollten ausreichen.

1
hakre

Es ist seltsam, dass Wordpress seit v3.3 Funktionen zum Abrufen, Aktualisieren und Löschen von Meta über meta_id bereitstellt. Ab v3.7 gibt es jedoch keine Funktionen, die die Meta-ID zurückgeben. Aus diesem Grund habe ich die folgenden Funktionen implementiert, um die Meta-IDs zusammen mit den Werten abzurufen.

Lösung

Verwenden Sie die benutzerdefinierte Funktion unten get_post_meta_db(), um die Meta-Schlüssel-IDs und Werte abzurufen, und verwenden Sie dann Wordpress ' update_meta() und delete_meta() , um das Post-Meta zu bearbeiten.

Zum Beispiel:

$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' );

Hier sind die benutzerdefinierten Funktionsdefinitionen:

/**
 * 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 );
}

Anmerkungen:

  • Diese Funktionen fragen die Datenbank ab, gehen Sie also sparsam vor!
  • Diese Implementierung folgt der Konvention in get_metadata_by_mid(), indem die Vorfilter "get_post_metadata"/"get_user_metadata" nicht verwendet und der Cache nicht aktualisiert wird.
  • In meinem Fall habe ich nur die Rohdaten benötigt, sodass diese Implementierung im Gegensatz zu get_metadata_by_mid() die Metawerte nicht deserialisiert.
  • Mit diesen Funktionen können Metadaten nach post_id/user_id, Metaschlüssel, Metawert oder einer beliebigen Kombination davon ausgewählt werden.
0