web-dev-qa-db-de.com

Wie kann ich mehrere get_post_meta-Werte effizient abrufen?

Ich suche nach einer Lösung für die Rückgabe mehrerer get_post_meta-Werte ...

Derzeit verwende ich ein Meta-Box-Array wie folgt:

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

usw. usw. (d. h. setlist_3,4,5,6,7,8 ....)

In meiner single.php habe ich:

<?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>"; ?>

Die Set-List-Werte können zwischen 2 und 30 liegen.

Nenn mich verrückt, aber ich habe das Gefühl, dass diese Methode unnötige und lange Ladezeiten verursacht, oder? Wie würde ich also vorgehen, um ein effizienteres Skript zu erstellen, das alle Werte im Array auf "einfachere Weise" überprüft?.

5
mmaximalist

Die Art und Weise, wie Ihr Code eingerichtet ist, ist einfach falsch. Sie führen zwei Datenbankaufrufe für jedes benutzerdefinierte Feld durch. Wenn Sie zwischen 2 und 30 Felder haben, bedeutet dies, dass Sie über 60 Aufrufe an die Datenbank tätigen, die mit einem einzigen Aufruf ausgeführt werden können mit get_post_custom() zum Beispiel:

$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

Ich glaube, dass get_post_meta() (oder genauer gesagt die Funktion get_metadata(), die sie aufruft) alle Metadaten für einen Beitrag in einer Abfrage abruft und sie dann für nachfolgende Aufrufe zwischenspeichert. Wenn die Ausführlichkeit Ihres Codes nicht explizit bestellt werden muss, können Sie sie einfach unter einem einzigen Schlüssel speichern und als Array abrufen.

5
Milo