web-dev-qa-db-fra.com

Quel est l'intérêt du paramètre $ single de get_post_meta?

En regardant get_post_meta() Je dois toujours me rappeler de définir le $single param sur true. Je suppose généralement que je suis en train de définir une valeur et je m'attends à la récupérer.

Récupérer le champ méta d'un post pour un post.

  • $ post_id (int) (obligatoire) ID de publication.
  • $ key (chaîne) (Facultatif) La clé méta à récupérer. Par défaut, renvoie les données pour toutes les clés. Valeur par défaut: ''
  • $ single (bool) (Facultatif) S'il faut renvoyer une valeur unique. Valeur par défaut: false

Je sais que cela devrait exister comme une option pour une raison, mais je ne sais pas personnellement pourquoi. Quelqu'un peut-il expliquer pourquoi cela retourne une array de valeurs par défaut? C’est logique du point de vue de la compatibilité ascendante mais les choses ont-elles évolué? Ou existe-t-il des fonctionnalités de base qui exigent que ce soit ainsi pour une efficacité que je ne connais pas?.

Est-ce que l’ajout de $prev_value à update_post_meta() crée un historique en tant qu’éléments de tableau?

J'apprécierais un working exemple de quand ceci, étant défini sur false, a un sens. Cela signifie que le code que je peux tester. En plus, une réponse véritablement bien pensée et étudiée. Cela signifie que je veux des commentaires comme TLC veut des gommages.

6
jgraup

En général, stocker PHP des données sérialisées dans la base de données est une mauvaise idée. Cela peut être facilement compris si vous utilisez plusieurs paires de données clé-valeur dans une ligne de champ, c’est-à-dire que vous utilisez un tableau ou un objet avec une clé méta.

Imagerie d'une voiture comme objet. Vous pouvez définir plusieurs méta-valeurs pour décrire la voiture, par exemple color et fuel. Vous pouvez sérialiser les données et les stocker dans un seul champ méta (une seule clé méta):

$metadata = array(
    'color' => 'white',
    'fuel'  => 'diesel'
);
// as it is an array, $metadata will be serialized automatically by WordPRess
update_post_meta( 458, 'car_meta', $metadata );

Dans cet exemple, vous pouvez utiliser get_post_meta() avec le troisième paramètre défini sur false;

$carmeta = get_post_meta( 458, 'car_meta', false );
// Serialized meta is unserialized automatically by WordPress
echo $carmeta[0]['color'];
echo $carmeta[0]['fuel'];

Ou vous pouvez l'utiliser avec true, ce n'est pas une grosse différence:

$carmeta = get_post_meta( 458, 'car_meta', true );
echo $carmeta['color'];
echo $carmeta['fuel'];

Imaginez maintenant que vous voulez uniquement des voitures rouges qui fonctionnent au diesel. Vous devez obtenir toutes les voitures et leurs métadonnées à partir de la base de données, passer en boucle sur toutes les voitures, désérialiser les métadonnées et rechercher les voitures blanches au diesel. C'est vraiment mauvais.

Par contre, si vous utilisez une clé méta pour chaque métadonnée, par exemple:

$metadata = array(
    'car_color' => 'white',
    'car_fuel'  => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

alors vous pouvez obtenir ce que vous cherchez directement depuis la base de données:

$args = array(
    'meta_query' => array(
        'relation'  => 'AND',
         array(
             'key'   => 'car_color',
             'value' => 'red'
         ),
         array(
             'key'   => 'car_fuel',
             'value' => 'diesel'
         )
    )
);

$query = new WP_Query( $args );

Imaginez maintenant qu’une voiture peut être disponible en plusieurs couleurs, vous pouvez le faire:

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

Nous avons maintenant la clé méta car_colors avec un tableau sérialisé. Nous sommes confrontés aux mêmes problèmes que ceux décrits précédemment si nous voulons interroger uniquement les voitures disponibles dans une couleur. Il est donc préférable de stocker les couleurs en tant que méta-champ répéteur:

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    if( is_array( $value ) ) {
        foreach( $value as $val ) {
            // We add multiiple meta fields with the same meta key
            add_post_meta( 458, $key, $val );
        }
    } else {
        update_post_meta( 458, $key, $value );
    }
}

Maintenant, si vous voulez obtenir toutes les couleurs disponibles d'une voiture, vous avez besoin du troisième paramètre de get_post_meta() défini sur false, si vous le définissez sur true, vous n'obtiendrez que la première couleur disponible trouvée dans la base de données. voiture.

// This gets only the first car_colors entry found in database for car 458
$available_colors = get_post_meta( 458, 'car_colors', true );
// This gets all the car_colors entries for car 458
$available_colors = get_post_meta( 458, 'car_colors', false );

C'est un exemple très basique mais je pense que cela illustre un cas d'utilisation où le troisième paramètre de get_post_meta() a du sens}, donc j'espère que cela répond à votre question.

Un autre exemple pourrait être celui exposé dans une autre réponse concernant des émissions présentées plusieurs fois dans la même journée, par exemple un film au cinéma. Vous voulez que les "heures de début" soient un champ de répéteur, pas un seul avec toutes les heures de début stockées sous forme de données sérialisées.

À propos de l'autre question: L'ajout de $prev_value à update_post_meta() crée-t-il un historique en tant qu'éléments de tableau? Non. Si vous passez $prev_value à update_post_meta(), seule la ligne existante de la base de données contenant cette valeur sera mise à jour. Si $pre_value n'est pas défini, toutes les lignes de la clé méta seront mises à jour.

Enfin, si vous souhaitez supprimer toutes les couleurs disponibles d'une voiture:

delete_post_meta( 458, 'car_colors' );

Et si vous souhaitez supprimer une seule entrée avec une valeur spécifique:

delete_post_meta( 458, 'car_colors', 'white' );
11
cybmeta