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.
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
)
)
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.
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' );
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 lemeta_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.
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.
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 );
}
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.get_metadata_by_mid()
, cette implémentation ne désérialise pas les méta-valeurs.