web-dev-qa-db-fra.com

Récupère meta_id avec meta_key et meta_value

Est-il possible en quelque sorte de get_post_meta ou get_post_custom et de renvoyer meta_id avec le meta_value? Par exemple:

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

L'idée de base est que, comme il peut y avoir plusieurs méta-valeurs pour le même meta_key, je devrais connaître le meta_id afin de mettre à jour/supprimer de manière fiable le méta de publication.

3
ragulka

Cette fonction a fonctionné pour moi:

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

il retournera un tableau d'objets comme:

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

Je ne connais pas de fonction/méthode principale permettant de récupérer des méta-publications avec la clé. Cela ne veut pas dire qu'il n'y en a pas définitivement. Il peut y avoir. Je ne connais pas tout de WordPress, je fais juste semblant de :) Ou peut-être que ça me vient à l'esprit en ce moment.

Toutefois, le quatrième paramètre de update_post_meta est destiné à garantir que vous ne mettez à jour la valeur que vous souhaitez mettre à jour que s'il existe plusieurs clés.

$ prev_value
(mixte) (facultatif) L'ancienne valeur du champ personnalisé que vous souhaitez modifier. Ceci permet de différencier plusieurs champs avec la même clé. Si omis et qu'il y a plusieurs lignes pour cet article et cette clé méta, toutes les méta-valeurs seront mises à jour.

Vous envoyez la valeur précédemment enregistrée dans ce quatrième paramètre et seule cette entrée est mise à jour.

delete_post_meta fonctionne de la même manière, mais avec le troisième paramètre et non le quatrième.

3
s_ha_dum

ajoutez ce code dans votre 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;
}

puis appelez où vous voulez comme jamais

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

L'idée de base est que, comme il peut y avoir plusieurs méta-valeurs pour le même meta_key, je devrais connaître le meta_id afin de mettre à jour/supprimer de manière fiable le méta de publication.

Ce que vous appelez meta_id n’existe techniquement pas dans Wordpress. Il y a le post_id et c'est aussi l'identifiant de toutes les méta (dans meta sprak c'est le object_id).

En plus de cela, il y a le meta_key et, comme vous écrivez à juste titre, car il peut y avoir plus d'une valeur pour chaque meta_key sur le même object_id, il y a une ambiguïté car tout dépend de l'ordre dans lequel la base de données présente les valeurs ici - et cela seulement indirect, car les méta-valeurs ont aussi leur cache, le cache d’objets.

Ainsi, même si vous pouvez voir un meta_id dans la base de données, il ne sera plus utilisé uniquement pour avoir une clé primaire dans la base de données.

C'est not une partie du résultat de la base de données utilisé dans Wordpress PHP code utilisateur et, par conséquent, il ne fait pas partie du méta-cache et ne le fait donc jamais dans les fonctions de la méta-API ( parce qu’ils accèdent à la base de données via l’API méta-cache).

Ce qui conduit à la conclusion finale:

Lorsque vous parlez de meta_id et qu'il n'existe que dans la base de données (table dbprefix_postmeta), votre question ne peut que vouloir supprimer/mettre à jour une entrée de cette table. Les opérations SQL normales devraient suffire.

1
hakre

Il est étrange que Wordpress fournisse des fonctions pour obtenir, mettre à jour et supprimer des méta via meta_id depuis la v3.3, mais à compter de la v3.7, aucune fonction ne renvoie le méta-id. Ainsi, en utilisant les fonctions principales de meta.php comme référence, j’ai implémenté les fonctions ci-dessous pour pouvoir récupérer les identificateurs de méta avec les valeurs.

Solution

Utilisez la fonction personnalisée sous get_post_meta_db() pour obtenir les identifiants et les valeurs de la méta-clé, puis utilisez Wordpress ' update_meta() et delete_meta() pour manipuler la méta-publication.

Par exemple:

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

Voici les définitions de fonctions personnalisées:

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

Remarques:

  • Ces fonctions interrogent la base de données, utilisez donc avec parcimonie!
  • Cette implémentation suit la convention décrite dans get_metadata_by_mid(), en n'utilisant pas les préfiltres "get_post_metadata"/"get_user_metadata" et en ne mettant pas à jour le cache.
  • Dans mon cas, je n'avais besoin que des données brutes, alors contrairement à get_metadata_by_mid(), cette implémentation ne désérialise pas les méta-valeurs.
  • Ces fonctions permettent aux métadonnées d'être sélectionnées par post_id/user_id, clé méta, méta valeur ou toute combinaison de celles-ci.
0