web-dev-qa-db-fra.com

Comment récupérer efficacement plusieurs valeurs get_post_meta?

Je recherche une solution pour renvoyer plusieurs valeurs de get_post_meta ...

Actuellement, j'utilise un tableau de boîte à méta comme suit:

$meta_boxes[] = array(
'id' => 'setlist',
'title' => 'Setlist Information',
'pages' => array('post'),
'fields' => array(
    array(
        'name' => 'Setlist 1',                  // field name
        'desc' => 'Entry 1',                                    // field description, optional
        'id' => $prefix . 'setlist_1',              // field id, i.e. the meta key
        'type' => 'text',                   // text box
        'std' => '',                                            // default value, optional
        'style' => 'width: 100px',              // custom style for field, added in v3.1
    ),
            array(
        'name' => 'Setlist 2',                  
        'desc' => 'Entry 2',                                    
        'id' => $prefix . 'setlist_2',              
        'type' => 'text',                                       
        'std' => '',                                            
        'style' => 'width: 100px',              
    ),

et ainsi de suite (c.-à-d. setlist_3,4,5,6,7,8 ....)

Dans mon single.php j'ai:

<?php if ( get_post_meta( $post->ID, 'rw_setlist_1', true ) ) : echo "<li>"; echo get_post_meta( $post->ID, 'rw_setlist_1', true ); echo "</li>"; ?>
<?php endif; ?>
<?php if ( get_post_meta( $post->ID, 'rw_setlist_2', true ) ) : echo "<li>"; echo get_post_meta( $post->ID, 'rw_setlist_2', true ); echo "</li>"; ?>
 <?php endif; ?>
 <?php if ( get_post_meta( $post->ID, 'rw_setlist_3', true ) ) : echo "<li>"; echo get_post_meta( $post->ID, 'rw_setlist_3', true ); echo "</li>"; ?>
 <?php endif; ?>
 <?php if ( get_post_meta( $post->ID, 'rw_setlist_4', true ) ) : echo "<li>"; echo get_post_meta( $post->ID, 'rw_setlist_4', true ); echo "</li>"; ?>
 <?php endif; ?>
 <?php if ( get_post_meta( $post->ID, 'rw_setlist_5', true ) ) : echo "<li>"; echo get_post_meta( $post->ID, 'rw_setlist_5', true ); echo "</li>"; ?>

Les valeurs de set-list peuvent aller de 2 à 30 ...

Appelez-moi fou, mais je sens que cette méthode cause des temps de chargement inutiles et longs, n'est-ce pas? Alors, comment pourrais-je créer un script plus efficace pour cela, qui vérifierait toutes les valeurs du tableau de manière "plus simple".

5
mmaximalist

La façon dont votre code est configuré est tout simplement fausse, vous effectuez deux appels de base de données pour chaque champ personnalisé et si vous avez entre 2 et 30 champs comme celui-ci, cela signifie que vous effectuez plus de 60 appels vers la base de données, ce qui peut être effectué en un seul appel. en utilisant get_post_custom() par exemple:

$custom_fields = get_post_custom($post->ID);
for ($i = 1; $i <= 30; $i++) { 
    if(isset($custom_fields["rw_setlist_$i"])){
        echo "<li>"; 
        echo $custom_fields["rw_setlist_$i"];
    echo "</li>"; 
    }
}
5
Bainternet

Je crois que get_post_meta() (ou plus exactement, la fonction get_metadata() qu’elle appelle) récupère toutes les métadonnées d’une publication dans une requête, puis la met en cache pour les appels suivants. En ce qui concerne la verbosité de votre code, s’ils n’ont pas besoin d’être explicitement commandés, vous pouvez simplement les enregistrer sous une seule clé et les récupérer sous forme de tableau.

5
Milo